]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BasePrintLib/PrintLibInternal.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdePkg / Library / BasePrintLib / PrintLibInternal.c
index 9b15a07ac066378750bde3af31b0b6872611c824..42b598a432247ca3d298ec2cfd5cf636cfb12c57 100644 (file)
@@ -1,27 +1,21 @@
 /** @file\r
   Print Library internal worker functions.\r
 \r
-  Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php.\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
 #include "PrintLibInternal.h"\r
 \r
-#define WARNING_STATUS_NUMBER         5\r
-#define ERROR_STATUS_NUMBER           33\r
+#define WARNING_STATUS_NUMBER  5\r
+#define ERROR_STATUS_NUMBER    33\r
 \r
 //\r
 // Safe print checks\r
 //\r
-#define RSIZE_MAX             (PcdGet32 (PcdMaximumUnicodeStringLength))\r
-#define ASCII_RSIZE_MAX       (PcdGet32 (PcdMaximumAsciiStringLength))\r
+#define RSIZE_MAX        (PcdGet32 (PcdMaximumUnicodeStringLength))\r
+#define ASCII_RSIZE_MAX  (PcdGet32 (PcdMaximumAsciiStringLength))\r
 \r
 #define SAFE_PRINT_CONSTRAINT_CHECK(Expression, RetVal)  \\r
   do { \\r
     } \\r
   } while (FALSE)\r
 \r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mHexStr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8  mHexStr[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };\r
 \r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 * CONST mStatusString[] = {\r
+//\r
+// Longest string: RETURN_WARN_BUFFER_TOO_SMALL => 24 characters plus NUL byte\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8  mWarningString[][24+1] = {\r
   "Success",                      //  RETURN_SUCCESS                = 0\r
   "Warning Unknown Glyph",        //  RETURN_WARN_UNKNOWN_GLYPH     = 1\r
   "Warning Delete Failure",       //  RETURN_WARN_DELETE_FAILURE    = 2\r
   "Warning Write Failure",        //  RETURN_WARN_WRITE_FAILURE     = 3\r
   "Warning Buffer Too Small",     //  RETURN_WARN_BUFFER_TOO_SMALL  = 4\r
   "Warning Stale Data",           //  RETURN_WARN_STALE_DATA        = 5\r
+};\r
+\r
+//\r
+// Longest string: RETURN_INCOMPATIBLE_VERSION => 20 characters plus NUL byte\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8  mErrorString[][20+1] = {\r
   "Load Error",                   //  RETURN_LOAD_ERROR             = 1  | MAX_BIT\r
   "Invalid Parameter",            //  RETURN_INVALID_PARAMETER      = 2  | MAX_BIT\r
   "Unsupported",                  //  RETURN_UNSUPPORTED            = 3  | MAX_BIT\r
@@ -75,7 +78,6 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 * CONST mStatusString[] = {
   "Compromised Data"              //  RETURN_COMPROMISED_DATA       = 33 | MAX_BIT\r
 };\r
 \r
-\r
 /**\r
   Internal function that places the character into the Buffer.\r
 \r
@@ -83,7 +85,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 * CONST mStatusString[] = {
 \r
   @param  Buffer      The buffer to place the Unicode or ASCII string.\r
   @param  EndBuffer   The end of the input Buffer. No characters will be\r
-                      placed after that. \r
+                      placed after that.\r
   @param  Length      The count of character to be placed into Buffer.\r
                       (Negative value indicates no buffer fill.)\r
   @param  Character   The character to be placed into Buffer.\r
@@ -94,20 +96,21 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 * CONST mStatusString[] = {
 **/\r
 CHAR8 *\r
 BasePrintLibFillBuffer (\r
-  OUT CHAR8   *Buffer,\r
-  IN  CHAR8   *EndBuffer,\r
-  IN  INTN    Length,\r
-  IN  UINTN   Character,\r
-  IN  INTN    Increment\r
+  OUT CHAR8  *Buffer,\r
+  IN  CHAR8  *EndBuffer,\r
+  IN  INTN   Length,\r
+  IN  UINTN  Character,\r
+  IN  INTN   Increment\r
   )\r
 {\r
   INTN  Index;\r
-  \r
+\r
   for (Index = 0; Index < Length && Buffer < EndBuffer; Index++) {\r
-    *Buffer = (CHAR8) Character;\r
+    *Buffer = (CHAR8)Character;\r
     if (Increment != 1) {\r
       *(Buffer + 1) = (CHAR8)(Character >> 8);\r
     }\r
+\r
     Buffer += Increment;\r
   }\r
 \r
@@ -128,8 +131,8 @@ BasePrintLibFillBuffer (
 **/\r
 CHAR8 *\r
 BasePrintLibValueToString (\r
-  IN OUT CHAR8  *Buffer, \r
-  IN INT64      Value, \r
+  IN OUT CHAR8  *Buffer,\r
+  IN INT64      Value,\r
   IN UINTN      Radix\r
   )\r
 {\r
@@ -140,7 +143,7 @@ BasePrintLibValueToString (
   //\r
   *Buffer = 0;\r
   do {\r
-    Value = (INT64)DivU64x32Remainder ((UINT64)Value, (UINT32)Radix, &Remainder);\r
+    Value       = (INT64)DivU64x32Remainder ((UINT64)Value, (UINT32)Radix, &Remainder);\r
     *(++Buffer) = mHexStr[Remainder];\r
   } while (Value != 0);\r
 \r
@@ -152,23 +155,23 @@ BasePrintLibValueToString (
 \r
 /**\r
   Internal function that converts a decimal value to a Null-terminated string.\r
-  \r
-  Converts the decimal number specified by Value to a Null-terminated  \r
+\r
+  Converts the decimal number specified by Value to a Null-terminated\r
   string specified by Buffer containing at most Width characters.\r
   If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.\r
   The total number of characters placed in Buffer is returned.\r
   If the conversion contains more than Width characters, then only the first\r
-  Width characters are returned, and the total number of characters \r
+  Width characters are returned, and the total number of characters\r
   required to perform the conversion is returned.\r
-  Additional conversion parameters are specified in Flags.  \r
+  Additional conversion parameters are specified in Flags.\r
   The Flags bit LEFT_JUSTIFY is always ignored.\r
   All conversions are left justified in Buffer.\r
   If Width is 0, PREFIX_ZERO is ignored in Flags.\r
   If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas\r
   are inserted every 3rd digit starting from the right.\r
   If Value is < 0, then the fist character in Buffer is a '-'.\r
-  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, \r
-  then Buffer is padded with '0' characters so the combination of the optional '-' \r
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored,\r
+  then Buffer is padded with '0' characters so the combination of the optional '-'\r
   sign character, '0' characters, digit characters for Value, and the Null-terminator\r
   add up to Width characters.\r
 \r
@@ -184,17 +187,17 @@ BasePrintLibValueToString (
   @param  Width     The maximum number of characters to place in Buffer, not including\r
                     the Null-terminator.\r
   @param  Increment The character increment in Buffer.\r
-  \r
+\r
   @return Total number of characters required to perform the conversion.\r
 \r
 **/\r
 UINTN\r
 BasePrintLibConvertValueToString (\r
-  IN OUT CHAR8   *Buffer,\r
-  IN UINTN       Flags,\r
-  IN INT64       Value,\r
-  IN UINTN       Width,\r
-  IN UINTN       Increment\r
+  IN OUT CHAR8  *Buffer,\r
+  IN UINTN      Flags,\r
+  IN INT64      Value,\r
+  IN UINTN      Width,\r
+  IN UINTN      Increment\r
   )\r
 {\r
   CHAR8  *OriginalBuffer;\r
@@ -222,47 +225,49 @@ BasePrintLibConvertValueToString (
   ASSERT (((Flags & COMMA_TYPE) == 0) || ((Flags & RADIX_HEX) == 0));\r
 \r
   OriginalBuffer = Buffer;\r
-  \r
+\r
   //\r
   // Width is 0 or COMMA_TYPE is set, PREFIX_ZERO is ignored.\r
   //\r
-  if (Width == 0 || (Flags & COMMA_TYPE) != 0) {\r
-    Flags &= ~((UINTN) PREFIX_ZERO);\r
+  if ((Width == 0) || ((Flags & COMMA_TYPE) != 0)) {\r
+    Flags &= ~((UINTN)PREFIX_ZERO);\r
   }\r
+\r
   //\r
   // If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.\r
   //\r
   if (Width == 0) {\r
     Width = MAXIMUM_VALUE_CHARACTERS - 1;\r
   }\r
+\r
   //\r
   // Set the tag for the end of the input Buffer.\r
   //\r
   EndBuffer = Buffer + Width * Increment;\r
-  \r
+\r
   //\r
   // Convert decimal negative\r
   //\r
   if ((Value < 0) && ((Flags & RADIX_HEX) == 0)) {\r
-    Value = -Value;\r
+    Value  = -Value;\r
     Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, '-', Increment);\r
     Width--;\r
   }\r
-  \r
+\r
   //\r
   // Count the length of the value string.\r
   //\r
-  Radix = ((Flags & RADIX_HEX) == 0)? 10 : 16;\r
+  Radix          = ((Flags & RADIX_HEX) == 0) ? 10 : 16;\r
   ValueBufferPtr = BasePrintLibValueToString (ValueBuffer, Value, Radix);\r
-  Count = ValueBufferPtr - ValueBuffer;\r
-  \r
+  Count          = ValueBufferPtr - ValueBuffer;\r
+\r
   //\r
   // Append Zero\r
   //\r
   if ((Flags & PREFIX_ZERO) != 0) {\r
     Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Count, '0', Increment);\r
   }\r
-  \r
+\r
   //\r
   // Print Comma type for every 3 characters\r
   //\r
@@ -270,6 +275,7 @@ BasePrintLibConvertValueToString (
   if (Digits != 0) {\r
     Digits = 3 - Digits;\r
   }\r
+\r
   for (Index = 0; Index < Count; Index++) {\r
     Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, *ValueBufferPtr--, Increment);\r
     if ((Flags & COMMA_TYPE) != 0) {\r
@@ -282,7 +288,7 @@ BasePrintLibConvertValueToString (
       }\r
     }\r
   }\r
-  \r
+\r
   //\r
   // Print Null-terminator\r
   //\r
@@ -344,12 +350,12 @@ BasePrintLibConvertValueToString (
 **/\r
 RETURN_STATUS\r
 BasePrintLibConvertValueToStringS (\r
-  IN OUT CHAR8   *Buffer,\r
-  IN UINTN       BufferSize,\r
-  IN UINTN       Flags,\r
-  IN INT64       Value,\r
-  IN UINTN       Width,\r
-  IN UINTN       Increment\r
+  IN OUT CHAR8  *Buffer,\r
+  IN UINTN      BufferSize,\r
+  IN UINTN      Flags,\r
+  IN INT64      Value,\r
+  IN UINTN      Width,\r
+  IN UINTN      Increment\r
   )\r
 {\r
   CHAR8  *EndBuffer;\r
@@ -400,9 +406,10 @@ BasePrintLibConvertValueToStringS (
   //\r
   // Width is 0 or COMMA_TYPE is set, PREFIX_ZERO is ignored.\r
   //\r
-  if (Width == 0 || (Flags & COMMA_TYPE) != 0) {\r
-    Flags &= ~((UINTN) PREFIX_ZERO);\r
+  if ((Width == 0) || ((Flags & COMMA_TYPE) != 0)) {\r
+    Flags &= ~((UINTN)PREFIX_ZERO);\r
   }\r
+\r
   //\r
   // If Width is 0 then a width of MAXIMUM_VALUE_CHARACTERS is assumed.\r
   //\r
@@ -414,7 +421,7 @@ BasePrintLibConvertValueToStringS (
   // Count the characters of the output string.\r
   //\r
   Count = 0;\r
-  Radix = ((Flags & RADIX_HEX) == 0)? 10 : 16;\r
+  Radix = ((Flags & RADIX_HEX) == 0) ? 10 : 16;\r
 \r
   if ((Flags & PREFIX_ZERO) != 0) {\r
     Count = Width;\r
@@ -425,6 +432,7 @@ BasePrintLibConvertValueToStringS (
     } else {\r
       ValueBufferPtr = BasePrintLibValueToString (ValueBuffer, Value, Radix);\r
     }\r
+\r
     Digits = ValueBufferPtr - ValueBuffer;\r
     Count += Digits;\r
 \r
@@ -449,7 +457,7 @@ BasePrintLibConvertValueToStringS (
   // Convert decimal negative\r
   //\r
   if ((Value < 0) && ((Flags & RADIX_HEX) == 0)) {\r
-    Value = -Value;\r
+    Value  = -Value;\r
     Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, '-', Increment);\r
     Width--;\r
   }\r
@@ -458,7 +466,7 @@ BasePrintLibConvertValueToStringS (
   // Count the length of the value string.\r
   //\r
   ValueBufferPtr = BasePrintLibValueToString (ValueBuffer, Value, Radix);\r
-  Count = ValueBufferPtr - ValueBuffer;\r
+  Count          = ValueBufferPtr - ValueBuffer;\r
 \r
   //\r
   // Append Zero\r
@@ -474,6 +482,7 @@ BasePrintLibConvertValueToStringS (
   if (Digits != 0) {\r
     Digits = 3 - Digits;\r
   }\r
+\r
   for (Index = 0; Index < Count; Index++) {\r
     Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, *ValueBufferPtr--, Increment);\r
     if ((Flags & COMMA_TYPE) != 0) {\r
@@ -496,21 +505,21 @@ BasePrintLibConvertValueToStringS (
 }\r
 \r
 /**\r
-  Worker function that produces a Null-terminated string in an output buffer \r
+  Worker function that produces a Null-terminated string in an output buffer\r
   based on a Null-terminated format string and a VA_LIST argument list.\r
 \r
-  VSPrint function to process format and place the results in Buffer. Since a \r
-  VA_LIST is used this routine allows the nesting of Vararg routines. Thus \r
+  VSPrint function to process format and place the results in Buffer. Since a\r
+  VA_LIST is used this routine allows the nesting of Vararg routines. Thus\r
   this is the main print working routine.\r
 \r
   If COUNT_ONLY_NO_PRINT is set in Flags, Buffer will not be modified at all.\r
 \r
-  @param[out] Buffer          The character buffer to print the results of the \r
+  @param[out] Buffer          The character buffer to print the results of the\r
                               parsing of Format into.\r
-  @param[in]  BufferSize      The maximum number of characters to put into \r
+  @param[in]  BufferSize      The maximum number of characters to put into\r
                               buffer.\r
   @param[in]  Flags           Initial flags value.\r
-                              Can only have FORMAT_UNICODE, OUTPUT_UNICODE, \r
+                              Can only have FORMAT_UNICODE, OUTPUT_UNICODE,\r
                               and COUNT_ONLY_NO_PRINT set.\r
   @param[in]  Format          A Null-terminated format string.\r
   @param[in]  VaListMarker    VA_LIST style variable argument list consumed by\r
@@ -529,44 +538,44 @@ BasePrintLibSPrintMarker (
   IN  UINTN        BufferSize,\r
   IN  UINTN        Flags,\r
   IN  CONST CHAR8  *Format,\r
-  IN  VA_LIST      VaListMarker,   OPTIONAL\r
+  IN  VA_LIST      VaListMarker    OPTIONAL,\r
   IN  BASE_LIST    BaseListMarker  OPTIONAL\r
   )\r
 {\r
-  CHAR8             *OriginalBuffer;\r
-  CHAR8             *EndBuffer;\r
-  CHAR8             ValueBuffer[MAXIMUM_VALUE_CHARACTERS];\r
-  UINT32            BytesPerOutputCharacter;\r
-  UINTN             BytesPerFormatCharacter;\r
-  UINTN             FormatMask;\r
-  UINTN             FormatCharacter;\r
-  UINTN             Width;\r
-  UINTN             Precision;\r
-  INT64             Value;\r
-  CONST CHAR8       *ArgumentString;\r
-  UINTN             Character;\r
-  GUID              *TmpGuid;\r
-  TIME              *TmpTime;\r
-  UINTN             Count;\r
-  UINTN             ArgumentMask;\r
-  INTN              BytesPerArgumentCharacter;\r
-  UINTN             ArgumentCharacter;\r
-  BOOLEAN           Done;\r
-  UINTN             Index;\r
-  CHAR8             Prefix;\r
-  BOOLEAN           ZeroPad;\r
-  BOOLEAN           Comma;\r
-  UINTN             Digits;\r
-  UINTN             Radix;\r
-  RETURN_STATUS     Status;\r
-  UINT32            GuidData1;\r
-  UINT16            GuidData2;\r
-  UINT16            GuidData3;\r
-  UINTN             LengthToReturn;\r
+  CHAR8          *OriginalBuffer;\r
+  CHAR8          *EndBuffer;\r
+  CHAR8          ValueBuffer[MAXIMUM_VALUE_CHARACTERS];\r
+  UINT32         BytesPerOutputCharacter;\r
+  UINTN          BytesPerFormatCharacter;\r
+  UINTN          FormatMask;\r
+  UINTN          FormatCharacter;\r
+  UINTN          Width;\r
+  UINTN          Precision;\r
+  INT64          Value;\r
+  CONST CHAR8    *ArgumentString;\r
+  UINTN          Character;\r
+  GUID           *TmpGuid;\r
+  TIME           *TmpTime;\r
+  UINTN          Count;\r
+  UINTN          ArgumentMask;\r
+  INTN           BytesPerArgumentCharacter;\r
+  UINTN          ArgumentCharacter;\r
+  BOOLEAN        Done;\r
+  UINTN          Index;\r
+  CHAR8          Prefix;\r
+  BOOLEAN        ZeroPad;\r
+  BOOLEAN        Comma;\r
+  UINTN          Digits;\r
+  UINTN          Radix;\r
+  RETURN_STATUS  Status;\r
+  UINT32         GuidData1;\r
+  UINT16         GuidData2;\r
+  UINT16         GuidData3;\r
+  UINTN          LengthToReturn;\r
 \r
   //\r
   // If you change this code be sure to match the 2 versions of this function.\r
-  // Nearly identical logic is found in the BasePrintLib and \r
+  // Nearly identical logic is found in the BasePrintLib and\r
   // DxePrintLibPrint2Protocol (both PrintLib instances).\r
   //\r
 \r
@@ -594,11 +603,13 @@ BasePrintLibSPrintMarker (
     if (RSIZE_MAX != 0) {\r
       SAFE_PRINT_CONSTRAINT_CHECK ((BufferSize <= RSIZE_MAX), 0);\r
     }\r
+\r
     BytesPerOutputCharacter = 2;\r
   } else {\r
     if (ASCII_RSIZE_MAX != 0) {\r
       SAFE_PRINT_CONSTRAINT_CHECK ((BufferSize <= ASCII_RSIZE_MAX), 0);\r
     }\r
+\r
     BytesPerOutputCharacter = 1;\r
   }\r
 \r
@@ -610,14 +621,16 @@ BasePrintLibSPrintMarker (
     if (RSIZE_MAX != 0) {\r
       SAFE_PRINT_CONSTRAINT_CHECK ((StrnLenS ((CHAR16 *)Format, RSIZE_MAX + 1) <= RSIZE_MAX), 0);\r
     }\r
+\r
     BytesPerFormatCharacter = 2;\r
-    FormatMask = 0xffff;\r
+    FormatMask              = 0xffff;\r
   } else {\r
     if (ASCII_RSIZE_MAX != 0) {\r
       SAFE_PRINT_CONSTRAINT_CHECK ((AsciiStrnLenS (Format, ASCII_RSIZE_MAX + 1) <= ASCII_RSIZE_MAX), 0);\r
     }\r
+\r
     BytesPerFormatCharacter = 1;\r
-    FormatMask = 0xff;\r
+    FormatMask              = 0xff;\r
   }\r
 \r
   if ((Flags & COUNT_ONLY_NO_PRINT) != 0) {\r
@@ -634,7 +647,7 @@ BasePrintLibSPrintMarker (
   }\r
 \r
   LengthToReturn = 0;\r
-  EndBuffer = NULL;\r
+  EndBuffer      = NULL;\r
   OriginalBuffer = NULL;\r
 \r
   //\r
@@ -653,7 +666,7 @@ BasePrintLibSPrintMarker (
   //\r
   // Get the first character from the format string\r
   //\r
-  FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+  FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
 \r
   //\r
   // Loop until the end of the format string is reached or the output buffer is full\r
@@ -662,10 +675,11 @@ BasePrintLibSPrintMarker (
     if ((Buffer != NULL) && (Buffer >= EndBuffer)) {\r
       break;\r
     }\r
+\r
     //\r
     // Clear all the flag bits except those that may have been passed in\r
     //\r
-    Flags &= (UINTN) (OUTPUT_UNICODE | FORMAT_UNICODE | COUNT_ONLY_NO_PRINT);\r
+    Flags &= (UINTN)(OUTPUT_UNICODE | FORMAT_UNICODE | COUNT_ONLY_NO_PRINT);\r
 \r
     //\r
     // Set the default width to zero, and the default precision to 1\r
@@ -679,345 +693,416 @@ BasePrintLibSPrintMarker (
     Digits    = 0;\r
 \r
     switch (FormatCharacter) {\r
-    case '%':\r
-      //\r
-      // Parse Flags and Width\r
-      //\r
-      for (Done = FALSE; !Done; ) {\r
-        Format += BytesPerFormatCharacter;\r
-        FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+      case '%':\r
+        //\r
+        // Parse Flags and Width\r
+        //\r
+        for (Done = FALSE; !Done; ) {\r
+          Format         += BytesPerFormatCharacter;\r
+          FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
+          switch (FormatCharacter) {\r
+            case '.':\r
+              Flags |= PRECISION;\r
+              break;\r
+            case '-':\r
+              Flags |= LEFT_JUSTIFY;\r
+              break;\r
+            case '+':\r
+              Flags |= PREFIX_SIGN;\r
+              break;\r
+            case ' ':\r
+              Flags |= PREFIX_BLANK;\r
+              break;\r
+            case ',':\r
+              Flags |= COMMA_TYPE;\r
+              break;\r
+            case 'L':\r
+            case 'l':\r
+              Flags |= LONG_TYPE;\r
+              break;\r
+            case '*':\r
+              if ((Flags & PRECISION) == 0) {\r
+                Flags |= PAD_TO_WIDTH;\r
+                if (BaseListMarker == NULL) {\r
+                  Width = VA_ARG (VaListMarker, UINTN);\r
+                } else {\r
+                  Width = BASE_ARG (BaseListMarker, UINTN);\r
+                }\r
+              } else {\r
+                if (BaseListMarker == NULL) {\r
+                  Precision = VA_ARG (VaListMarker, UINTN);\r
+                } else {\r
+                  Precision = BASE_ARG (BaseListMarker, UINTN);\r
+                }\r
+              }\r
+\r
+              break;\r
+            case '0':\r
+              if ((Flags & PRECISION) == 0) {\r
+                Flags |= PREFIX_ZERO;\r
+              }\r
+\r
+            case '1':\r
+            case '2':\r
+            case '3':\r
+            case '4':\r
+            case '5':\r
+            case '6':\r
+            case '7':\r
+            case '8':\r
+            case '9':\r
+              for (Count = 0; ((FormatCharacter >= '0') &&  (FormatCharacter <= '9')); ) {\r
+                Count           = (Count * 10) + FormatCharacter - '0';\r
+                Format         += BytesPerFormatCharacter;\r
+                FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
+              }\r
+\r
+              Format -= BytesPerFormatCharacter;\r
+              if ((Flags & PRECISION) == 0) {\r
+                Flags |= PAD_TO_WIDTH;\r
+                Width  = Count;\r
+              } else {\r
+                Precision = Count;\r
+              }\r
+\r
+              break;\r
+\r
+            case '\0':\r
+              //\r
+              // Make no output if Format string terminates unexpectedly when\r
+              // looking up for flag, width, precision and type.\r
+              //\r
+              Format   -= BytesPerFormatCharacter;\r
+              Precision = 0;\r
+            //\r
+            // break skipped on purpose.\r
+            //\r
+            default:\r
+              Done = TRUE;\r
+              break;\r
+          }\r
+        }\r
+\r
+        //\r
+        // Handle each argument type\r
+        //\r
         switch (FormatCharacter) {\r
-        case '.': \r
-          Flags |= PRECISION; \r
-          break;\r
-        case '-': \r
-          Flags |= LEFT_JUSTIFY; \r
-          break;\r
-        case '+': \r
-          Flags |= PREFIX_SIGN;  \r
-          break;\r
-        case ' ': \r
-          Flags |= PREFIX_BLANK; \r
-          break;\r
-        case ',': \r
-          Flags |= COMMA_TYPE; \r
-          break;\r
-        case 'L':\r
-        case 'l': \r
-          Flags |= LONG_TYPE;    \r
-          break;\r
-        case '*':\r
-          if ((Flags & PRECISION) == 0) {\r
-            Flags |= PAD_TO_WIDTH;\r
-            if (BaseListMarker == NULL) {\r
-              Width = VA_ARG (VaListMarker, UINTN);\r
-            } else {\r
-              Width = BASE_ARG (BaseListMarker, UINTN);\r
-            }\r
-          } else {\r
-            if (BaseListMarker == NULL) {\r
-              Precision = VA_ARG (VaListMarker, UINTN);\r
-            } else {\r
-              Precision = BASE_ARG (BaseListMarker, UINTN);\r
+          case 'p':\r
+            //\r
+            // Flag space, +, 0, L & l are invalid for type p.\r
+            //\r
+            Flags &= ~((UINTN)(PREFIX_BLANK | PREFIX_SIGN | PREFIX_ZERO | LONG_TYPE));\r
+            if (sizeof (VOID *) > 4) {\r
+              Flags |= LONG_TYPE;\r
             }\r
-          }\r
-          break;\r
-        case '0':\r
-          if ((Flags & PRECISION) == 0) {\r
+\r
+          //\r
+          // break skipped on purpose\r
+          //\r
+          case 'X':\r
             Flags |= PREFIX_ZERO;\r
-          }\r
-        case '1':\r
-        case '2':\r
-        case '3':\r
-        case '4':\r
-        case '5':\r
-        case '6':\r
-        case '7':\r
-        case '8':\r
-        case '9':\r
-          for (Count = 0; ((FormatCharacter >= '0') &&  (FormatCharacter <= '9')); ){\r
-            Count = (Count * 10) + FormatCharacter - '0';\r
-            Format += BytesPerFormatCharacter;\r
-            FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
-          }\r
-          Format -= BytesPerFormatCharacter;\r
-          if ((Flags & PRECISION) == 0) {\r
-            Flags |= PAD_TO_WIDTH;\r
-            Width = Count;\r
-          } else {\r
-            Precision = Count;\r
-          }\r
-          break;\r
-       \r
-        case '\0':\r
           //\r
-          // Make no output if Format string terminates unexpectedly when\r
-          // looking up for flag, width, precision and type. \r
+          // break skipped on purpose\r
           //\r
-          Format   -= BytesPerFormatCharacter;\r
-          Precision = 0;\r
+          case 'x':\r
+            Flags |= RADIX_HEX;\r
           //\r
-          // break skipped on purpose.\r
+          // break skipped on purpose\r
           //\r
-        default:\r
-          Done = TRUE;\r
-          break;\r
-        }\r
-      } \r
+          case 'u':\r
+            if ((Flags & RADIX_HEX) == 0) {\r
+              Flags &= ~((UINTN)(PREFIX_SIGN));\r
+              Flags |= UNSIGNED_TYPE;\r
+            }\r
 \r
-      //\r
-      // Handle each argument type\r
-      //\r
-      switch (FormatCharacter) {\r
-      case 'p':\r
-        //\r
-        // Flag space, +, 0, L & l are invalid for type p.\r
-        //\r
-        Flags &= ~((UINTN) (PREFIX_BLANK | PREFIX_SIGN | PREFIX_ZERO | LONG_TYPE));\r
-        if (sizeof (VOID *) > 4) {\r
-          Flags |= LONG_TYPE;\r
-        }\r
-        //\r
-        // break skipped on purpose\r
-        //\r
-      case 'X':\r
-        Flags |= PREFIX_ZERO;\r
-        //\r
-        // break skipped on purpose\r
-        //\r
-      case 'x':\r
-        Flags |= RADIX_HEX;\r
-        //\r
-        // break skipped on purpose\r
-        //\r
-      case 'u':\r
-        if ((Flags & RADIX_HEX) == 0) {\r
-          Flags &= ~((UINTN) (PREFIX_SIGN));\r
-          Flags |= UNSIGNED_TYPE;\r
-        }\r
-        //\r
-        // break skipped on purpose\r
-        //\r
-      case 'd':\r
-        if ((Flags & LONG_TYPE) == 0) {\r
           //\r
-          // 'd', 'u', 'x', and 'X' that are not preceded by 'l' or 'L' are assumed to be type "int".\r
-          // This assumption is made so the format string definition is compatible with the ANSI C\r
-          // Specification for formatted strings.  It is recommended that the Base Types be used \r
-          // everywhere, but in this one case, compliance with ANSI C is more important, and \r
-          // provides an implementation that is compatible with that largest possible set of CPU \r
-          // architectures.  This is why the type "int" is used in this one case.\r
+          // break skipped on purpose\r
           //\r
-          if (BaseListMarker == NULL) {\r
-            Value = VA_ARG (VaListMarker, int);\r
-          } else {\r
-            Value = BASE_ARG (BaseListMarker, int);\r
-          }\r
-        } else {\r
-          if (BaseListMarker == NULL) {\r
-            Value = VA_ARG (VaListMarker, INT64);\r
-          } else {\r
-            Value = BASE_ARG (BaseListMarker, INT64);\r
-          }\r
-        }\r
-        if ((Flags & PREFIX_BLANK) != 0) {\r
-          Prefix = ' ';\r
-        }\r
-        if ((Flags & PREFIX_SIGN) != 0) {\r
-          Prefix = '+';\r
-        }\r
-        if ((Flags & COMMA_TYPE) != 0) {\r
-          Comma = TRUE;\r
-        }\r
-        if ((Flags & RADIX_HEX) == 0) {\r
-          Radix = 10;\r
-          if (Comma) {\r
-            Flags &= ~((UINTN) PREFIX_ZERO);\r
-            Precision = 1;\r
-          }\r
-          if (Value < 0 && (Flags & UNSIGNED_TYPE) == 0) {\r
-            Flags |= PREFIX_SIGN;\r
-            Prefix = '-';\r
-            Value = -Value;\r
-          } else if ((Flags & UNSIGNED_TYPE) != 0 && (Flags & LONG_TYPE) == 0) {\r
+          case 'd':\r
+            if ((Flags & LONG_TYPE) == 0) {\r
+              //\r
+              // 'd', 'u', 'x', and 'X' that are not preceded by 'l' or 'L' are assumed to be type "int".\r
+              // This assumption is made so the format string definition is compatible with the ANSI C\r
+              // Specification for formatted strings.  It is recommended that the Base Types be used\r
+              // everywhere, but in this one case, compliance with ANSI C is more important, and\r
+              // provides an implementation that is compatible with that largest possible set of CPU\r
+              // architectures.  This is why the type "int" is used in this one case.\r
+              //\r
+              if (BaseListMarker == NULL) {\r
+                Value = VA_ARG (VaListMarker, int);\r
+              } else {\r
+                Value = BASE_ARG (BaseListMarker, int);\r
+              }\r
+            } else {\r
+              if (BaseListMarker == NULL) {\r
+                Value = VA_ARG (VaListMarker, INT64);\r
+              } else {\r
+                Value = BASE_ARG (BaseListMarker, INT64);\r
+              }\r
+            }\r
+\r
+            if ((Flags & PREFIX_BLANK) != 0) {\r
+              Prefix = ' ';\r
+            }\r
+\r
+            if ((Flags & PREFIX_SIGN) != 0) {\r
+              Prefix = '+';\r
+            }\r
+\r
+            if ((Flags & COMMA_TYPE) != 0) {\r
+              Comma = TRUE;\r
+            }\r
+\r
+            if ((Flags & RADIX_HEX) == 0) {\r
+              Radix = 10;\r
+              if (Comma) {\r
+                Flags    &= ~((UINTN)PREFIX_ZERO);\r
+                Precision = 1;\r
+              }\r
+\r
+              if ((Value < 0) && ((Flags & UNSIGNED_TYPE) == 0)) {\r
+                Flags |= PREFIX_SIGN;\r
+                Prefix = '-';\r
+                Value  = -Value;\r
+              } else if (((Flags & UNSIGNED_TYPE) != 0) && ((Flags & LONG_TYPE) == 0)) {\r
+                //\r
+                // 'd', 'u', 'x', and 'X' that are not preceded by 'l' or 'L' are assumed to be type "int".\r
+                // This assumption is made so the format string definition is compatible with the ANSI C\r
+                // Specification for formatted strings.  It is recommended that the Base Types be used\r
+                // everywhere, but in this one case, compliance with ANSI C is more important, and\r
+                // provides an implementation that is compatible with that largest possible set of CPU\r
+                // architectures.  This is why the type "unsigned int" is used in this one case.\r
+                //\r
+                Value = (unsigned int)Value;\r
+              }\r
+            } else {\r
+              Radix = 16;\r
+              Comma = FALSE;\r
+              if (((Flags & LONG_TYPE) == 0) && (Value < 0)) {\r
+                //\r
+                // 'd', 'u', 'x', and 'X' that are not preceded by 'l' or 'L' are assumed to be type "int".\r
+                // This assumption is made so the format string definition is compatible with the ANSI C\r
+                // Specification for formatted strings.  It is recommended that the Base Types be used\r
+                // everywhere, but in this one case, compliance with ANSI C is more important, and\r
+                // provides an implementation that is compatible with that largest possible set of CPU\r
+                // architectures.  This is why the type "unsigned int" is used in this one case.\r
+                //\r
+                Value = (unsigned int)Value;\r
+              }\r
+            }\r
+\r
             //\r
-            // 'd', 'u', 'x', and 'X' that are not preceded by 'l' or 'L' are assumed to be type "int".\r
-            // This assumption is made so the format string definition is compatible with the ANSI C\r
-            // Specification for formatted strings.  It is recommended that the Base Types be used \r
-            // everywhere, but in this one case, compliance with ANSI C is more important, and \r
-            // provides an implementation that is compatible with that largest possible set of CPU \r
-            // architectures.  This is why the type "unsigned int" is used in this one case.\r
+            // Convert Value to a reversed string\r
             //\r
-            Value = (unsigned int)Value;\r
-          }\r
-        } else {\r
-          Radix = 16;\r
-          Comma = FALSE;\r
-          if ((Flags & LONG_TYPE) == 0 && Value < 0) {\r
+            Count = BasePrintLibValueToString (ValueBuffer, Value, Radix) - ValueBuffer;\r
+            if ((Value == 0) && (Precision == 0)) {\r
+              Count = 0;\r
+            }\r
+\r
+            ArgumentString = (CHAR8 *)ValueBuffer + Count;\r
+\r
+            Digits = Count % 3;\r
+            if (Digits != 0) {\r
+              Digits = 3 - Digits;\r
+            }\r
+\r
+            if (Comma && (Count != 0)) {\r
+              Count += ((Count - 1) / 3);\r
+            }\r
+\r
+            if (Prefix != 0) {\r
+              Count++;\r
+              Precision++;\r
+            }\r
+\r
+            Flags  |= ARGUMENT_REVERSED;\r
+            ZeroPad = TRUE;\r
+            if ((Flags & PREFIX_ZERO) != 0) {\r
+              if ((Flags & LEFT_JUSTIFY) == 0) {\r
+                if ((Flags & PAD_TO_WIDTH) != 0) {\r
+                  if ((Flags & PRECISION) == 0) {\r
+                    Precision = Width;\r
+                  }\r
+                }\r
+              }\r
+            }\r
+\r
+            break;\r
+\r
+          case 's':\r
+          case 'S':\r
+            Flags |= ARGUMENT_UNICODE;\r
+          //\r
+          // break skipped on purpose\r
+          //\r
+          case 'a':\r
+            if (BaseListMarker == NULL) {\r
+              ArgumentString = VA_ARG (VaListMarker, CHAR8 *);\r
+            } else {\r
+              ArgumentString = BASE_ARG (BaseListMarker, CHAR8 *);\r
+            }\r
+\r
+            if (ArgumentString == NULL) {\r
+              Flags         &= ~((UINTN)ARGUMENT_UNICODE);\r
+              ArgumentString = "<null string>";\r
+            }\r
+\r
             //\r
-            // 'd', 'u', 'x', and 'X' that are not preceded by 'l' or 'L' are assumed to be type "int".\r
-            // This assumption is made so the format string definition is compatible with the ANSI C\r
-            // Specification for formatted strings.  It is recommended that the Base Types be used \r
-            // everywhere, but in this one case, compliance with ANSI C is more important, and \r
-            // provides an implementation that is compatible with that largest possible set of CPU \r
-            // architectures.  This is why the type "unsigned int" is used in this one case.\r
+            // Set the default precision for string to be zero if not specified.\r
             //\r
-            Value = (unsigned int)Value;\r
-          }\r
-        }\r
-        //\r
-        // Convert Value to a reversed string\r
-        //\r
-        Count = BasePrintLibValueToString (ValueBuffer, Value, Radix) - ValueBuffer;\r
-        if (Value == 0 && Precision == 0) {\r
-          Count = 0;\r
-        }\r
-        ArgumentString = (CHAR8 *)ValueBuffer + Count;\r
-        \r
-        Digits = Count % 3;\r
-        if (Digits != 0) {\r
-          Digits = 3 - Digits;\r
-        }\r
-        if (Comma && Count != 0) {\r
-          Count += ((Count - 1) / 3);\r
-        }\r
-        if (Prefix != 0) {\r
-          Count++;\r
-          Precision++;\r
-        }\r
-        Flags |= ARGUMENT_REVERSED;\r
-        ZeroPad = TRUE;\r
-        if ((Flags & PREFIX_ZERO) != 0) {\r
-          if ((Flags & LEFT_JUSTIFY) == 0) {\r
-            if ((Flags & PAD_TO_WIDTH) != 0) {\r
-              if ((Flags & PRECISION) == 0) {\r
-                Precision = Width;\r
+            if ((Flags & PRECISION) == 0) {\r
+              Precision = 0;\r
+            }\r
+\r
+            break;\r
+\r
+          case 'c':\r
+            if (BaseListMarker == NULL) {\r
+              Character = VA_ARG (VaListMarker, UINTN) & 0xffff;\r
+            } else {\r
+              Character = BASE_ARG (BaseListMarker, UINTN) & 0xffff;\r
+            }\r
+\r
+            ArgumentString = (CHAR8 *)&Character;\r
+            Flags         |= ARGUMENT_UNICODE;\r
+            break;\r
+\r
+          case 'g':\r
+            if (BaseListMarker == NULL) {\r
+              TmpGuid = VA_ARG (VaListMarker, GUID *);\r
+            } else {\r
+              TmpGuid = BASE_ARG (BaseListMarker, GUID *);\r
+            }\r
+\r
+            if (TmpGuid == NULL) {\r
+              ArgumentString = "<null guid>";\r
+            } else {\r
+              GuidData1 = ReadUnaligned32 (&(TmpGuid->Data1));\r
+              GuidData2 = ReadUnaligned16 (&(TmpGuid->Data2));\r
+              GuidData3 = ReadUnaligned16 (&(TmpGuid->Data3));\r
+              BasePrintLibSPrint (\r
+                ValueBuffer,\r
+                MAXIMUM_VALUE_CHARACTERS,\r
+                0,\r
+                "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",\r
+                GuidData1,\r
+                GuidData2,\r
+                GuidData3,\r
+                TmpGuid->Data4[0],\r
+                TmpGuid->Data4[1],\r
+                TmpGuid->Data4[2],\r
+                TmpGuid->Data4[3],\r
+                TmpGuid->Data4[4],\r
+                TmpGuid->Data4[5],\r
+                TmpGuid->Data4[6],\r
+                TmpGuid->Data4[7]\r
+                );\r
+              ArgumentString = ValueBuffer;\r
+            }\r
+\r
+            break;\r
+\r
+          case 't':\r
+            if (BaseListMarker == NULL) {\r
+              TmpTime = VA_ARG (VaListMarker, TIME *);\r
+            } else {\r
+              TmpTime = BASE_ARG (BaseListMarker, TIME *);\r
+            }\r
+\r
+            if (TmpTime == NULL) {\r
+              ArgumentString = "<null time>";\r
+            } else {\r
+              BasePrintLibSPrint (\r
+                ValueBuffer,\r
+                MAXIMUM_VALUE_CHARACTERS,\r
+                0,\r
+                "%02d/%02d/%04d  %02d:%02d",\r
+                TmpTime->Month,\r
+                TmpTime->Day,\r
+                TmpTime->Year,\r
+                TmpTime->Hour,\r
+                TmpTime->Minute\r
+                );\r
+              ArgumentString = ValueBuffer;\r
+            }\r
+\r
+            break;\r
+\r
+          case 'r':\r
+            if (BaseListMarker == NULL) {\r
+              Status = VA_ARG (VaListMarker, RETURN_STATUS);\r
+            } else {\r
+              Status = BASE_ARG (BaseListMarker, RETURN_STATUS);\r
+            }\r
+\r
+            ArgumentString = ValueBuffer;\r
+            if (RETURN_ERROR (Status)) {\r
+              //\r
+              // Clear error bit\r
+              //\r
+              Index = Status & ~MAX_BIT;\r
+              if ((Index > 0) && (Index <= ERROR_STATUS_NUMBER)) {\r
+                ArgumentString = mErrorString[Index - 1];\r
+              }\r
+            } else {\r
+              Index = Status;\r
+              if (Index <= WARNING_STATUS_NUMBER) {\r
+                ArgumentString = mWarningString[Index];\r
               }\r
             }\r
-          }\r
-        }\r
-        break;\r
 \r
-      case 's':\r
-      case 'S':\r
-        Flags |= ARGUMENT_UNICODE;\r
-        //\r
-        // break skipped on purpose\r
-        //\r
-      case 'a':\r
-        if (BaseListMarker == NULL) {\r
-          ArgumentString = VA_ARG (VaListMarker, CHAR8 *);\r
-        } else {\r
-          ArgumentString = BASE_ARG (BaseListMarker, CHAR8 *);\r
-        }\r
-        if (ArgumentString == NULL) {\r
-          Flags &= ~((UINTN) ARGUMENT_UNICODE);\r
-          ArgumentString = "<null string>";\r
-        }\r
-        //\r
-        // Set the default precision for string to be zero if not specified.\r
-        //\r
-        if ((Flags & PRECISION) == 0) {\r
-          Precision = 0;\r
-        }\r
-        break;\r
+            if (ArgumentString == ValueBuffer) {\r
+              BasePrintLibSPrint ((CHAR8 *)ValueBuffer, MAXIMUM_VALUE_CHARACTERS, 0, "%08X", Status);\r
+            }\r
 \r
-      case 'c':\r
-        if (BaseListMarker == NULL) {\r
-          Character = VA_ARG (VaListMarker, UINTN) & 0xffff;\r
-        } else {\r
-          Character = BASE_ARG (BaseListMarker, UINTN) & 0xffff;\r
-        }\r
-        ArgumentString = (CHAR8 *)&Character;\r
-        Flags |= ARGUMENT_UNICODE;\r
-        break;\r
+            break;\r
 \r
-      case 'g':\r
-        if (BaseListMarker == NULL) {\r
-          TmpGuid = VA_ARG (VaListMarker, GUID *);\r
-        } else {\r
-          TmpGuid = BASE_ARG (BaseListMarker, GUID *);\r
-        }\r
-        if (TmpGuid == NULL) {\r
-          ArgumentString = "<null guid>";\r
-        } else {\r
-          GuidData1 = ReadUnaligned32 (&(TmpGuid->Data1));\r
-          GuidData2 = ReadUnaligned16 (&(TmpGuid->Data2));\r
-          GuidData3 = ReadUnaligned16 (&(TmpGuid->Data3));\r
-          BasePrintLibSPrint (\r
-            ValueBuffer,\r
-            MAXIMUM_VALUE_CHARACTERS, \r
-            0,\r
-            "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",\r
-            GuidData1,\r
-            GuidData2,\r
-            GuidData3,\r
-            TmpGuid->Data4[0],\r
-            TmpGuid->Data4[1],\r
-            TmpGuid->Data4[2],\r
-            TmpGuid->Data4[3],\r
-            TmpGuid->Data4[4],\r
-            TmpGuid->Data4[5],\r
-            TmpGuid->Data4[6],\r
-            TmpGuid->Data4[7]\r
-            );\r
-          ArgumentString = ValueBuffer;\r
-        }\r
-        break;\r
+          case '\r':\r
+            Format         += BytesPerFormatCharacter;\r
+            FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
+            if (FormatCharacter == '\n') {\r
+              //\r
+              // Translate '\r\n' to '\r\n'\r
+              //\r
+              ArgumentString = "\r\n";\r
+            } else {\r
+              //\r
+              // Translate '\r' to '\r'\r
+              //\r
+              ArgumentString = "\r";\r
+              Format        -= BytesPerFormatCharacter;\r
+            }\r
 \r
-      case 't':\r
-        if (BaseListMarker == NULL) {\r
-          TmpTime = VA_ARG (VaListMarker, TIME *); \r
-        } else {\r
-          TmpTime = BASE_ARG (BaseListMarker, TIME *); \r
-        }\r
-        if (TmpTime == NULL) {\r
-          ArgumentString = "<null time>";\r
-        } else {\r
-          BasePrintLibSPrint (\r
-            ValueBuffer,\r
-            MAXIMUM_VALUE_CHARACTERS,\r
-            0,\r
-            "%02d/%02d/%04d  %02d:%02d",\r
-            TmpTime->Month,\r
-            TmpTime->Day,\r
-            TmpTime->Year,\r
-            TmpTime->Hour,\r
-            TmpTime->Minute\r
-            );\r
-          ArgumentString = ValueBuffer;\r
-        }\r
-        break;\r
+            break;\r
 \r
-      case 'r':\r
-        if (BaseListMarker == NULL) {\r
-          Status = VA_ARG (VaListMarker, RETURN_STATUS);\r
-        } else {\r
-          Status = BASE_ARG (BaseListMarker, RETURN_STATUS);\r
-        }\r
-        ArgumentString = ValueBuffer;\r
-        if (RETURN_ERROR (Status)) {\r
-          //\r
-          // Clear error bit\r
-          //\r
-          Index = Status & ~MAX_BIT;\r
-          if (Index > 0 && Index <= ERROR_STATUS_NUMBER) {\r
-            ArgumentString = mStatusString [Index + WARNING_STATUS_NUMBER];\r
-          }\r
-        } else {\r
-          Index = Status;\r
-          if (Index <= WARNING_STATUS_NUMBER) {\r
-            ArgumentString = mStatusString [Index];\r
-          }\r
-        }\r
-        if (ArgumentString == ValueBuffer) {\r
-          BasePrintLibSPrint ((CHAR8 *) ValueBuffer, MAXIMUM_VALUE_CHARACTERS, 0, "%08X", Status);\r
+          case '\n':\r
+            //\r
+            // Translate '\n' to '\r\n' and '\n\r' to '\r\n'\r
+            //\r
+            ArgumentString  = "\r\n";\r
+            Format         += BytesPerFormatCharacter;\r
+            FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
+            if (FormatCharacter != '\r') {\r
+              Format -= BytesPerFormatCharacter;\r
+            }\r
+\r
+            break;\r
+\r
+          case '%':\r
+          default:\r
+            //\r
+            // if the type is '%' or unknown, then print it to the screen\r
+            //\r
+            ArgumentString = (CHAR8 *)&FormatCharacter;\r
+            Flags         |= ARGUMENT_UNICODE;\r
+            break;\r
         }\r
+\r
         break;\r
 \r
       case '\r':\r
-        Format += BytesPerFormatCharacter;\r
-        FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+        Format         += BytesPerFormatCharacter;\r
+        FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
         if (FormatCharacter == '\n') {\r
           //\r
           // Translate '\r\n' to '\r\n'\r
@@ -1028,78 +1113,41 @@ BasePrintLibSPrintMarker (
           // Translate '\r' to '\r'\r
           //\r
           ArgumentString = "\r";\r
-          Format   -= BytesPerFormatCharacter;\r
+          Format        -= BytesPerFormatCharacter;\r
         }\r
+\r
         break;\r
 \r
       case '\n':\r
         //\r
         // Translate '\n' to '\r\n' and '\n\r' to '\r\n'\r
         //\r
-        ArgumentString = "\r\n";\r
-        Format += BytesPerFormatCharacter;\r
-        FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+        ArgumentString  = "\r\n";\r
+        Format         += BytesPerFormatCharacter;\r
+        FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
         if (FormatCharacter != '\r') {\r
-          Format   -= BytesPerFormatCharacter;\r
+          Format -= BytesPerFormatCharacter;\r
         }\r
+\r
         break;\r
 \r
-      case '%':\r
       default:\r
-        //\r
-        // if the type is '%' or unknown, then print it to the screen\r
-        //\r
         ArgumentString = (CHAR8 *)&FormatCharacter;\r
-        Flags |= ARGUMENT_UNICODE;\r
+        Flags         |= ARGUMENT_UNICODE;\r
         break;\r
-      }\r
-      break;\r
\r
-    case '\r':\r
-      Format += BytesPerFormatCharacter;\r
-      FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
-      if (FormatCharacter == '\n') {\r
-        //\r
-        // Translate '\r\n' to '\r\n'\r
-        //\r
-        ArgumentString = "\r\n";\r
-      } else {\r
-        //\r
-        // Translate '\r' to '\r'\r
-        //\r
-        ArgumentString = "\r";\r
-        Format   -= BytesPerFormatCharacter;\r
-      }\r
-      break;\r
-\r
-    case '\n':\r
-      //\r
-      // Translate '\n' to '\r\n' and '\n\r' to '\r\n'\r
-      //\r
-      ArgumentString = "\r\n";\r
-      Format += BytesPerFormatCharacter;\r
-      FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
-      if (FormatCharacter != '\r') {\r
-        Format   -= BytesPerFormatCharacter;\r
-      }\r
-      break;\r
-\r
-    default:\r
-      ArgumentString = (CHAR8 *)&FormatCharacter;\r
-      Flags |= ARGUMENT_UNICODE;\r
-      break;\r
     }\r
 \r
     //\r
     // Retrieve the ArgumentString attriubutes\r
     //\r
     if ((Flags & ARGUMENT_UNICODE) != 0) {\r
-      ArgumentMask = 0xffff;\r
+      ArgumentMask              = 0xffff;\r
       BytesPerArgumentCharacter = 2;\r
     } else {\r
-      ArgumentMask = 0xff;\r
+      ArgumentMask              = 0xff;\r
       BytesPerArgumentCharacter = 1;\r
     }\r
+\r
     if ((Flags & ARGUMENT_REVERSED) != 0) {\r
       BytesPerArgumentCharacter = -BytesPerArgumentCharacter;\r
     } else {\r
@@ -1107,7 +1155,13 @@ BasePrintLibSPrintMarker (
       // Compute the number of characters in ArgumentString and store it in Count\r
       // ArgumentString is either null-terminated, or it contains Precision characters\r
       //\r
-      for (Count = 0; Count < Precision || ((Flags & PRECISION) == 0); Count++) {\r
+      for (Count = 0;\r
+           (ArgumentString[Count * BytesPerArgumentCharacter] != '\0' ||\r
+            (BytesPerArgumentCharacter > 1 &&\r
+             ArgumentString[Count * BytesPerArgumentCharacter + 1] != '\0')) &&\r
+           (Count < Precision || ((Flags & PRECISION) == 0));\r
+           Count++)\r
+      {\r
         ArgumentCharacter = ((ArgumentString[Count * BytesPerArgumentCharacter] & 0xff) | ((ArgumentString[Count * BytesPerArgumentCharacter + 1]) << 8)) & ArgumentMask;\r
         if (ArgumentCharacter == 0) {\r
           break;\r
@@ -1124,7 +1178,7 @@ BasePrintLibSPrintMarker (
     //\r
     if ((Flags & (PAD_TO_WIDTH | LEFT_JUSTIFY)) == (PAD_TO_WIDTH)) {\r
       LengthToReturn += ((Width - Precision) * BytesPerOutputCharacter);\r
-      if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+      if (((Flags & COUNT_ONLY_NO_PRINT) == 0) && (Buffer != NULL)) {\r
         Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);\r
       }\r
     }\r
@@ -1132,22 +1186,24 @@ BasePrintLibSPrintMarker (
     if (ZeroPad) {\r
       if (Prefix != 0) {\r
         LengthToReturn += (1 * BytesPerOutputCharacter);\r
-        if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+        if (((Flags & COUNT_ONLY_NO_PRINT) == 0) && (Buffer != NULL)) {\r
           Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
         }\r
       }\r
+\r
       LengthToReturn += ((Precision - Count) * BytesPerOutputCharacter);\r
-      if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+      if (((Flags & COUNT_ONLY_NO_PRINT) == 0) && (Buffer != NULL)) {\r
         Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Precision - Count, '0', BytesPerOutputCharacter);\r
       }\r
     } else {\r
       LengthToReturn += ((Precision - Count) * BytesPerOutputCharacter);\r
-      if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+      if (((Flags & COUNT_ONLY_NO_PRINT) == 0) && (Buffer != NULL)) {\r
         Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Precision - Count, ' ', BytesPerOutputCharacter);\r
       }\r
+\r
       if (Prefix != 0) {\r
         LengthToReturn += (1 * BytesPerOutputCharacter);\r
-        if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+        if (((Flags & COUNT_ONLY_NO_PRINT) == 0) && (Buffer != NULL)) {\r
           Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
         }\r
       }\r
@@ -1164,14 +1220,18 @@ BasePrintLibSPrintMarker (
     //\r
     // Copy the string into the output buffer performing the required type conversions\r
     //\r
-    while (Index < Count) {\r
-      ArgumentCharacter = ((*ArgumentString & 0xff) | (*(ArgumentString + 1) << 8)) & ArgumentMask;\r
+    while (Index < Count &&\r
+           (ArgumentString[0] != '\0' ||\r
+            (BytesPerArgumentCharacter > 1 && ArgumentString[1] != '\0')))\r
+    {\r
+      ArgumentCharacter = ((*ArgumentString & 0xff) | (((UINT8)*(ArgumentString + 1)) << 8)) & ArgumentMask;\r
 \r
       LengthToReturn += (1 * BytesPerOutputCharacter);\r
-      if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+      if (((Flags & COUNT_ONLY_NO_PRINT) == 0) && (Buffer != NULL)) {\r
         Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ArgumentCharacter, BytesPerOutputCharacter);\r
       }\r
-      ArgumentString    += BytesPerArgumentCharacter;\r
+\r
+      ArgumentString += BytesPerArgumentCharacter;\r
       Index++;\r
       if (Comma) {\r
         Digits++;\r
@@ -1180,7 +1240,7 @@ BasePrintLibSPrintMarker (
           Index++;\r
           if (Index < Count) {\r
             LengthToReturn += (1 * BytesPerOutputCharacter);\r
-            if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+            if (((Flags & COUNT_ONLY_NO_PRINT) == 0) && (Buffer != NULL)) {\r
               Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', BytesPerOutputCharacter);\r
             }\r
           }\r
@@ -1193,7 +1253,7 @@ BasePrintLibSPrintMarker (
     //\r
     if ((Flags & (PAD_TO_WIDTH | LEFT_JUSTIFY)) == (PAD_TO_WIDTH | LEFT_JUSTIFY)) {\r
       LengthToReturn += ((Width - Precision) * BytesPerOutputCharacter);\r
-      if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+      if (((Flags & COUNT_ONLY_NO_PRINT) == 0) && (Buffer != NULL)) {\r
         Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);\r
       }\r
     }\r
@@ -1206,7 +1266,7 @@ BasePrintLibSPrintMarker (
     //\r
     // Get the next character from the format string\r
     //\r
-    FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
+    FormatCharacter = ((*Format & 0xff) | ((BytesPerFormatCharacter == 1) ? 0 : (*(Format + 1) << 8))) & FormatMask;\r
   }\r
 \r
   if ((Flags & COUNT_ONLY_NO_PRINT) != 0) {\r
@@ -1223,11 +1283,11 @@ BasePrintLibSPrintMarker (
 }\r
 \r
 /**\r
-  Worker function that produces a Null-terminated string in an output buffer \r
+  Worker function that produces a Null-terminated string in an output buffer\r
   based on a Null-terminated format string and variable argument list.\r
 \r
-  VSPrint function to process format and place the results in Buffer. Since a \r
-  VA_LIST is used this routine allows the nesting of Vararg routines. Thus \r
+  VSPrint function to process format and place the results in Buffer. Since a\r
+  VA_LIST is used this routine allows the nesting of Vararg routines. Thus\r
   this is the main print working routine\r
 \r
   @param  StartOfBuffer The character buffer to print the results of the parsing\r