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 + -
显示快捷键?