CloverBootloader/rEFIt_UEFI/Platform/Posix/stdio.cpp

73 lines
1.9 KiB
C++
Raw Normal View History

#include "stdio.h"
#include "stdarg.h"
#include <Library/printf_lite.h>
extern "C" {
2020-04-04 15:50:13 +02:00
# include <Library/UefiLib.h>
# include <Library/PrintLib.h>
// UINTN
// EFIAPI
// AsciiSPrint (
// OUT CHAR8 *StartOfBuffer,
// IN UINTN BufferSize,
// IN CONST CHAR8 *FormatString,
// ...
// );
}
#include "../../cpp_foundation/XString.h"
2020-03-28 07:36:07 +01:00
static XString8 stdio_static_buf = XString8().takeValueFrom("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX "); // prealloc stdio_static_buf. It has to be at least 2 chars because of 'while ( n > size - 2 )' in strguid and strerror
// = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX "_XS8 won't work because allocatedSize() will stay 0
static XStringW stdio_static_wbuf;
int vprintf(const char* format, VA_LIST va)
{
2020-03-28 07:36:07 +01:00
// AsciiPrint seems no to work with utf8 chars. We have to use Print instead
stdio_static_wbuf.vSWPrintf(format, va);
2020-03-28 07:36:07 +01:00
int ret = (int)Print(L"%s", stdio_static_wbuf.wc_str());
return ret;
}
int printf(const char* format, ...)
{
va_list va;
va_start (va, format);
int ret = vprintf(format, va);
va_end(va);
return ret;
}
2020-03-26 13:59:20 +01:00
const char* strerror(EFI_STATUS Status)
{
size_t size = stdio_static_buf.allocatedSize();
UINTN n = 0;
2020-05-10 08:49:46 +02:00
n = AsciiSPrint(stdio_static_buf.dataSized(size), size, "%r", Status);
while ( n > size - 2 )
{
size += 10;
n = AsciiSPrint(stdio_static_buf.dataSized(size), size, "%r", Status);
}
2020-04-23 15:20:48 +02:00
return stdio_static_buf.s();
}
//this function print guid in LittleEndian format while we need BigEndian as Apple do
2020-03-26 13:59:20 +01:00
const char* strguid(EFI_GUID* guid)
{
size_t size = stdio_static_buf.allocatedSize();
UINTN n = 0;
n = AsciiSPrint(stdio_static_buf.dataSized(size), size, "%g", guid);
while ( n > size - 2 )
{
size += 10;
n = AsciiSPrint(stdio_static_buf.dataSized(size), size, "%g", guid);
}
2020-04-23 15:20:48 +02:00
return stdio_static_buf.s();
}