228 lines
4.8 KiB
C
228 lines
4.8 KiB
C
|
|
#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;
|
|
}
|