print.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 737 行 · 第 1/2 页
C
737 行
case '5':
case '6':
case '7':
case '8':
case '9':
Count = 0;
do {
Count = (Count * 10) + *Format - '0';
Format++;
} while ((*Format >= '0') && (*Format <= '9'));
Format--;
*Width = Count;
break;
default:
Done = TRUE;
}
}
return Format;
}
static CHAR8 mHexStr[] = { '0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F' };
STATIC
UINTN
ValueTomHexStr (
IN OUT CHAR8 *Buffer,
IN UINT64 Value,
IN UINTN Flags,
IN UINTN Width
)
/*++
Routine Description:
AvSPrint worker function that prints a Value as a hex number in Buffer
Arguments:
Buffer - Location to place ascii hex string of Value.
Value - Hex value to convert to a string in Buffer.
Flags - Flags to use in printing Hex string, see file header for details.
Width - Width of hex value.
Returns:
Number of characters printed.
--*/
{
CHAR8 TempBuffer[30];
CHAR8 *TempStr;
CHAR8 Prefix;
CHAR8 *BufferPtr;
UINTN Count;
UINTN Index;
TempStr = TempBuffer;
BufferPtr = Buffer;
//
// Count starts at one since we will null terminate. Each iteration of the
// loop picks off one nibble. Oh yea TempStr ends up backwards
//
Count = 0;
do {
*(TempStr++) = mHexStr[Value & 0x0f];
Value = RShiftU64 (Value, 4);
Count++;
} while (Value != 0);
if (Flags & PREFIX_ZERO) {
Prefix = '0';
} else if (!(Flags & LEFT_JUSTIFY)) {
Prefix = ' ';
} else {
Prefix = 0x00;
}
for (Index = Count; Index < Width; Index++) {
*(TempStr++) = Prefix;
}
//
// Reverse temp string into Buffer.
//
while (TempStr != TempBuffer) {
*(BufferPtr++) = *(--TempStr);
}
*BufferPtr = 0;
return Index;
}
STATIC
UINTN
ValueToString (
IN OUT CHAR8 *Buffer,
IN INT64 Value,
IN UINTN Flags,
IN UINTN Width
)
/*++
Routine Description:
AvSPrint worker function that prints a Value as a decimal number in Buffer
Arguments:
Buffer - Location to place ascii decimal number string of Value.
Value - Decimal value to convert to a string in Buffer.
Flags - Flags to use in printing decimal string, see file header for details.
Width - Width of hex value.
Returns:
Number of characters printed.
--*/
{
CHAR8 TempBuffer[30];
CHAR8 *TempStr;
CHAR8 *BufferPtr;
UINTN Count;
UINTN Remainder;
TempStr = TempBuffer;
BufferPtr = Buffer;
Count = 0;
if (Value < 0) {
*(BufferPtr++) = '-';
Value = -Value;
Count++;
}
do {
Value = (INT64)DivU64x32 ((UINT64)Value, 10, &Remainder);
*(TempStr++) = (CHAR8)(Remainder + '0');
Count++;
if ((Flags & COMMA_TYPE) == COMMA_TYPE) {
if (Count % 3 == 0) {
*(TempStr++) = ',';
}
}
} while (Value != 0);
//
// Reverse temp string into Buffer.
//
while (TempStr != TempBuffer) {
*(BufferPtr++) = *(--TempStr);
}
*BufferPtr = 0;
return Count;
}
STATIC
UINTN
GuidToString (
IN EFI_GUID *Guid,
IN CHAR8 *Buffer,
IN UINTN BufferSize
)
/*++
Routine Description:
AvSPrint worker function that prints an EFI_GUID.
Arguments:
Guid - Pointer to GUID to print.
Buffer - Buffe to print Guid into.
BufferSize - Size of Buffer.
Returns:
Number of characters printed.
--*/
{
UINTN Size;
Size = ASPrint (
Buffer,
BufferSize,
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
(UINTN)Guid->Data1,
(UINTN)Guid->Data2,
(UINTN)Guid->Data3,
(UINTN)Guid->Data4[0],
(UINTN)Guid->Data4[1],
(UINTN)Guid->Data4[2],
(UINTN)Guid->Data4[3],
(UINTN)Guid->Data4[4],
(UINTN)Guid->Data4[5],
(UINTN)Guid->Data4[6],
(UINTN)Guid->Data4[7]
);
//
// ASPrint will null terminate the string. The -1 skips the null
//
return Size - 1;
}
STATIC
UINTN
TimeToString (
IN EFI_TIME *Time,
OUT CHAR8 *Buffer,
IN UINTN BufferSize
)
/*++
Routine Description:
AvSPrint worker function that prints EFI_TIME.
Arguments:
Time - Pointer to EFI_TIME sturcture to print.
Buffer - Buffer to print Time into.
BufferSize - Size of Buffer.
Returns:
Number of characters printed.
--*/
{
UINTN Size;
Size = ASPrint (
Buffer,
BufferSize,
"%02d/%02d/%04d %02d:%02d",
(UINTN)Time->Month,
(UINTN)Time->Day,
(UINTN)Time->Year,
(UINTN)Time->Hour,
(UINTN)Time->Minute
);
//
// ASPrint will null terminate the string. The -1 skips the null
//
return Size - 1;
}
STATIC
UINTN
EfiStatusToString (
IN EFI_STATUS Status,
OUT CHAR8 *Buffer,
IN UINTN BufferSize
)
/*++
Routine Description:
AvSPrint worker function that prints EFI_STATUS as a string. If string is
not known a hex value will be printed.
Arguments:
Status - EFI_STATUS sturcture to print.
Buffer - Buffer to print EFI_STATUS message string into.
BufferSize - Size of Buffer.
Returns:
Number of characters printed.
--*/
{
UINTN Size;
CHAR8 *Desc;
if (Status == EFI_SUCCESS) {
Desc = "Success";
} else if (Status == EFI_LOAD_ERROR) {
Desc = "Load Error";
} else if (Status == EFI_INVALID_PARAMETER) {
Desc = "Invalid Parameter";
} else if (Status == EFI_UNSUPPORTED) {
Desc = "Unsupported";
} else if (Status == EFI_BAD_BUFFER_SIZE) {
Desc = "Bad Buffer Size";
} else if (Status == EFI_BUFFER_TOO_SMALL) {
Desc = "Buffer Too Small";
} else if (Status == EFI_NOT_READY) {
Desc = "Not Ready";
} else if (Status == EFI_DEVICE_ERROR) {
Desc = "Device Error";
} else if (Status == EFI_WRITE_PROTECTED) {
Desc = "Write Protected";
} else if (Status == EFI_OUT_OF_RESOURCES) {
Desc = "Out of Resources";
} else if (Status == EFI_VOLUME_CORRUPTED) {
Desc = "Volume Corrupt";
} else if (Status == EFI_VOLUME_FULL) {
Desc = "Volume Full";
} else if (Status == EFI_NO_MEDIA) {
Desc = "No Media";
} else if (Status == EFI_MEDIA_CHANGED) {
Desc = "Media changed";
} else if (Status == EFI_NOT_FOUND) {
Desc = "Not Found";
} else if (Status == EFI_ACCESS_DENIED) {
Desc = "Access Denied";
} else if (Status == EFI_NO_RESPONSE) {
Desc = "No Response";
} else if (Status == EFI_NO_MAPPING) {
Desc = "No mapping";
} else if (Status == EFI_TIMEOUT) {
Desc = "Time out";
} else if (Status == EFI_NOT_STARTED) {
Desc = "Not started";
} else if (Status == EFI_ALREADY_STARTED) {
Desc = "Already started";
} else if (Status == EFI_ABORTED) {
Desc = "Aborted";
} else if (Status == EFI_ICMP_ERROR) {
Desc = "ICMP Error";
} else if (Status == EFI_TFTP_ERROR) {
Desc = "TFTP Error";
} else if (Status == EFI_PROTOCOL_ERROR) {
Desc = "Protocol Error";
} else if (Status == EFI_WARN_UNKNOWN_GLYPH) {
Desc = "Warning Unknown Glyph";
} else if (Status == EFI_WARN_DELETE_FAILURE) {
Desc = "Warning Delete Failure";
} else if (Status == EFI_WARN_WRITE_FAILURE) {
Desc = "Warning Write Failure";
} else if (Status == EFI_WARN_BUFFER_TOO_SMALL) {
Desc = "Warning Buffer Too Small";
} else {
Desc = NULL;
}
//
// If we found a match, copy the message to the user's buffer. Otherwise
// sprint the hex status code to their buffer.
//
if (Desc != NULL) {
Size = ASPrint (Buffer, BufferSize, "%a", Desc);
} else {
Size = ASPrint (Buffer, BufferSize, "%X", Status);
}
return Size - 1;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?