mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-27 01:03:45 +01:00 
			
		
		
		
	git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1676 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			675 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			675 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*++
 | |
| 
 | |
| Copyright (c)  2004-2006 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.
 | |
| 
 | |
| 
 | |
| Module Name:
 | |
| 
 | |
|   PrintLib.c
 | |
| 
 | |
| Abstract:
 | |
| 
 | |
|   Print Library.
 | |
| 
 | |
| --*/
 | |
| 
 | |
| #include <Common/UefiBaseTypes.h>
 | |
| #include <Library/PrintLib.h>
 | |
| 
 | |
| #include "CommonLib.h"
 | |
| #include "PrintLibInternal.h"
 | |
| 
 | |
| typedef struct {
 | |
|   RETURN_STATUS  Status;
 | |
|   CHAR8          *String;
 | |
| } STATUS_LOOKUP_TABLE_ENTRY;
 | |
| 
 | |
| static CONST STATUS_LOOKUP_TABLE_ENTRY  StatusString[] = {
 | |
|   { RETURN_SUCCESS,               "Success" },
 | |
|   { RETURN_LOAD_ERROR,            "Load Error" },
 | |
|   { RETURN_INVALID_PARAMETER,     "Invalid Parameter" },
 | |
|   { RETURN_UNSUPPORTED,           "Unsupported" },
 | |
|   { RETURN_BAD_BUFFER_SIZE,       "Bad Buffer Size" },
 | |
|   { RETURN_BUFFER_TOO_SMALL,      "Buffer Too Small" },
 | |
|   { RETURN_NOT_READY,             "Not Ready" },
 | |
|   { RETURN_DEVICE_ERROR,          "Device Error" },
 | |
|   { RETURN_WRITE_PROTECTED,       "Write Protected" },
 | |
|   { RETURN_OUT_OF_RESOURCES,      "Out of Resources" },
 | |
|   { RETURN_VOLUME_CORRUPTED,      "Volume Corrupt" },
 | |
|   { RETURN_VOLUME_FULL,           "Volume Full" },
 | |
|   { RETURN_NO_MEDIA,              "No Media" },
 | |
|   { RETURN_MEDIA_CHANGED,         "Media changed" },
 | |
|   { RETURN_NOT_FOUND,             "Not Found" },
 | |
|   { RETURN_ACCESS_DENIED,         "Access Denied" },
 | |
|   { RETURN_NO_RESPONSE,           "No Response" },
 | |
|   { RETURN_NO_MAPPING,            "No mapping" },
 | |
|   { RETURN_TIMEOUT,               "Time out" },
 | |
|   { RETURN_NOT_STARTED,           "Not started" },
 | |
|   { RETURN_ALREADY_STARTED,       "Already started" },
 | |
|   { RETURN_ABORTED,               "Aborted" },
 | |
|   { RETURN_ICMP_ERROR,            "ICMP Error" },
 | |
|   { RETURN_TFTP_ERROR,            "TFTP Error" },
 | |
|   { RETURN_PROTOCOL_ERROR,        "Protocol Error" },
 | |
|   { RETURN_WARN_UNKNOWN_GLYPH,    "Warning Unknown Glyph" },
 | |
|   { RETURN_WARN_DELETE_FAILURE,   "Warning Delete Failure" },
 | |
|   { RETURN_WARN_WRITE_FAILURE,    "Warning Write Failure" },
 | |
|   { RETURN_WARN_BUFFER_TOO_SMALL, "Warning Buffer Too Small" },
 | |
|   { 0,                              NULL                     }
 | |
| };
 | |
| 
 | |
| 
 | |
| /**
 | |
|   VSPrint function to process format and place the results in Buffer. Since a
 | |
|   VA_LIST is used this rountine allows the nesting of Vararg routines. Thus
 | |
|   this is the main print working routine
 | |
| 
 | |
|   @param  StartOfBuffer Unicode buffer to print the results of the parsing of Format into.
 | |
| 
 | |
|   @param  BufferSize Maximum number of characters to put into buffer. Zero means
 | |
|   no limit.
 | |
| 
 | |
|   @param  Flags Intial flags value.  Can only have FORMAT_UNICODE and OUTPUT_UNICODE set
 | |
| 
 | |
|   @param  FormatString Unicode format string see file header for more details.
 | |
| 
 | |
|   @param  Marker Vararg list consumed by processing Format.
 | |
| 
 | |
|   @return Number of characters printed.
 | |
| 
 | |
| **/
 | |
| UINTN
 | |
| BasePrintLibVSPrint (
 | |
|   OUT CHAR8        *Buffer,
 | |
|   IN  UINTN        BufferSize,
 | |
|   IN  UINTN        Flags,
 | |
|   IN  CONST CHAR8  *Format,
 | |
|   IN  VA_LIST      Marker
 | |
|   )
 | |
| {
 | |
|   CHAR8           *OriginalBuffer;
 | |
|   CHAR8           ValueBuffer[MAXIMUM_VALUE_CHARACTERS];
 | |
|   UINTN           BytesPerOutputCharacter;
 | |
|   UINTN           BytesPerFormatCharacter;
 | |
|   UINTN           FormatMask;
 | |
|   UINTN           FormatCharacter;
 | |
|   UINTN           Width;
 | |
|   UINTN           Precision;
 | |
|   INT64           Value;
 | |
|   CHAR8           *ArgumentString;
 | |
|   UINTN           Character;
 | |
|   GUID            *TmpGuid;
 | |
|   TIME            *TmpTime;
 | |
|   UINTN           Count;
 | |
|   UINTN           ArgumentMask;
 | |
|   INTN            BytesPerArgumentCharacter;
 | |
|   UINTN           ArgumentCharacter;
 | |
|   BOOLEAN         Done;
 | |
|   UINTN           Index;
 | |
|   CHAR8           Prefix;
 | |
|   BOOLEAN         ZeroPad;
 | |
|   BOOLEAN         Comma;
 | |
|   UINTN           Digits;
 | |
|   UINTN           Radix;
 | |
|   RETURN_STATUS   Status;
 | |
| 
 | |
|   OriginalBuffer = Buffer;
 | |
| 
 | |
|   if ((Flags & OUTPUT_UNICODE) != 0) {
 | |
|     BytesPerOutputCharacter = 2;
 | |
|   } else {
 | |
|     BytesPerOutputCharacter = 1;
 | |
|   }
 | |
|   if ((Flags & FORMAT_UNICODE) != 0) {
 | |
|     BytesPerFormatCharacter = 2;
 | |
|     FormatMask = 0xffff;
 | |
|   } else {
 | |
|     BytesPerFormatCharacter = 1;
 | |
|     FormatMask = 0xff;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Reserve space for the Null terminator.
 | |
|   // If BufferSize is 0, this will set BufferSize to the max unsigned value
 | |
|   //
 | |
|   BufferSize--;
 | |
| 
 | |
|   //
 | |
|   // Get the first character from the format string
 | |
|   //
 | |
|   FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;
 | |
| 
 | |
|   //
 | |
|   // Loop until the end of the format string is reached or the output buffer is full
 | |
|   //
 | |
|   while (FormatCharacter != 0 && BufferSize > 0) {
 | |
|     //
 | |
|     // Clear all the flag bits except those that may have been passed in
 | |
|     //
 | |
|     Flags &= (OUTPUT_UNICODE | FORMAT_UNICODE);
 | |
| 
 | |
|     //
 | |
|     // Set the default width to zero, and the default precision to 1
 | |
|     //
 | |
|     Width     = 0;
 | |
|     Precision = 1;
 | |
|     Prefix    = 0;
 | |
|     Comma     = FALSE;
 | |
|     ZeroPad   = FALSE;
 | |
|     Count     = 0;
 | |
|     Digits    = 0;
 | |
| 
 | |
|     switch (FormatCharacter) {
 | |
|     case '%':
 | |
|       //
 | |
|       // Parse Flags and Width
 | |
|       //
 | |
|       for (Done = FALSE; !Done; ) {
 | |
|         Format += BytesPerFormatCharacter;
 | |
|         FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;
 | |
|         switch (FormatCharacter) {
 | |
|         case '.':
 | |
|           Flags |= PRECISION;
 | |
|           break;
 | |
|         case '-':
 | |
|           Flags |= LEFT_JUSTIFY;
 | |
|           break;
 | |
|         case '+':
 | |
|           Flags |= PREFIX_SIGN;
 | |
|           break;
 | |
|         case ' ':
 | |
|           Flags |= PREFIX_BLANK;
 | |
|           break;
 | |
|         case ',':
 | |
|           Flags |= COMMA_TYPE;
 | |
|           break;
 | |
|         case 'L':
 | |
|         case 'l':
 | |
|           Flags |= LONG_TYPE;
 | |
|           break;
 | |
|         case '*':
 | |
|           if ((Flags & PRECISION) == 0) {
 | |
|             Flags |= PAD_TO_WIDTH;
 | |
|             Width = VA_ARG (Marker, UINTN);
 | |
|           } else {
 | |
|             Precision = VA_ARG (Marker, UINTN);
 | |
|           }
 | |
|           break;
 | |
|         case '0':
 | |
|           if ((Flags & PRECISION) == 0) {
 | |
|             Flags |= PREFIX_ZERO;
 | |
|           }
 | |
|         case '1':
 | |
|         case '2':
 | |
|         case '3':
 | |
|         case '4':
 | |
|         case '5':
 | |
|         case '6':
 | |
|         case '7':
 | |
|         case '8':
 | |
|         case '9':
 | |
|           for (Count = 0; ((FormatCharacter >= '0') &&  (FormatCharacter <= '9')); ){
 | |
|             Count = (Count * 10) + FormatCharacter - '0';
 | |
|             Format += BytesPerFormatCharacter;
 | |
|             FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;
 | |
|           }
 | |
|           Format -= BytesPerFormatCharacter;
 | |
|           if ((Flags & PRECISION) == 0) {
 | |
|             Flags |= PAD_TO_WIDTH;
 | |
|             Width = Count;
 | |
|           } else {
 | |
|             Precision = Count;
 | |
|           }
 | |
|           break;
 | |
|         default:
 | |
|           Done = TRUE;
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       //
 | |
|       // Limit the maximum field width to the remaining characters in the output buffer
 | |
|       //
 | |
|       if (Width > BufferSize) {
 | |
|         Width = BufferSize;
 | |
|       }
 | |
| 
 | |
|       //
 | |
|       // Handle each argument type
 | |
|       //
 | |
|       switch (FormatCharacter) {
 | |
|       case 'X':
 | |
|         Flags |= PREFIX_ZERO;
 | |
|         //
 | |
|         // break skiped on purpose
 | |
|         //
 | |
|       case 'x':
 | |
|         Flags |= RADIX_HEX;
 | |
|         //
 | |
|         // break skiped on purpose
 | |
|         //
 | |
|       case 'd':
 | |
|         if ((Flags & LONG_TYPE) == 0) {
 | |
|           Value = (VA_ARG (Marker, INTN));
 | |
|         } else {
 | |
|           Value = VA_ARG (Marker, INT64);
 | |
|         }
 | |
|         if ((Flags & PREFIX_BLANK) != 0) {
 | |
|           Prefix = ' ';
 | |
|         }
 | |
|         if ((Flags & PREFIX_SIGN) != 0) {
 | |
|           Prefix = '+';
 | |
|         }
 | |
|         if ((Flags & COMMA_TYPE) != 0) {
 | |
|           Comma = TRUE;
 | |
|         }
 | |
|         if ((Flags & RADIX_HEX) == 0) {
 | |
|           Radix = 10;
 | |
|           if (Comma) {
 | |
|             Flags &= (~PREFIX_ZERO);
 | |
|             Precision = 1;
 | |
|           }
 | |
|           if (Value < 0) {
 | |
|             Flags |= PREFIX_SIGN;
 | |
|             Prefix = '-';
 | |
|             Value = -Value;
 | |
|           }
 | |
|         } else {
 | |
|           Radix = 16;
 | |
|           Comma = FALSE;
 | |
|           if ((Flags & LONG_TYPE) == 0 && Value < 0) {
 | |
|             Value = (UINTN)Value;
 | |
|           }
 | |
|         }
 | |
|         //
 | |
|         // Convert Value to a reversed string
 | |
|         //
 | |
|         Count = BasePrintLibValueToString (ValueBuffer, Value, Radix);
 | |
|         if (Value == 0 && Precision == 0) {
 | |
|           Count = 0;
 | |
|         }
 | |
|         ArgumentString = (CHAR8 *)ValueBuffer + Count;
 | |
|         Digits = 3 - (Count % 3);
 | |
|         if (Comma && Count != 0) {
 | |
|           Count += ((Count - 1) / 3);
 | |
|         }
 | |
|         if (Prefix != 0) {
 | |
|           Count++;
 | |
|         }
 | |
|         Flags |= ARGUMENT_REVERSED;
 | |
|         ZeroPad = TRUE;
 | |
|         if ((Flags & PREFIX_ZERO) != 0) {
 | |
|           if ((Flags & PAD_TO_WIDTH) != 0) {
 | |
|             if ((Flags & PRECISION) == 0) {
 | |
|               Precision = Width;
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|         break;
 | |
| 
 | |
|       case 's':
 | |
|       case 'S':
 | |
|         Flags |= ARGUMENT_UNICODE;
 | |
|         //
 | |
|         // break skipped on purpose
 | |
|         //
 | |
|       case 'a':
 | |
|         ArgumentString = (CHAR8 *)VA_ARG (Marker, CHAR8 *);
 | |
|         if (ArgumentString == NULL) {
 | |
|           Flags &= (~ARGUMENT_UNICODE);
 | |
|           ArgumentString = "<null string>";
 | |
|         }
 | |
|         break;
 | |
| 
 | |
|       case 'c':
 | |
|         Character = VA_ARG (Marker, UINTN) & 0xffff;
 | |
|         ArgumentString = (CHAR8 *)&Character;
 | |
|         Flags |= ARGUMENT_UNICODE;
 | |
|         break;
 | |
| 
 | |
|       case 'g':
 | |
|         TmpGuid = VA_ARG (Marker, GUID *);
 | |
|         if (TmpGuid == NULL) {
 | |
|           ArgumentString = "<null guid>";
 | |
|         } else {
 | |
|           BasePrintLibSPrint (
 | |
|             ValueBuffer,
 | |
|             0,
 | |
|             0,
 | |
|             "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
 | |
|             TmpGuid->Data1,
 | |
|             TmpGuid->Data2,
 | |
|             TmpGuid->Data3,
 | |
|             TmpGuid->Data4[0],
 | |
|             TmpGuid->Data4[1],
 | |
|             TmpGuid->Data4[2],
 | |
|             TmpGuid->Data4[3],
 | |
|             TmpGuid->Data4[4],
 | |
|             TmpGuid->Data4[5],
 | |
|             TmpGuid->Data4[6],
 | |
|             TmpGuid->Data4[7]
 | |
|             );
 | |
|           ArgumentString = ValueBuffer;
 | |
|         }
 | |
|         break;
 | |
| 
 | |
|       case 't':
 | |
|         TmpTime = VA_ARG (Marker, TIME *);
 | |
|         if (TmpTime == NULL) {
 | |
|           ArgumentString = "<null time>";
 | |
|         } else {
 | |
|           BasePrintLibSPrint (
 | |
|             ValueBuffer,
 | |
|             0,
 | |
|             0,
 | |
|             "%02d/%02d/%04d  %02d:%02d",
 | |
|             TmpTime->Month,
 | |
|             TmpTime->Day,
 | |
|             TmpTime->Year,
 | |
|             TmpTime->Hour,
 | |
|             TmpTime->Minute
 | |
|             );
 | |
|           ArgumentString = ValueBuffer;
 | |
|         }
 | |
|         break;
 | |
| 
 | |
|       case 'r':
 | |
|         Status = VA_ARG (Marker, RETURN_STATUS);
 | |
|         ArgumentString = ValueBuffer;
 | |
|         for (Index = 0; StatusString[Index].String != NULL; Index++) {
 | |
|           if (Status == StatusString[Index].Status) {
 | |
|             ArgumentString = StatusString[Index].String;
 | |
|           }
 | |
|         }
 | |
|         if (ArgumentString == ValueBuffer) {
 | |
|           BasePrintLibSPrint ((CHAR8 *) ValueBuffer, 0, 0, "%08X", Status);
 | |
|         }
 | |
|         break;
 | |
| 
 | |
|       case '%':
 | |
|       default:
 | |
|         //
 | |
|         // if the type is '%' or unknown, then print it to the screen
 | |
|         //
 | |
|         ArgumentString = (CHAR8 *)&FormatCharacter;
 | |
|         Flags |= ARGUMENT_UNICODE;
 | |
|         break;
 | |
|       }
 | |
|       break;
 | |
|     case '\n':
 | |
|       ArgumentString = "\n";
 | |
| 	  
 | |
|       break;
 | |
|     default:
 | |
|       ArgumentString = (CHAR8 *)&FormatCharacter;
 | |
|       Flags |= ARGUMENT_UNICODE;
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Retrieve the ArgumentString attriubutes
 | |
|     //
 | |
|     if ((Flags & ARGUMENT_UNICODE) != 0) {
 | |
|       ArgumentMask = 0xffff;
 | |
|       BytesPerArgumentCharacter = 2;
 | |
|     } else {
 | |
|       ArgumentMask = 0xff;
 | |
|       BytesPerArgumentCharacter = 1;
 | |
|     }
 | |
|     if ((Flags & ARGUMENT_REVERSED) != 0) {
 | |
|       BytesPerArgumentCharacter = -BytesPerArgumentCharacter;
 | |
|     } else {
 | |
|       //
 | |
|       // Compute the number of characters in ArgumentString and store it in Count
 | |
|       // ArgumentString is either null-terminated, or it contains Precision characters
 | |
|       //
 | |
|       for (Count = 0; Count < Precision || ((Flags & PRECISION) == 0); Count++) {
 | |
|         ArgumentCharacter = ((ArgumentString[Count * BytesPerArgumentCharacter] & 0xff) | ((ArgumentString[Count * BytesPerArgumentCharacter + 1]) << 8)) & ArgumentMask;
 | |
|         if (ArgumentCharacter == 0) {
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Limit the length of the string to append to the remaining characters in the output buffer
 | |
|     //
 | |
|     if (Count > BufferSize) {
 | |
|       Count = BufferSize;
 | |
|     }
 | |
|     if (Precision < Count) {
 | |
|       Precision = Count;
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Pad before the string
 | |
|     //
 | |
|     if ((Flags & (PAD_TO_WIDTH | LEFT_JUSTIFY)) == (PAD_TO_WIDTH)) {
 | |
|       Buffer = BasePrintLibFillBuffer (Buffer, Width - Precision, ' ', BytesPerOutputCharacter);
 | |
|     }
 | |
| 
 | |
|     if (ZeroPad) {
 | |
|       if (Prefix != 0) {
 | |
|         Buffer = BasePrintLibFillBuffer (Buffer, 1, Prefix, BytesPerOutputCharacter);
 | |
|       }
 | |
|       Buffer = BasePrintLibFillBuffer (Buffer, Precision - Count, '0', BytesPerOutputCharacter);
 | |
|     } else {
 | |
|       Buffer = BasePrintLibFillBuffer (Buffer, Precision - Count, ' ', BytesPerOutputCharacter);
 | |
|       if (Prefix != 0) {
 | |
|         Buffer = BasePrintLibFillBuffer (Buffer, 1, Prefix, BytesPerOutputCharacter);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Output the Prefix character if it is present
 | |
|     //
 | |
|     Index = 0;
 | |
|     if (Prefix) {
 | |
|       Index++;
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Copy the string into the output buffer performing the required type conversions
 | |
|     //
 | |
|     while (Index < Count) {
 | |
|       ArgumentCharacter = ((*ArgumentString & 0xff) | (*(ArgumentString + 1) << 8)) & ArgumentMask;
 | |
| 
 | |
|       Buffer = BasePrintLibFillBuffer (Buffer, 1, ArgumentCharacter, BytesPerOutputCharacter);
 | |
|       ArgumentString    += BytesPerArgumentCharacter;
 | |
|       Index++;
 | |
|       if (Comma) {
 | |
|         Digits++;
 | |
|         if (Digits == 3) {
 | |
|           Digits = 0;
 | |
|           Index++;
 | |
|           if (Index < Count) {
 | |
|             Buffer = BasePrintLibFillBuffer (Buffer, 1, ',', BytesPerOutputCharacter);
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Pad after the string
 | |
|     //
 | |
|     if ((Flags & (PAD_TO_WIDTH | LEFT_JUSTIFY)) == (PAD_TO_WIDTH | LEFT_JUSTIFY)) {
 | |
|       Buffer = BasePrintLibFillBuffer (Buffer, Width - Precision, ' ', BytesPerOutputCharacter);
 | |
|     }
 | |
| 
 | |
|     //
 | |
|     // Reduce the number of characters
 | |
|     //
 | |
|     BufferSize -= Count;
 | |
| 
 | |
|     //
 | |
|     // Get the next character from the format string
 | |
|     //
 | |
|     Format += BytesPerFormatCharacter;
 | |
| 
 | |
|     //
 | |
|     // Get the next character from the format string
 | |
|     //
 | |
|     FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;
 | |
|   }
 | |
| 
 | |
|   //
 | |
|   // Null terminate the Unicode or ASCII string
 | |
|   //
 | |
|   Buffer = BasePrintLibFillBuffer (Buffer, 1, 0, BytesPerOutputCharacter);
 | |
| 
 | |
|   return ((Buffer - OriginalBuffer) / BytesPerOutputCharacter);
 | |
| }
 | |
| 
 | |
| UINTN
 | |
| BasePrintLibSPrint (
 | |
|   OUT CHAR8        *StartOfBuffer,
 | |
|   IN  UINTN        BufferSize,
 | |
|   IN  UINTN        Flags,
 | |
|   IN  CONST CHAR8  *FormatString,
 | |
|   ...
 | |
|   )
 | |
| {
 | |
|   VA_LIST  Marker;
 | |
| 
 | |
|   VA_START (Marker, FormatString);
 | |
|   return BasePrintLibVSPrint (StartOfBuffer, BufferSize, Flags, FormatString, Marker);
 | |
| }
 | |
| 
 | |
| UINTN
 | |
| EFIAPI
 | |
| UnicodeVSPrint (
 | |
|   OUT CHAR16        *StartOfBuffer,
 | |
|   IN  UINTN         BufferSize,
 | |
|   IN  CONST CHAR16  *FormatString,
 | |
|   IN  VA_LIST       Marker
 | |
|   )
 | |
| {
 | |
|   return BasePrintLibVSPrint ((CHAR8 *)StartOfBuffer, BufferSize >> 1, FORMAT_UNICODE | OUTPUT_UNICODE, (CHAR8 *)FormatString, Marker);
 | |
| }
 | |
| 
 | |
| UINTN
 | |
| EFIAPI
 | |
| UnicodeSPrint (
 | |
|   OUT CHAR16        *StartOfBuffer,
 | |
|   IN  UINTN         BufferSize,
 | |
|   IN  CONST CHAR16  *FormatString,
 | |
|   ...
 | |
|   )
 | |
| {
 | |
|   VA_LIST Marker;
 | |
| 
 | |
|   VA_START (Marker, FormatString);
 | |
|   return UnicodeVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
 | |
| }
 | |
| 
 | |
| UINTN
 | |
| EFIAPI
 | |
| UnicodeVSPrintAsciiFormat (
 | |
|   OUT CHAR16       *StartOfBuffer,
 | |
|   IN  UINTN        BufferSize,
 | |
|   IN  CONST CHAR8  *FormatString,
 | |
|   IN  VA_LIST      Marker
 | |
|   )
 | |
| {
 | |
|   return BasePrintLibVSPrint ((CHAR8 *)StartOfBuffer, BufferSize >> 1, OUTPUT_UNICODE,FormatString, Marker);
 | |
| }
 | |
| 
 | |
| UINTN
 | |
| EFIAPI
 | |
| UnicodeSPrintAsciiFormat (
 | |
|   OUT CHAR16       *StartOfBuffer,
 | |
|   IN  UINTN        BufferSize,
 | |
|   IN  CONST CHAR8  *FormatString,
 | |
|   ...
 | |
|   )
 | |
| {
 | |
|   VA_LIST Marker;
 | |
| 
 | |
|   VA_START (Marker, FormatString);
 | |
|   return UnicodeVSPrintAsciiFormat (StartOfBuffer, BufferSize >> 1, FormatString, Marker);
 | |
| }
 | |
| 
 | |
| UINTN
 | |
| EFIAPI
 | |
| AsciiVSPrint (
 | |
|   OUT CHAR8         *StartOfBuffer,
 | |
|   IN  UINTN         BufferSize,
 | |
|   IN  CONST CHAR8   *FormatString,
 | |
|   IN  VA_LIST       Marker
 | |
|   )
 | |
| {
 | |
|   return BasePrintLibVSPrint (StartOfBuffer, BufferSize, 0, FormatString, Marker);
 | |
| }
 | |
| 
 | |
| UINTN
 | |
| EFIAPI
 | |
| AsciiSPrint (
 | |
|   OUT CHAR8        *StartOfBuffer,
 | |
|   IN  UINTN        BufferSize,
 | |
|   IN  CONST CHAR8  *FormatString,
 | |
|   ...
 | |
|   )
 | |
| {
 | |
|   VA_LIST Marker;
 | |
| 
 | |
|   VA_START (Marker, FormatString);
 | |
|   return AsciiVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
 | |
| }
 | |
| 
 | |
| UINTN
 | |
| EFIAPI
 | |
| AsciiVSPrintUnicodeFormat (
 | |
|   OUT CHAR8         *StartOfBuffer,
 | |
|   IN  UINTN         BufferSize,
 | |
|   IN  CONST CHAR16  *FormatString,
 | |
|   IN  VA_LIST       Marker
 | |
|   )
 | |
| {
 | |
|   return BasePrintLibVSPrint (StartOfBuffer, BufferSize, FORMAT_UNICODE, (CHAR8 *)FormatString, Marker);
 | |
| }
 | |
| 
 | |
| UINTN
 | |
| EFIAPI
 | |
| AsciiSPrintUnicodeFormat (
 | |
|   OUT CHAR8         *StartOfBuffer,
 | |
|   IN  UINTN         BufferSize,
 | |
|   IN  CONST CHAR16  *FormatString,
 | |
|   ...
 | |
|   )
 | |
| {
 | |
|   VA_LIST Marker;
 | |
| 
 | |
|   VA_START (Marker, FormatString);
 | |
|   return AsciiVSPrintUnicodeFormat (StartOfBuffer, BufferSize, FormatString, Marker);
 | |
| }
 | |
| 
 | |
| UINTN
 | |
| EFIAPI
 | |
| UnicodeValueToString (
 | |
|   IN OUT CHAR16  *Buffer,
 | |
|   IN UINTN       Flags,
 | |
|   IN INT64       Value,
 | |
|   IN UINTN       Width
 | |
|   )
 | |
| {
 | |
|   return BasePrintLibConvertValueToString ((CHAR8 *)Buffer, Flags, Value, Width, 2);
 | |
| }
 | |
| 
 | |
| UINTN
 | |
| EFIAPI
 | |
| AsciiValueToString (
 | |
|   IN OUT CHAR8  *Buffer,
 | |
|   IN UINTN      Flags,
 | |
|   IN INT64      Value,
 | |
|   IN UINTN      Width
 | |
|   )
 | |
| {
 | |
|   return BasePrintLibConvertValueToString ((CHAR8 *)Buffer, Flags, Value, Width, 1);
 | |
| }
 |