[chore] Use gnu-efi as a part of project
This commit is contained in:
@@ -0,0 +1,227 @@
|
||||
|
||||
#include "lib.h"
|
||||
#include "internal/print.h"
|
||||
#include "internal/va_print.h"
|
||||
|
||||
VOID
|
||||
CALL_CONV
|
||||
FUNCTION_NAME(_PoolCatPrint) (
|
||||
IN CONST CHAR16 *fmt,
|
||||
IN VA_LIST args,
|
||||
IN OUT POOL_PRINT *spc,
|
||||
IN INTN (EFIAPI *Output)(VOID *context, CHAR16 *str)
|
||||
)
|
||||
// Dispatch function for UnicodeSPrint, PoolPrint, and CatPrint
|
||||
{
|
||||
FUNCTION_NAME(PRINT_STATE) ps;
|
||||
|
||||
ZeroMem (&ps, sizeof(ps));
|
||||
ps.Output = Output;
|
||||
ps.Context = spc;
|
||||
ps.fmt.pw = fmt;
|
||||
VA_COPY(ps.args, args);
|
||||
FUNCTION_NAME(_Print) (&ps);
|
||||
VA_END(ps.args);
|
||||
}
|
||||
|
||||
UINTN
|
||||
CALL_CONV
|
||||
FUNCTION_NAME(UnicodeVSPrint) (
|
||||
OUT CHAR16 *Str,
|
||||
IN UINTN StrSize,
|
||||
IN CONST CHAR16 *fmt,
|
||||
VA_LIST args
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Prints a formatted unicode string to a buffer using a VA_LIST
|
||||
|
||||
Arguments:
|
||||
|
||||
Str - Output buffer to print the formatted string into
|
||||
|
||||
StrSize - Size of Str (in bytes). String is truncated to this size.
|
||||
A size of 0 means there is no limit
|
||||
|
||||
fmt - The format string
|
||||
|
||||
args - VA_LIST
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
String length returned in buffer
|
||||
|
||||
--*/
|
||||
{
|
||||
POOL_PRINT spc;
|
||||
|
||||
spc.str = Str;
|
||||
spc.maxlen = StrSize / sizeof(CHAR16) - 1;
|
||||
spc.len = 0;
|
||||
|
||||
FUNCTION_NAME(_PoolCatPrint) (fmt, args, &spc, _SPrint);
|
||||
|
||||
return spc.len;
|
||||
}
|
||||
|
||||
CHAR16 *
|
||||
CALL_CONV
|
||||
FUNCTION_NAME(VPoolPrint) (
|
||||
IN CONST CHAR16 *fmt,
|
||||
VA_LIST args
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Prints a formatted unicode string to allocated pool using VA_LIST argument.
|
||||
The caller must free the resulting buffer.
|
||||
|
||||
Arguments:
|
||||
|
||||
fmt - The format string
|
||||
args - The arguments in VA_LIST form
|
||||
|
||||
Returns:
|
||||
|
||||
Allocated buffer with the formatted string printed in it.
|
||||
The caller must free the allocated buffer. The buffer
|
||||
allocation is not packed.
|
||||
|
||||
--*/
|
||||
{
|
||||
POOL_PRINT spc;
|
||||
ZeroMem (&spc, sizeof(spc));
|
||||
FUNCTION_NAME(_PoolCatPrint) (fmt, args, &spc, _PoolPrint);
|
||||
return spc.str;
|
||||
}
|
||||
|
||||
UINTN
|
||||
CALL_CONV
|
||||
FUNCTION_NAME(VPrint) (
|
||||
IN CONST CHAR16 *fmt,
|
||||
VA_LIST args
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Prints a formatted unicode string to the default console using a VA_LIST
|
||||
|
||||
Arguments:
|
||||
|
||||
fmt - Format string
|
||||
args - VA_LIST
|
||||
Returns:
|
||||
|
||||
Length of string printed to the console
|
||||
|
||||
--*/
|
||||
{
|
||||
return FUNCTION_NAME(_IPrint) ((UINTN) -1, (UINTN) -1, ST->ConOut, fmt, NULL, args);
|
||||
}
|
||||
|
||||
UINTN
|
||||
CALL_CONV
|
||||
FUNCTION_NAME(_IPrint) (
|
||||
IN UINTN Column,
|
||||
IN UINTN Row,
|
||||
IN SIMPLE_TEXT_OUTPUT_INTERFACE *Out,
|
||||
IN CONST CHAR16 *fmt,
|
||||
IN CONST CHAR8 *fmta,
|
||||
IN VA_LIST args
|
||||
)
|
||||
// Display string worker for: Print, PrintAt, IPrint, IPrintAt
|
||||
{
|
||||
FUNCTION_NAME(PRINT_STATE) ps;
|
||||
UINTN back;
|
||||
|
||||
ZeroMem (&ps, sizeof(ps));
|
||||
ps.Context = Out;
|
||||
ps.Output = (INTN (EFIAPI *)(VOID *, CHAR16 *)) Out->OutputString;
|
||||
ps.SetAttr = (INTN (EFIAPI *)(VOID *, UINTN)) Out->SetAttribute;
|
||||
ps.Attr = Out->Mode->Attribute;
|
||||
|
||||
back = (ps.Attr >> 4) & 0xF;
|
||||
ps.AttrNorm = EFI_TEXT_ATTR(EFI_LIGHTGRAY, back);
|
||||
ps.AttrHighlight = EFI_TEXT_ATTR(EFI_WHITE, back);
|
||||
ps.AttrError = EFI_TEXT_ATTR(EFI_YELLOW, back);
|
||||
|
||||
if (fmt) {
|
||||
ps.fmt.pw = fmt;
|
||||
} else {
|
||||
ps.fmt.Ascii = TRUE;
|
||||
ps.fmt.pc = fmta;
|
||||
}
|
||||
|
||||
VA_COPY(ps.args, args);
|
||||
|
||||
if (Column != (UINTN) -1) {
|
||||
uefi_call_wrapper(Out->SetCursorPosition, 3, Out, Column, Row);
|
||||
}
|
||||
|
||||
back = FUNCTION_NAME(_Print) (&ps);
|
||||
VA_END(ps.args);
|
||||
return back;
|
||||
}
|
||||
|
||||
UINTN
|
||||
CALL_CONV
|
||||
FUNCTION_NAME(AsciiVSPrint) (
|
||||
OUT CHAR8 *Str,
|
||||
IN UINTN StrSize,
|
||||
IN CONST CHAR8 *fmt,
|
||||
VA_LIST args
|
||||
)
|
||||
/*++
|
||||
|
||||
Routine Description:
|
||||
|
||||
Prints a formatted ascii string to a buffer using a VA_LIST
|
||||
|
||||
Arguments:
|
||||
|
||||
Str - Output buffer to print the formatted string into
|
||||
|
||||
StrSize - Size of Str (in bytes). String is truncated to this size.
|
||||
A size of 0 means there is no limit
|
||||
|
||||
fmt - The format string
|
||||
|
||||
args - VA_LIST
|
||||
|
||||
|
||||
Returns:
|
||||
|
||||
String length returned in buffer
|
||||
|
||||
--*/
|
||||
// Use FUNCTION_NAME(UnicodeVSPrint)() and convert back to ASCII
|
||||
{
|
||||
CHAR16 *UnicodeStr, *UnicodeFmt;
|
||||
UINTN i, Len;
|
||||
|
||||
UnicodeStr = AllocatePool(StrSize * sizeof(CHAR16));
|
||||
if (!UnicodeStr)
|
||||
return 0;
|
||||
|
||||
UnicodeFmt = PoolPrint(u"%a", fmt);
|
||||
if (!UnicodeFmt) {
|
||||
FreePool(UnicodeStr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Len = FUNCTION_NAME(UnicodeVSPrint)(UnicodeStr, StrSize * sizeof(CHAR16), UnicodeFmt, args);
|
||||
FreePool(UnicodeFmt);
|
||||
|
||||
// The strings are ASCII so just do a plain Unicode conversion
|
||||
for (i = 0; i < Len; i++)
|
||||
Str[i] = (CHAR8)UnicodeStr[i];
|
||||
Str[Len] = 0;
|
||||
FreePool(UnicodeStr);
|
||||
|
||||
return Len;
|
||||
}
|
||||
Reference in New Issue
Block a user