/** @file | |
Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very | |
simple implemenation of SPrint() and Print() to support debug. | |
You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a | |
time. This makes the implementation very simple. | |
VSPrint, Print, SPrint format specification has the follwoing form | |
%type | |
type: | |
'S','s' - argument is an Unicode string | |
'c' - argument is an ascii character | |
'%' - Print a % | |
Copyright (c) 2004 - 2007, Intel Corporation | |
All rights reserved. This program and the accompanying materials | |
are licensed and made available under the terms and conditions of the BSD License | |
which accompanies this distribution. The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#include "Setup.h" | |
/** | |
VSPrint worker function that prints a Value as a decimal number in Buffer. | |
@param Buffer Location to place ascii decimal number string of Value. | |
@param Flags Flags to use in printing decimal string, see file header for | |
details. | |
@param Value Decimal value to convert to a string in Buffer. | |
@return Number of characters printed. | |
**/ | |
UINTN | |
ValueToString ( | |
IN OUT CHAR16 *Buffer, | |
IN BOOLEAN Flags, | |
IN INT64 Value | |
); | |
/** | |
The internal function prints to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL | |
protocol instance. | |
@param Column The position of the output string. | |
@param Row The position of the output string. | |
@param Out The EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance. | |
@param Fmt The format string. | |
@param Args The additional argument for the variables in the format string. | |
@return Number of Unicode character printed. | |
**/ | |
UINTN | |
PrintInternal ( | |
IN UINTN Column, | |
IN UINTN Row, | |
IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Out, | |
IN CHAR16 *Fmt, | |
IN VA_LIST Args | |
) | |
{ | |
CHAR16 *Buffer; | |
CHAR16 *BackupBuffer; | |
UINTN Index; | |
UINTN PreviousIndex; | |
UINTN Count; | |
// | |
// For now, allocate an arbitrarily long buffer | |
// | |
Buffer = AllocateZeroPool (0x10000); | |
BackupBuffer = AllocateZeroPool (0x10000); | |
ASSERT (Buffer); | |
ASSERT (BackupBuffer); | |
if (Column != (UINTN) -1) { | |
Out->SetCursorPosition (Out, Column, Row); | |
} | |
UnicodeVSPrint (Buffer, 0x10000, Fmt, Args); | |
Out->Mode->Attribute = Out->Mode->Attribute & 0x7f; | |
Out->SetAttribute (Out, Out->Mode->Attribute); | |
Index = 0; | |
PreviousIndex = 0; | |
Count = 0; | |
do { | |
for (; (Buffer[Index] != NARROW_CHAR) && (Buffer[Index] != WIDE_CHAR) && (Buffer[Index] != 0); Index++) { | |
BackupBuffer[Index] = Buffer[Index]; | |
} | |
if (Buffer[Index] == 0) { | |
break; | |
} | |
// | |
// Null-terminate the temporary string | |
// | |
BackupBuffer[Index] = 0; | |
// | |
// Print this out, we are about to switch widths | |
// | |
Out->OutputString (Out, &BackupBuffer[PreviousIndex]); | |
Count += StrLen (&BackupBuffer[PreviousIndex]); | |
// | |
// Preserve the current index + 1, since this is where we will start printing from next | |
// | |
PreviousIndex = Index + 1; | |
// | |
// We are at a narrow or wide character directive. Set attributes and strip it and print it | |
// | |
if (Buffer[Index] == NARROW_CHAR) { | |
// | |
// Preserve bits 0 - 6 and zero out the rest | |
// | |
Out->Mode->Attribute = Out->Mode->Attribute & 0x7f; | |
Out->SetAttribute (Out, Out->Mode->Attribute); | |
} else { | |
// | |
// Must be wide, set bit 7 ON | |
// | |
Out->Mode->Attribute = Out->Mode->Attribute | EFI_WIDE_ATTRIBUTE; | |
Out->SetAttribute (Out, Out->Mode->Attribute); | |
} | |
Index++; | |
} while (Buffer[Index] != 0); | |
// | |
// We hit the end of the string - print it | |
// | |
Out->OutputString (Out, &BackupBuffer[PreviousIndex]); | |
Count += StrLen (&BackupBuffer[PreviousIndex]); | |
FreePool (Buffer); | |
FreePool (BackupBuffer); | |
return Count; | |
} | |
/** | |
Prints a formatted unicode string to the default console. | |
@param Fmt Format string | |
@param ... Variable argument list for format string. | |
@return Length of string printed to the console. | |
**/ | |
UINTN | |
ConsolePrint ( | |
IN CHAR16 *Fmt, | |
... | |
) | |
{ | |
VA_LIST Args; | |
VA_START (Args, Fmt); | |
return PrintInternal ((UINTN) -1, (UINTN) -1, gST->ConOut, Fmt, Args); | |
} | |
/** | |
Prints a unicode string to the default console, | |
using L"%s" format. | |
@param String String pointer. | |
@return Length of string printed to the console | |
**/ | |
UINTN | |
PrintString ( | |
IN CHAR16 *String | |
) | |
{ | |
return ConsolePrint (L"%s", String); | |
} | |
/** | |
Prints a chracter to the default console, | |
using L"%c" format. | |
@param Character Character to print. | |
@return Length of string printed to the console. | |
**/ | |
UINTN | |
PrintChar ( | |
CHAR16 Character | |
) | |
{ | |
return ConsolePrint (L"%c", Character); | |
} | |
/** | |
Prints a formatted unicode string to the default console, at | |
the supplied cursor position. | |
@param Column The cursor position to print the string at. | |
@param Row The cursor position to print the string at. | |
@param Fmt Format string. | |
@param ... Variable argument list for format string. | |
@return Length of string printed to the console | |
**/ | |
UINTN | |
PrintAt ( | |
IN UINTN Column, | |
IN UINTN Row, | |
IN CHAR16 *Fmt, | |
... | |
) | |
{ | |
VA_LIST Args; | |
VA_START (Args, Fmt); | |
return PrintInternal (Column, Row, gST->ConOut, Fmt, Args); | |
} | |
/** | |
Prints a unicode string to the default console, at | |
the supplied cursor position, using L"%s" format. | |
@param Column The cursor position to print the string at. | |
@param Row The cursor position to print the string at | |
@param String String pointer. | |
@return Length of string printed to the console | |
**/ | |
UINTN | |
PrintStringAt ( | |
IN UINTN Column, | |
IN UINTN Row, | |
IN CHAR16 *String | |
) | |
{ | |
return PrintAt (Column, Row, L"%s", String); | |
} | |
/** | |
Prints a chracter to the default console, at | |
the supplied cursor position, using L"%c" format. | |
@param Column The cursor position to print the string at. | |
@param Row The cursor position to print the string at. | |
@param Character Character to print. | |
@return Length of string printed to the console. | |
**/ | |
UINTN | |
PrintCharAt ( | |
IN UINTN Column, | |
IN UINTN Row, | |
CHAR16 Character | |
) | |
{ | |
return PrintAt (Column, Row, L"%c", Character); | |
} | |
/** | |
VSPrint worker function that prints a Value as a decimal number in Buffer. | |
@param Buffer Location to place ascii decimal number string of Value. | |
@param Flags Flags to use in printing decimal string, see file header for | |
details. | |
@param Value Decimal value to convert to a string in Buffer. | |
@return Number of characters printed. | |
**/ | |
UINTN | |
ValueToString ( | |
IN OUT CHAR16 *Buffer, | |
IN BOOLEAN Flags, | |
IN INT64 Value | |
) | |
{ | |
CHAR16 TempBuffer[30]; | |
CHAR16 *TempStr; | |
CHAR16 *BufferPtr; | |
UINTN Count; | |
UINTN NumberCount; | |
UINT32 Remainder; | |
BOOLEAN Negative; | |
Negative = FALSE; | |
TempStr = TempBuffer; | |
BufferPtr = Buffer; | |
Count = 0; | |
NumberCount = 0; | |
if (Value < 0) { | |
Negative = TRUE; | |
Value = -Value; | |
} | |
do { | |
Value = (INT64) DivU64x32Remainder ((UINT64) Value, 10, &Remainder); | |
*(TempStr++) = (CHAR16) (Remainder + '0'); | |
Count++; | |
NumberCount++; | |
if ((Flags & COMMA_TYPE) == COMMA_TYPE) { | |
if (NumberCount % 3 == 0 && Value != 0) { | |
*(TempStr++) = ','; | |
Count++; | |
} | |
} | |
} while (Value != 0); | |
if (Negative) { | |
*(BufferPtr++) = '-'; | |
Count++; | |
} | |
// | |
// Reverse temp string into Buffer. | |
// | |
while (TempStr != TempBuffer) { | |
*(BufferPtr++) = *(--TempStr); | |
} | |
*BufferPtr = 0; | |
return Count; | |
} |