Files
Sylva/efi/lib/va_print.c
T

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;
}