]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/DxePrintLibPrint2Protocol/PrintLib.c
MdeModulePkg: Apply uncrustify changes
[mirror_edk2.git] / MdeModulePkg / Library / DxePrintLibPrint2Protocol / PrintLib.c
index b3e7cb2a25fbd98f8e77df365f1f1634b05730b6..21f8a0beab48e3c8d696ae4c444be115a7ff8ea5 100644 (file)
@@ -1,19 +1,13 @@
 /** @file\r
   Instance of Print Library based on gEfiPrint2SProtocolGuid.\r
 \r
-  Implement the print library instance by wrap the interface \r
+  Implement the print library instance by wrap the interface\r
   provided in the Print2S protocol. This protocol is defined as the internal\r
-  protocol related to this implementation, not in the public spec. So, this \r
+  protocol related to this implementation, not in the public spec. So, this\r
   library instance is only for this code base.\r
 \r
-Copyright (c) 2009 - 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) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -27,13 +21,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/DebugLib.h>\r
 #include <Library/PcdLib.h>\r
 \r
-#define ASSERT_UNICODE_BUFFER(Buffer) ASSERT ((((UINTN) (Buffer)) & 0x01) == 0)\r
+#define ASSERT_UNICODE_BUFFER(Buffer)  ASSERT ((((UINTN) (Buffer)) & 0x01) == 0)\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
@@ -47,29 +41,29 @@ EFI_PRINT2S_PROTOCOL  *mPrint2SProtocol = NULL;
 \r
 /**\r
   The constructor function caches the pointer to Print2S protocol.\r
-  \r
+\r
   The constructor function locates Print2S protocol from protocol database.\r
-  It will ASSERT() if that operation fails and it will always return EFI_SUCCESS. \r
+  It will ASSERT() if that operation fails and it will always return EFI_SUCCESS.\r
 \r
   @param  ImageHandle   The firmware allocated handle for the EFI image.\r
   @param  SystemTable   A pointer to the EFI System Table.\r
-  \r
+\r
   @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 PrintLibConstructor (\r
-  IN EFI_HANDLE                ImageHandle,\r
-  IN EFI_SYSTEM_TABLE          *SystemTable\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  EFI_STATUS                   Status;\r
+  EFI_STATUS  Status;\r
 \r
   Status = SystemTable->BootServices->LocateProtocol (\r
                                         &gEfiPrint2SProtocolGuid,\r
                                         NULL,\r
-                                        (VOID**) &mPrint2SProtocol\r
+                                        (VOID **)&mPrint2SProtocol\r
                                         );\r
   ASSERT_EFI_ERROR (Status);\r
   ASSERT (mPrint2SProtocol != NULL);\r
@@ -77,9 +71,8 @@ PrintLibConstructor (
   return Status;\r
 }\r
 \r
-\r
 /**\r
-  Worker function that converts a VA_LIST to a BASE_LIST based on a Null-terminated \r
+  Worker function that converts a VA_LIST to a BASE_LIST based on a Null-terminated\r
   format string.\r
 \r
   @param  AsciiFormat     TRUE if Format is an ASCII string.  FALSE if Format is a Unicode string.\r
@@ -117,20 +110,22 @@ DxePrintLibPrint2ProtocolVaListToBaseList (
     if (ASCII_RSIZE_MAX != 0) {\r
       SAFE_PRINT_CONSTRAINT_CHECK ((AsciiStrnLenS (Format, ASCII_RSIZE_MAX + 1) <= ASCII_RSIZE_MAX), FALSE);\r
     }\r
+\r
     BytesPerFormatCharacter = 1;\r
-    FormatMask = 0xff;\r
+    FormatMask              = 0xff;\r
   } else {\r
     if (RSIZE_MAX != 0) {\r
       SAFE_PRINT_CONSTRAINT_CHECK ((StrnLenS ((CHAR16 *)Format, RSIZE_MAX + 1) <= RSIZE_MAX), FALSE);\r
     }\r
+\r
     BytesPerFormatCharacter = 2;\r
-    FormatMask = 0xffff;\r
+    FormatMask              = 0xffff;\r
   }\r
 \r
   //\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
   while (FormatCharacter != 0) {\r
     if (FormatCharacter == '%') {\r
@@ -148,85 +143,87 @@ DxePrintLibPrint2ProtocolVaListToBaseList (
         //\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
         switch (FormatCharacter) {\r
-        case '.': \r
-        case '-': \r
-        case '+': \r
-        case ' ': \r
-        case ',': \r
-        case '0':\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
-          break;\r
-        case 'L':\r
-        case 'l': \r
-          Long = TRUE;\r
-          break;\r
-        case '*':\r
-          BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN);\r
-          break;\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
+          case '.':\r
+          case '-':\r
+          case '+':\r
+          case ' ':\r
+          case ',':\r
+          case '0':\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
+            break;\r
+          case 'L':\r
+          case 'l':\r
+            Long = TRUE;\r
+            break;\r
+          case '*':\r
+            BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN);\r
+            break;\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
           //\r
           // break skipped on purpose.\r
           //\r
-        default:\r
-          Done = TRUE;\r
-          break;\r
+          default:\r
+            Done = TRUE;\r
+            break;\r
         }\r
-      } \r
-        \r
+      }\r
+\r
       //\r
       // Handle each argument type\r
       //\r
       switch (FormatCharacter) {\r
-      case 'p':\r
-        if (sizeof (VOID *) > 4) {\r
-          Long = TRUE;\r
-        }\r
-      case 'X':\r
-      case 'x':\r
-      case 'u':\r
-      case 'd':\r
-        if (Long) {\r
-          BASE_ARG (BaseListMarker, INT64) = VA_ARG (VaListMarker, INT64);\r
-        } else {\r
-          BASE_ARG (BaseListMarker, int) = VA_ARG (VaListMarker, int);\r
-        }\r
-        break;\r
-      case 's':\r
-      case 'S':\r
-      case 'a':\r
-      case 'g':\r
-      case 't':\r
-        BASE_ARG (BaseListMarker, VOID *) = VA_ARG (VaListMarker, VOID *);\r
-        break;\r
-      case 'c':\r
-        BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN);\r
-        break;\r
-      case 'r':\r
-        BASE_ARG (BaseListMarker, RETURN_STATUS) = VA_ARG (VaListMarker, RETURN_STATUS);\r
-        break;\r
+        case 'p':\r
+          if (sizeof (VOID *) > 4) {\r
+            Long = TRUE;\r
+          }\r
+\r
+        case 'X':\r
+        case 'x':\r
+        case 'u':\r
+        case 'd':\r
+          if (Long) {\r
+            BASE_ARG (BaseListMarker, INT64) = VA_ARG (VaListMarker, INT64);\r
+          } else {\r
+            BASE_ARG (BaseListMarker, int) = VA_ARG (VaListMarker, int);\r
+          }\r
+\r
+          break;\r
+        case 's':\r
+        case 'S':\r
+        case 'a':\r
+        case 'g':\r
+        case 't':\r
+          BASE_ARG (BaseListMarker, VOID *) = VA_ARG (VaListMarker, VOID *);\r
+          break;\r
+        case 'c':\r
+          BASE_ARG (BaseListMarker, UINTN) = VA_ARG (VaListMarker, UINTN);\r
+          break;\r
+        case 'r':\r
+          BASE_ARG (BaseListMarker, RETURN_STATUS) = VA_ARG (VaListMarker, RETURN_STATUS);\r
+          break;\r
       }\r
     }\r
 \r
     //\r
     // If BASE_LIST is larger than Size, then return FALSE\r
     //\r
-    if ((UINTN)((UINT8 *)BaseListMarker - (UINT8 *)BaseListStart) > Size) {\r
+    if (((UINTN)BaseListMarker - (UINTN)BaseListStart) > Size) {\r
       DEBUG ((DEBUG_ERROR, "The input variable argument list is too long. Please consider breaking into multiple print calls.\n"));\r
       return FALSE;\r
     }\r
@@ -239,8 +236,9 @@ DxePrintLibPrint2ProtocolVaListToBaseList (
     //\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
   return TRUE;\r
 }\r
 \r
@@ -414,8 +412,8 @@ UnicodeSPrint (
   ...\r
   )\r
 {\r
-  VA_LIST Marker;\r
-  UINTN   NumberOfPrinted;\r
+  VA_LIST  Marker;\r
+  UINTN    NumberOfPrinted;\r
 \r
   VA_START (Marker, FormatString);\r
   NumberOfPrinted = UnicodeVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);\r
@@ -589,8 +587,8 @@ UnicodeSPrintAsciiFormat (
   ...\r
   )\r
 {\r
-  VA_LIST Marker;\r
-  UINTN   NumberOfPrinted;\r
+  VA_LIST  Marker;\r
+  UINTN    NumberOfPrinted;\r
 \r
   VA_START (Marker, FormatString);\r
   NumberOfPrinted = UnicodeVSPrintAsciiFormat (StartOfBuffer, BufferSize, FormatString, Marker);\r
@@ -600,69 +598,66 @@ UnicodeSPrintAsciiFormat (
 \r
 /**\r
   Converts a decimal value to a Null-terminated Unicode string.\r
-  \r
-  Converts the decimal number specified by Value to a Null-terminated Unicode \r
-  string specified by Buffer containing at most Width characters. No padding of spaces \r
-  is ever performed. If Width is 0 then a width of MAXIMUM_VALUE_CHARACTERS is assumed.\r
-  The number of Unicode characters in Buffer is returned not including the Null-terminator.\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
-  required to perform the conversion is returned.\r
-  Additional conversion parameters are specified in Flags.  \r
-  \r
+\r
+  Converts the decimal number specified by Value to a Null-terminated Unicode\r
+  string specified by Buffer containing at most Width characters. No padding of\r
+  spaces is ever performed. If Width is 0 then a width of\r
+  MAXIMUM_VALUE_CHARACTERS is assumed. If the conversion contains more than\r
+  Width characters, then only the first Width characters are placed in Buffer.\r
+  Additional conversion parameters are specified in Flags.\r
+\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 RADIX_HEX is set in Flags, then the output buffer will be \r
-  formatted in hexadecimal format.\r
-  If Value is < 0 and RADIX_HEX is not set in Flags, 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
-  sign character, '0' characters, digit characters for Value, and the Null-terminator\r
-  add up to Width characters.\r
-  If both COMMA_TYPE and RADIX_HEX are set in Flags, then ASSERT().\r
-  If Buffer is NULL, then ASSERT().\r
+  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and\r
+  commas are inserted every 3rd digit starting from the right.\r
+  If RADIX_HEX is set in Flags, then the output buffer will be formatted in\r
+  hexadecimal format.\r
+  If Value is < 0 and RADIX_HEX is not set in Flags, then the fist character in\r
+  Buffer is a '-'.\r
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, then\r
+  Buffer is padded with '0' characters so the combination of the optional '-'\r
+  sign character, '0' characters, digit characters for Value, and the\r
+  Null-terminator add up to Width characters.\r
+\r
   If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
-  If unsupported bits are set in Flags, then ASSERT().\r
-  If both COMMA_TYPE and RADIX_HEX are set in Flags, then ASSERT().\r
-  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()\r
-\r
-  @param  Buffer  Pointer to the output buffer for the produced Null-terminated\r
-                  Unicode string.\r
-  @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.\r
-  @param  Value   The 64-bit signed value to convert to a string.\r
-  @param  Width   The maximum number of Unicode characters to place in Buffer, not including\r
-                  the Null-terminator.\r
-  \r
-  @return The number of Unicode characters in Buffer not including the Null-terminator.\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  @param  Buffer      The pointer to the output buffer for the produced\r
+                      Null-terminated Unicode string.\r
+  @param  BufferSize  The size of Buffer in bytes, including the\r
+                      Null-terminator.\r
+  @param  Flags       The bitmask of flags that specify left justification,\r
+                      zero pad, and commas.\r
+  @param  Value       The 64-bit signed value to convert to a string.\r
+  @param  Width       The maximum number of Unicode characters to place in\r
+                      Buffer, not including the Null-terminator.\r
+\r
+  @retval RETURN_SUCCESS           The decimal value is converted.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If BufferSize cannot hold the converted\r
+                                   value.\r
+  @retval RETURN_INVALID_PARAMETER If Buffer is NULL.\r
+                                   If PcdMaximumUnicodeStringLength is not\r
+                                   zero, and BufferSize is greater than\r
+                                   (PcdMaximumUnicodeStringLength *\r
+                                   sizeof (CHAR16) + 1).\r
+                                   If unsupported bits are set in Flags.\r
+                                   If both COMMA_TYPE and RADIX_HEX are set in\r
+                                   Flags.\r
+                                   If Width >= MAXIMUM_VALUE_CHARACTERS.\r
 \r
 **/\r
-UINTN\r
+RETURN_STATUS\r
 EFIAPI\r
-UnicodeValueToString (\r
+UnicodeValueToStringS (\r
   IN OUT CHAR16  *Buffer,\r
+  IN UINTN       BufferSize,\r
   IN UINTN       Flags,\r
   IN INT64       Value,\r
   IN UINTN       Width\r
   )\r
 {\r
-  RETURN_STATUS  Status;\r
-  UINTN          BufferSize;\r
-\r
-  if (Width == 0) {\r
-    BufferSize = (MAXIMUM_VALUE_CHARACTERS + 1) * sizeof (CHAR16);\r
-  } else {\r
-    BufferSize = (Width + 1) * sizeof (CHAR16);\r
-  }\r
-\r
-  Status = mPrint2SProtocol->UnicodeValueToStringS (Buffer, BufferSize, Flags, Value, Width);\r
-  if (RETURN_ERROR (Status)) {\r
-    return 0;\r
-  }\r
-\r
-  return StrnLenS (Buffer, BufferSize / sizeof (CHAR16));\r
+  return mPrint2SProtocol->UnicodeValueToStringS (Buffer, BufferSize, Flags, Value, Width);\r
 }\r
 \r
 /**\r
@@ -705,10 +700,10 @@ UnicodeValueToString (
 UINTN\r
 EFIAPI\r
 AsciiVSPrint (\r
-  OUT CHAR8         *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR8   *FormatString,\r
-  IN  VA_LIST       Marker\r
+  OUT CHAR8        *StartOfBuffer,\r
+  IN  UINTN        BufferSize,\r
+  IN  CONST CHAR8  *FormatString,\r
+  IN  VA_LIST      Marker\r
   )\r
 {\r
   UINT64   BaseListMarker[256 / sizeof (UINT64)];\r
@@ -766,10 +761,10 @@ AsciiVSPrint (
 UINTN\r
 EFIAPI\r
 AsciiBSPrint (\r
-  OUT CHAR8         *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR8   *FormatString,\r
-  IN  BASE_LIST     Marker\r
+  OUT CHAR8        *StartOfBuffer,\r
+  IN  UINTN        BufferSize,\r
+  IN  CONST CHAR8  *FormatString,\r
+  IN  BASE_LIST    Marker\r
   )\r
 {\r
   return mPrint2SProtocol->AsciiBSPrint (StartOfBuffer, BufferSize, FormatString, Marker);\r
@@ -822,8 +817,8 @@ AsciiSPrint (
   ...\r
   )\r
 {\r
-  VA_LIST Marker;\r
-  UINTN   NumberOfPrinted;\r
+  VA_LIST  Marker;\r
+  UINTN    NumberOfPrinted;\r
 \r
   VA_START (Marker, FormatString);\r
   NumberOfPrinted = AsciiVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);\r
@@ -997,8 +992,8 @@ AsciiSPrintUnicodeFormat (
   ...\r
   )\r
 {\r
-  VA_LIST Marker;\r
-  UINTN   NumberOfPrinted;\r
+  VA_LIST  Marker;\r
+  UINTN    NumberOfPrinted;\r
 \r
   VA_START (Marker, FormatString);\r
   NumberOfPrinted = AsciiVSPrintUnicodeFormat (StartOfBuffer, BufferSize, FormatString, Marker);\r
@@ -1006,103 +1001,98 @@ AsciiSPrintUnicodeFormat (
   return NumberOfPrinted;\r
 }\r
 \r
-\r
 /**\r
-  Converts a decimal value to a Null-terminated ASCII string.\r
-  \r
-  Converts the decimal number specified by Value to a Null-terminated ASCII string \r
-  specified by Buffer containing at most Width characters. No padding of spaces \r
-  is ever performed.\r
-  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.\r
-  The number of ASCII characters in Buffer is returned not including the Null-terminator.\r
-  If the conversion contains more than Width characters, then only the first Width\r
-  characters are returned, and the total number of characters required to perform\r
-  the conversion is returned.\r
-  Additional conversion parameters are specified in Flags.  \r
+  Converts a decimal value to a Null-terminated Ascii string.\r
+\r
+  Converts the decimal number specified by Value to a Null-terminated Ascii\r
+  string specified by Buffer containing at most Width characters. No padding of\r
+  spaces is ever performed. If Width is 0 then a width of\r
+  MAXIMUM_VALUE_CHARACTERS is assumed. If the conversion contains more than\r
+  Width characters, then only the first Width characters are placed in Buffer.\r
+  Additional conversion parameters are specified in Flags.\r
+\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 RADIX_HEX is set in Flags, then the output buffer will be \r
-  formatted in hexadecimal format.\r
-  If Value is < 0 and RADIX_HEX is not set in Flags, 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
-  sign character, '0' characters, digit characters for Value, and the Null-terminator\r
-  add up to Width characters.\r
-  \r
-  If Buffer is NULL, then ASSERT().\r
-  If unsupported bits are set in Flags, then ASSERT().\r
-  If both COMMA_TYPE and RADIX_HEX are set in Flags, then ASSERT().\r
-  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()\r
-\r
-  @param  Buffer  Pointer to the output buffer for the produced Null-terminated\r
-                  ASCII string.\r
-  @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.\r
-  @param  Value   The 64-bit signed value to convert to a string.\r
-  @param  Width   The maximum number of ASCII characters to place in Buffer, not including\r
-                  the Null-terminator.\r
-  \r
-  @return The number of ASCII characters in Buffer not including the Null-terminator.\r
+  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and\r
+  commas are inserted every 3rd digit starting from the right.\r
+  If RADIX_HEX is set in Flags, then the output buffer will be formatted in\r
+  hexadecimal format.\r
+  If Value is < 0 and RADIX_HEX is not set in Flags, then the fist character in\r
+  Buffer is a '-'.\r
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, then\r
+  Buffer is padded with '0' characters so the combination of the optional '-'\r
+  sign character, '0' characters, digit characters for Value, and the\r
+  Null-terminator add up to Width characters.\r
+\r
+  If an error would be returned, then the function will ASSERT().\r
+\r
+  @param  Buffer      The pointer to the output buffer for the produced\r
+                      Null-terminated Ascii string.\r
+  @param  BufferSize  The size of Buffer in bytes, including the\r
+                      Null-terminator.\r
+  @param  Flags       The bitmask of flags that specify left justification,\r
+                      zero pad, and commas.\r
+  @param  Value       The 64-bit signed value to convert to a string.\r
+  @param  Width       The maximum number of Ascii characters to place in\r
+                      Buffer, not including the Null-terminator.\r
+\r
+  @retval RETURN_SUCCESS           The decimal value is converted.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If BufferSize cannot hold the converted\r
+                                   value.\r
+  @retval RETURN_INVALID_PARAMETER If Buffer is NULL.\r
+                                   If PcdMaximumAsciiStringLength is not\r
+                                   zero, and BufferSize is greater than\r
+                                   PcdMaximumAsciiStringLength.\r
+                                   If unsupported bits are set in Flags.\r
+                                   If both COMMA_TYPE and RADIX_HEX are set in\r
+                                   Flags.\r
+                                   If Width >= MAXIMUM_VALUE_CHARACTERS.\r
 \r
 **/\r
-UINTN\r
+RETURN_STATUS\r
 EFIAPI\r
-AsciiValueToString (\r
-  OUT CHAR8      *Buffer,\r
-  IN  UINTN      Flags,\r
-  IN  INT64      Value,\r
-  IN  UINTN      Width\r
+AsciiValueToStringS (\r
+  IN OUT CHAR8  *Buffer,\r
+  IN UINTN      BufferSize,\r
+  IN UINTN      Flags,\r
+  IN INT64      Value,\r
+  IN UINTN      Width\r
   )\r
 {\r
-  RETURN_STATUS  Status;\r
-  UINTN          BufferSize;\r
-\r
-  if (Width == 0) {\r
-    BufferSize = (MAXIMUM_VALUE_CHARACTERS + 1) * sizeof (CHAR8);\r
-  } else {\r
-    BufferSize = (Width + 1) * sizeof (CHAR8);\r
-  }\r
-\r
-  Status = mPrint2SProtocol->AsciiValueToStringS (Buffer, BufferSize, Flags, Value, Width);\r
-  if (RETURN_ERROR (Status)) {\r
-    return 0;\r
-  }\r
-\r
-  return AsciiStrnLenS (Buffer, BufferSize / sizeof (CHAR8));\r
+  return mPrint2SProtocol->AsciiValueToStringS (Buffer, BufferSize, Flags, Value, Width);\r
 }\r
 \r
-#define PREFIX_SIGN           BIT1\r
-#define PREFIX_BLANK          BIT2\r
-#define LONG_TYPE             BIT4\r
-#define OUTPUT_UNICODE        BIT6\r
-#define FORMAT_UNICODE        BIT8\r
-#define PAD_TO_WIDTH          BIT9\r
-#define ARGUMENT_UNICODE      BIT10\r
-#define PRECISION             BIT11\r
-#define ARGUMENT_REVERSED     BIT12\r
-#define COUNT_ONLY_NO_PRINT   BIT13\r
-#define UNSIGNED_TYPE         BIT14\r
+#define PREFIX_SIGN          BIT1\r
+#define PREFIX_BLANK         BIT2\r
+#define LONG_TYPE            BIT4\r
+#define OUTPUT_UNICODE       BIT6\r
+#define FORMAT_UNICODE       BIT8\r
+#define PAD_TO_WIDTH         BIT9\r
+#define ARGUMENT_UNICODE     BIT10\r
+#define PRECISION            BIT11\r
+#define ARGUMENT_REVERSED    BIT12\r
+#define COUNT_ONLY_NO_PRINT  BIT13\r
+#define UNSIGNED_TYPE        BIT14\r
 \r
 //\r
 // Record date and time information\r
 //\r
 typedef struct {\r
-  UINT16  Year;\r
-  UINT8   Month;\r
-  UINT8   Day;\r
-  UINT8   Hour;\r
-  UINT8   Minute;\r
-  UINT8   Second;\r
-  UINT8   Pad1;\r
-  UINT32  Nanosecond;\r
-  INT16   TimeZone;\r
-  UINT8   Daylight;\r
-  UINT8   Pad2;\r
+  UINT16    Year;\r
+  UINT8     Month;\r
+  UINT8     Day;\r
+  UINT8     Hour;\r
+  UINT8     Minute;\r
+  UINT8     Second;\r
+  UINT8     Pad1;\r
+  UINT32    Nanosecond;\r
+  INT16     TimeZone;\r
+  UINT8     Daylight;\r
+  UINT8     Pad2;\r
 } TIME;\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
 /**\r
   Internal function that convert a number to a string in Buffer.\r
@@ -1118,8 +1108,8 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mHexStr[] = {'0','1','2','3','4','5','
 **/\r
 CHAR8 *\r
 InternalPrintLibValueToString (\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
@@ -1130,7 +1120,7 @@ InternalPrintLibValueToString (
   //\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
@@ -1141,21 +1131,21 @@ InternalPrintLibValueToString (
 }\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
@@ -1174,16 +1164,16 @@ InternalPrintLibSPrintMarker (
   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
 /**\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
@@ -1217,10 +1207,10 @@ InternalPrintLibSPrint (
   return NumberOfPrinted;\r
 }\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
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 * CONST mStatusString[] = {\r
+GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *CONST  mStatusString[] = {\r
   "Success",                      //  RETURN_SUCCESS                = 0\r
   "Warning Unknown Glyph",        //  RETURN_WARN_UNKNOWN_GLYPH     = 1\r
   "Warning Delete Failure",       //  RETURN_WARN_DELETE_FAILURE    = 2\r
@@ -1269,7 +1259,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
@@ -1280,20 +1270,21 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 * CONST mStatusString[] = {
 **/\r
 CHAR8 *\r
 InternalPrintLibFillBuffer (\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
@@ -1301,21 +1292,21 @@ InternalPrintLibFillBuffer (
 }\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
@@ -1334,44 +1325,44 @@ InternalPrintLibSPrintMarker (
   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
@@ -1399,11 +1390,13 @@ InternalPrintLibSPrintMarker (
     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
@@ -1415,14 +1408,16 @@ InternalPrintLibSPrintMarker (
     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
@@ -1439,7 +1434,7 @@ InternalPrintLibSPrintMarker (
   }\r
 \r
   LengthToReturn = 0;\r
-  EndBuffer = NULL;\r
+  EndBuffer      = NULL;\r
   OriginalBuffer = NULL;\r
 \r
   //\r
@@ -1458,7 +1453,7 @@ InternalPrintLibSPrintMarker (
   //\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
@@ -1467,10 +1462,11 @@ InternalPrintLibSPrintMarker (
     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
@@ -1484,345 +1480,416 @@ InternalPrintLibSPrintMarker (
     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 = InternalPrintLibValueToString (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 = InternalPrintLibValueToString (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
+              InternalPrintLibSPrint (\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
+              InternalPrintLibSPrint (\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 = mStatusString[Index + WARNING_STATUS_NUMBER];\r
+              }\r
+            } else {\r
+              Index = Status;\r
+              if (Index <= WARNING_STATUS_NUMBER) {\r
+                ArgumentString = mStatusString[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
+              InternalPrintLibSPrint ((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
-          InternalPrintLibSPrint (\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
-          InternalPrintLibSPrint (\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
-          InternalPrintLibSPrint ((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
@@ -1833,78 +1900,41 @@ InternalPrintLibSPrintMarker (
           // 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
@@ -1912,7 +1942,13 @@ InternalPrintLibSPrintMarker (
       // 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
@@ -1929,7 +1965,7 @@ InternalPrintLibSPrintMarker (
     //\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 = InternalPrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);\r
       }\r
     }\r
@@ -1937,22 +1973,24 @@ InternalPrintLibSPrintMarker (
     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 = InternalPrintLibFillBuffer (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 = InternalPrintLibFillBuffer (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 = InternalPrintLibFillBuffer (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 = InternalPrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
         }\r
       }\r
@@ -1969,14 +2007,18 @@ InternalPrintLibSPrintMarker (
     //\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 = InternalPrintLibFillBuffer (Buffer, EndBuffer, 1, ArgumentCharacter, BytesPerOutputCharacter);\r
       }\r
-      ArgumentString    += BytesPerArgumentCharacter;\r
+\r
+      ArgumentString += BytesPerArgumentCharacter;\r
       Index++;\r
       if (Comma) {\r
         Digits++;\r
@@ -1985,7 +2027,7 @@ InternalPrintLibSPrintMarker (
           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 = InternalPrintLibFillBuffer (Buffer, EndBuffer, 1, ',', BytesPerOutputCharacter);\r
             }\r
           }\r
@@ -1998,7 +2040,7 @@ InternalPrintLibSPrintMarker (
     //\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 = InternalPrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);\r
       }\r
     }\r
@@ -2011,7 +2053,7 @@ InternalPrintLibSPrintMarker (
     //\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
@@ -2028,7 +2070,7 @@ InternalPrintLibSPrintMarker (
 }\r
 \r
 /**\r
-  Returns the number of characters that would be produced by if the formatted \r
+  Returns the number of characters that would be produced by if the formatted\r
   output were produced not including the Null-terminator.\r
 \r
   If FormatString is not aligned on a 16-bit boundary, then ASSERT().\r
@@ -2041,13 +2083,13 @@ InternalPrintLibSPrintMarker (
   @param[in]  FormatString    A Null-terminated Unicode format string.\r
   @param[in]  Marker          VA_LIST marker for the variable argument list.\r
 \r
-  @return The number of characters that would be produced, not including the \r
+  @return The number of characters that would be produced, not including the\r
           Null-terminator.\r
 **/\r
 UINTN\r
 EFIAPI\r
 SPrintLength (\r
-  IN  CONST CHAR16   *FormatString,\r
+  IN  CONST CHAR16  *FormatString,\r
   IN  VA_LIST       Marker\r
   )\r
 {\r
@@ -2056,7 +2098,7 @@ SPrintLength (
 }\r
 \r
 /**\r
-  Returns the number of characters that would be produced by if the formatted \r
+  Returns the number of characters that would be produced by if the formatted\r
   output were produced not including the Null-terminator.\r
 \r
   If FormatString is NULL, then ASSERT() and 0 is returned.\r
@@ -2067,14 +2109,14 @@ SPrintLength (
   @param[in]  FormatString    A Null-terminated ASCII format string.\r
   @param[in]  Marker          VA_LIST marker for the variable argument list.\r
 \r
-  @return The number of characters that would be produced, not including the \r
+  @return The number of characters that would be produced, not including the\r
           Null-terminator.\r
 **/\r
 UINTN\r
 EFIAPI\r
 SPrintLengthAsciiFormat (\r
-  IN  CONST CHAR8   *FormatString,\r
-  IN  VA_LIST       Marker\r
+  IN  CONST CHAR8  *FormatString,\r
+  IN  VA_LIST      Marker\r
   )\r
 {\r
   return InternalPrintLibSPrintMarker (NULL, 0, OUTPUT_UNICODE | COUNT_ONLY_NO_PRINT, (CHAR8 *)FormatString, Marker, NULL);\r