]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkPkg/Library/FrameworkUefiLib/UefiLibPrint.c
Remove IntelFrameworkModulePkg
[mirror_edk2.git] / IntelFrameworkPkg / Library / FrameworkUefiLib / UefiLibPrint.c
index 7557c938f653fcaf1611747872dfebdb264a0fb5..681dfdfba1191f1706052d19d10bb5cff6321e9d 100644 (file)
@@ -2,14 +2,8 @@
   Mde UEFI library API implementation.\r
   Print to StdErr or ConOut defined in EFI_SYSTEM_TABLE\r
 \r
-  Copyright (c) 2007 - 2009, Intel Corporation<BR>\r
-  All rights reserved. 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) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -59,12 +53,14 @@ InternalPrint (
   IN  VA_LIST                          Marker\r
   )\r
 {\r
+  EFI_STATUS  Status;\r
   UINTN   Return;\r
   CHAR16  *Buffer;\r
   UINTN   BufferSize;\r
 \r
   ASSERT (Format != NULL);\r
   ASSERT (((UINTN) Format & BIT0) == 0);\r
+  ASSERT (Console != NULL);\r
 \r
   BufferSize = (PcdGet32 (PcdUefiLibMaxPrintBufferSize) + 1) * sizeof (CHAR16);\r
 \r
@@ -77,7 +73,10 @@ InternalPrint (
     //\r
     // To be extra safe make sure Console has been initialized\r
     //\r
-    Console->OutputString (Console, Buffer);\r
+    Status = Console->OutputString (Console, Buffer);\r
+    if (EFI_ERROR (Status)) {\r
+      Return = 0;\r
+    }\r
   }\r
 \r
   FreePool (Buffer);\r
@@ -85,22 +84,23 @@ InternalPrint (
   return Return;\r
 }\r
 \r
-/** \r
-  Prints a formatted Unicode string to the console output device specified by \r
+/**\r
+  Prints a formatted Unicode string to the console output device specified by\r
   ConOut defined in the EFI_SYSTEM_TABLE.\r
 \r
-  This function prints a formatted Unicode string to the console output device \r
-  specified by ConOut in EFI_SYSTEM_TABLE and returns the number of Unicode \r
-  characters that printed to ConOut.  If the length of the formatted Unicode \r
-  string is greater than PcdUefiLibMaxPrintBufferSize, then only the first \r
+  This function prints a formatted Unicode string to the console output device\r
+  specified by ConOut in EFI_SYSTEM_TABLE and returns the number of Unicode\r
+  characters that printed to ConOut.  If the length of the formatted Unicode\r
+  string is greater than PcdUefiLibMaxPrintBufferSize, then only the first\r
   PcdUefiLibMaxPrintBufferSize characters are sent to ConOut.\r
   If Format is NULL, then ASSERT().\r
   If Format is not aligned on a 16-bit boundary, then ASSERT().\r
+  If gST->ConOut is NULL, then ASSERT().\r
 \r
   @param Format   Null-terminated Unicode format string.\r
-  @param ...      Variable argument list whose contents are accessed based \r
+  @param ...      Variable argument list whose contents are accessed based\r
                   on the format string specified by Format.\r
-  \r
+\r
   @return Number of Unicode characters printed to ConOut.\r
 \r
 **/\r
@@ -123,22 +123,23 @@ Print (
   return Return;\r
 }\r
 \r
-/** \r
-  Prints a formatted Unicode string to the console output device specified by \r
+/**\r
+  Prints a formatted Unicode string to the console output device specified by\r
   StdErr defined in the EFI_SYSTEM_TABLE.\r
 \r
-  This function prints a formatted Unicode string to the console output device \r
-  specified by StdErr in EFI_SYSTEM_TABLE and returns the number of Unicode \r
-  characters that printed to StdErr.  If the length of the formatted Unicode \r
-  string is greater than PcdUefiLibMaxPrintBufferSize, then only the first \r
+  This function prints a formatted Unicode string to the console output device\r
+  specified by StdErr in EFI_SYSTEM_TABLE and returns the number of Unicode\r
+  characters that printed to StdErr.  If the length of the formatted Unicode\r
+  string is greater than PcdUefiLibMaxPrintBufferSize, then only the first\r
   PcdUefiLibMaxPrintBufferSize characters are sent to StdErr.\r
   If Format is NULL, then ASSERT().\r
   If Format is not aligned on a 16-bit boundary, then ASSERT().\r
+  If gST->StdErr is NULL, then ASSERT().\r
 \r
   @param Format   Null-terminated Unicode format string.\r
-  @param ...      Variable argument list whose contents are accessed based \r
+  @param ...      Variable argument list whose contents are accessed based\r
                   on the format string specified by Format.\r
-  \r
+\r
   @return Number of Unicode characters printed to StdErr.\r
 \r
 **/\r
@@ -188,11 +189,13 @@ AsciiInternalPrint (
   IN  VA_LIST                          Marker\r
   )\r
 {\r
+  EFI_STATUS  Status;\r
   UINTN   Return;\r
   CHAR16  *Buffer;\r
   UINTN   BufferSize;\r
 \r
   ASSERT (Format != NULL);\r
+  ASSERT (Console != NULL);\r
 \r
   BufferSize = (PcdGet32 (PcdUefiLibMaxPrintBufferSize) + 1) * sizeof (CHAR16);\r
 \r
@@ -205,7 +208,10 @@ AsciiInternalPrint (
     //\r
     // To be extra safe make sure Console has been initialized\r
     //\r
-    Console->OutputString (Console, Buffer);\r
+    Status = Console->OutputString (Console, Buffer);\r
+    if (EFI_ERROR (Status)) {\r
+      Return = 0;\r
+    }\r
   }\r
 \r
   FreePool (Buffer);\r
@@ -213,21 +219,22 @@ AsciiInternalPrint (
   return Return;\r
 }\r
 \r
-/** \r
-  Prints a formatted ASCII string to the console output device specified by \r
+/**\r
+  Prints a formatted ASCII string to the console output device specified by\r
   ConOut defined in the EFI_SYSTEM_TABLE.\r
 \r
-  This function prints a formatted ASCII string to the console output device \r
-  specified by ConOut in EFI_SYSTEM_TABLE and returns the number of ASCII \r
-  characters that printed to ConOut.  If the length of the formatted ASCII \r
-  string is greater than PcdUefiLibMaxPrintBufferSize, then only the first \r
+  This function prints a formatted ASCII string to the console output device\r
+  specified by ConOut in EFI_SYSTEM_TABLE and returns the number of ASCII\r
+  characters that printed to ConOut.  If the length of the formatted ASCII\r
+  string is greater than PcdUefiLibMaxPrintBufferSize, then only the first\r
   PcdUefiLibMaxPrintBufferSize characters are sent to ConOut.\r
   If Format is NULL, then ASSERT().\r
+  If gST->ConOut is NULL, then ASSERT().\r
 \r
   @param Format   Null-terminated ASCII format string.\r
-  @param ...      Variable argument list whose contents are accessed based \r
+  @param ...      Variable argument list whose contents are accessed based\r
                   on the format string specified by Format.\r
-  \r
+\r
   @return Number of ASCII characters printed to ConOut.\r
 \r
 **/\r
@@ -251,21 +258,22 @@ AsciiPrint (
   return Return;\r
 }\r
 \r
-/** \r
-  Prints a formatted ASCII string to the console output device specified by \r
+/**\r
+  Prints a formatted ASCII string to the console output device specified by\r
   StdErr defined in the EFI_SYSTEM_TABLE.\r
 \r
-  This function prints a formatted ASCII string to the console output device \r
-  specified by StdErr in EFI_SYSTEM_TABLE and returns the number of ASCII \r
-  characters that printed to StdErr.  If the length of the formatted ASCII \r
-  string is greater than PcdUefiLibMaxPrintBufferSize, then only the first \r
+  This function prints a formatted ASCII string to the console output device\r
+  specified by StdErr in EFI_SYSTEM_TABLE and returns the number of ASCII\r
+  characters that printed to StdErr.  If the length of the formatted ASCII\r
+  string is greater than PcdUefiLibMaxPrintBufferSize, then only the first\r
   PcdUefiLibMaxPrintBufferSize characters are sent to StdErr.\r
   If Format is NULL, then ASSERT().\r
+  If gST->StdErr is NULL, then ASSERT().\r
 \r
   @param Format   Null-terminated ASCII format string.\r
-  @param ...      Variable argument list whose contents are accessed based \r
+  @param ...      Variable argument list whose contents are accessed based\r
                   on the format string specified by Format.\r
-  \r
+\r
   @return Number of ASCII characters printed to ConErr.\r
 \r
 **/\r
@@ -347,6 +355,9 @@ InternalPrintGraphic (
   EFI_UGA_DRAW_PROTOCOL               *UgaDraw;\r
   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL     *Sto;\r
   EFI_HANDLE                          ConsoleHandle;\r
+  UINTN                               Width;\r
+  UINTN                               Height;\r
+  UINTN                               Delta;\r
 \r
   HorizontalResolution  = 0;\r
   VerticalResolution    = 0;\r
@@ -355,6 +366,8 @@ InternalPrintGraphic (
 \r
   ConsoleHandle = gST->ConsoleOutHandle;\r
 \r
+  ASSERT( ConsoleHandle != NULL);\r
+\r
   Status = gBS->HandleProtocol (\r
                   ConsoleHandle,\r
                   &gEfiGraphicsOutputProtocolGuid,\r
@@ -455,7 +468,14 @@ InternalPrintGraphic (
   } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     ASSERT (UgaDraw!= NULL);\r
 \r
-    Blt->Image.Bitmap = AllocateZeroPool (Blt->Width * Blt->Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
+    //\r
+    // Ensure Width * Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow.\r
+    //\r
+    if (Blt->Width > DivU64x32 (MAX_UINTN, Blt->Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))) {\r
+      goto Error;\r
+    }\r
+\r
+    Blt->Image.Bitmap = AllocateZeroPool ((UINT32) Blt->Width * Blt->Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
     ASSERT (Blt->Image.Bitmap != NULL);\r
 \r
     //\r
@@ -464,7 +484,9 @@ InternalPrintGraphic (
     //\r
     Status = HiiFont->StringToImage (\r
                          HiiFont,\r
-                         EFI_HII_IGNORE_IF_NO_GLYPH,\r
+                         EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_OUT_FLAG_CLIP |\r
+                         EFI_HII_OUT_FLAG_CLIP_CLEAN_X | EFI_HII_OUT_FLAG_CLIP_CLEAN_Y |\r
+                         EFI_HII_IGNORE_LINE_BREAK,\r
                          Buffer,\r
                          &FontInfo,\r
                          &Blt,\r
@@ -478,11 +500,20 @@ InternalPrintGraphic (
     if (!EFI_ERROR (Status)) {\r
       ASSERT (RowInfoArray != NULL);\r
       //\r
-      // Line breaks are handled by caller of DrawUnicodeWeightAtCursorN, so the updated parameter RowInfoArraySize by StringToImage will\r
+      // Explicit Line break characters are ignored, so the updated parameter RowInfoArraySize by StringToImage will\r
       // always be 1 or 0 (if there is no valid Unicode Char can be printed). ASSERT here to make sure.\r
       //\r
       ASSERT (RowInfoArraySize <= 1);\r
 \r
+      if (RowInfoArraySize != 0) {\r
+        Width  = RowInfoArray[0].LineWidth;\r
+        Height = RowInfoArray[0].LineHeight;\r
+        Delta  = Blt->Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
+      } else {\r
+        Width  = 0;\r
+        Height = 0;\r
+        Delta  = 0;\r
+      }\r
       Status = UgaDraw->Blt (\r
                           UgaDraw,\r
                           (EFI_UGA_PIXEL *) Blt->Image.Bitmap,\r
@@ -491,9 +522,9 @@ InternalPrintGraphic (
                           PointY,\r
                           PointX,\r
                           PointY,\r
-                          RowInfoArray[0].LineWidth,\r
-                          RowInfoArray[0].LineHeight,\r
-                          Blt->Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+                          Width,\r
+                          Height,\r
+                          Delta\r
                           );\r
     } else {\r
       goto Error;\r
@@ -505,7 +536,11 @@ InternalPrintGraphic (
   //\r
   // Calculate the number of actual printed characters\r
   //\r
+  if (RowInfoArraySize != 0) {\r
   PrintNum = RowInfoArray[0].EndIndex - RowInfoArray[0].StartIndex + 1;\r
+  } else {\r
+    PrintNum = 0;\r
+  }\r
 \r
   FreePool (RowInfoArray);\r
   FreePool (Blt);\r
@@ -519,25 +554,28 @@ Error:
 }\r
 \r
 /**\r
-  Prints a formatted Unicode string to a graphics console device specified by \r
+  Prints a formatted Unicode string to a graphics console device specified by\r
   ConsoleOutputHandle defined in the EFI_SYSTEM_TABLE at the given (X,Y) coordinates.\r
 \r
-  This function prints a formatted Unicode string to the graphics console device \r
-  specified by ConsoleOutputHandle in EFI_SYSTEM_TABLE and returns the number of \r
-  Unicode characters displayed, not including partial characters that may be clipped \r
+  This function prints a formatted Unicode string to the graphics console device\r
+  specified by ConsoleOutputHandle in EFI_SYSTEM_TABLE and returns the number of\r
+  Unicode characters displayed, not including partial characters that may be clipped\r
   by the right edge of the display.  If the length of the formatted Unicode string is\r
-  greater than PcdUefiLibMaxPrintBufferSize, then at most the first \r
-  PcdUefiLibMaxPrintBufferSize characters are printed.  The EFI_HII_FONT_PROTOCOL\r
-  is used to convert the string to a bitmap using the glyphs registered with the \r
-  HII database.  No wrapping is performed, so any portions of the string the fall\r
-  outside the active display region will not be displayed.\r
+  greater than PcdUefiLibMaxPrintBufferSize, then at most the first\r
+  PcdUefiLibMaxPrintBufferSize characters are printed.The EFI_HII_FONT_PROTOCOL\r
+  StringToImage() service is used to convert the string to a bitmap using the glyphs\r
+  registered with the HII database. No wrapping is performed, so any portions of the\r
+  string the fall outside the active display region will not be displayed. Please see\r
+  Section 27.2.6 of the UEFI Specification for a description of the supported string\r
+  format including the set of control codes supported by the StringToImage() service.\r
 \r
-  If a graphics console device is not associated with the ConsoleOutputHandle \r
+  If a graphics console device is not associated with the ConsoleOutputHandle\r
   defined in the EFI_SYSTEM_TABLE then no string is printed, and 0 is returned.\r
-  If the EFI_HII_FONT_PROTOCOL is not present in the handle database, then no \r
+  If the EFI_HII_FONT_PROTOCOL is not present in the handle database, then no\r
   string is printed, and 0 is returned.\r
   If Format is NULL, then ASSERT().\r
   If Format is not aligned on a 16-bit boundary, then ASSERT().\r
+  If gST->ConsoleOutputHandle is NULL, then ASSERT().\r
 \r
   @param  PointX       X coordinate to print the string.\r
   @param  PointY       Y coordinate to print the string.\r
@@ -546,13 +584,13 @@ Error:
                        then the foreground color of the current ConOut device\r
                        in the EFI_SYSTEM_TABLE is used.\r
   @param  BackGround   The background color of the string being printed.  This is\r
-                       an optional parameter that may be NULL.  If it is NULL, \r
+                       an optional parameter that may be NULL.  If it is NULL,\r
                        then the background color of the current ConOut device\r
                        in the EFI_SYSTEM_TABLE is used.\r
-  @param  Format       Null-terminated Unicode format string.  See Print Library \r
+  @param  Format       Null-terminated Unicode format string.  See Print Library\r
                        for the supported format string syntax.\r
-  @param  ...          Variable argument list whose contents are accessed based on \r
-                       the format string specified by Format.         \r
+  @param  ...          Variable argument list whose contents are accessed based on\r
+                       the format string specified by Format.\r
 \r
   @return  The number of Unicode characters printed.\r
 \r
@@ -586,6 +624,8 @@ PrintXY (
 \r
   PrintNum = UnicodeVSPrint (Buffer, BufferSize, Format, Marker);\r
 \r
+  VA_END (Marker);\r
+\r
   ReturnNum = InternalPrintGraphic (PointX, PointY, ForeGround, BackGround, Buffer, PrintNum);\r
 \r
   FreePool (Buffer);\r
@@ -594,24 +634,27 @@ PrintXY (
 }\r
 \r
 /**\r
-  Prints a formatted ASCII string to a graphics console device specified by \r
+  Prints a formatted ASCII string to a graphics console device specified by\r
   ConsoleOutputHandle defined in the EFI_SYSTEM_TABLE at the given (X,Y) coordinates.\r
 \r
-  This function prints a formatted ASCII string to the graphics console device \r
-  specified by ConsoleOutputHandle in EFI_SYSTEM_TABLE and returns the number of \r
-  ASCII characters displayed, not including partial characters that may be clipped \r
+  This function prints a formatted ASCII string to the graphics console device\r
+  specified by ConsoleOutputHandle in EFI_SYSTEM_TABLE and returns the number of\r
+  ASCII characters displayed, not including partial characters that may be clipped\r
   by the right edge of the display.  If the length of the formatted ASCII string is\r
-  greater than PcdUefiLibMaxPrintBufferSize, then at most the first \r
-  PcdUefiLibMaxPrintBufferSize characters are printed.  The EFI_HII_FONT_PROTOCOL\r
-  is used to convert the string to a bitmap using the glyphs registered with the \r
-  HII database.  No wrapping is performed, so any portions of the string the fall\r
-  outside the active display region will not be displayed.\r
+  greater than PcdUefiLibMaxPrintBufferSize, then at most the first\r
+  PcdUefiLibMaxPrintBufferSize characters are printed.The EFI_HII_FONT_PROTOCOL\r
+  StringToImage() service is used to convert the string to a bitmap using the glyphs\r
+  registered with the HII database. No wrapping is performed, so any portions of the\r
+  string the fall outside the active display region will not be displayed. Please see\r
+  Section 27.2.6 of the UEFI Specification for a description of the supported string\r
+  format including the set of control codes supported by the StringToImage() service.\r
 \r
-  If a graphics console device is not associated with the ConsoleOutputHandle \r
+  If a graphics console device is not associated with the ConsoleOutputHandle\r
   defined in the EFI_SYSTEM_TABLE then no string is printed, and 0 is returned.\r
-  If the EFI_HII_FONT_PROTOCOL is not present in the handle database, then no \r
+  If the EFI_HII_FONT_PROTOCOL is not present in the handle database, then no\r
   string is printed, and 0 is returned.\r
   If Format is NULL, then ASSERT().\r
+  If gST->ConsoleOutputHandle is NULL, then ASSERT().\r
 \r
   @param  PointX       X coordinate to print the string.\r
   @param  PointY       Y coordinate to print the string.\r
@@ -620,13 +663,13 @@ PrintXY (
                        then the foreground color of the current ConOut device\r
                        in the EFI_SYSTEM_TABLE is used.\r
   @param  BackGround   The background color of the string being printed.  This is\r
-                       an optional parameter that may be NULL.  If it is NULL, \r
+                       an optional parameter that may be NULL.  If it is NULL,\r
                        then the background color of the current ConOut device\r
                        in the EFI_SYSTEM_TABLE is used.\r
-  @param  Format       Null-terminated ASCII format string.  See Print Library \r
+  @param  Format       Null-terminated ASCII format string.  See Print Library\r
                        for the supported format string syntax.\r
-  @param  ...          Variable argument list whose contents are accessed based on \r
-                       the format string specified by Format.         \r
+  @param  ...          Variable argument list whose contents are accessed based on\r
+                       the format string specified by Format.\r
 \r
   @return  The number of ASCII characters printed.\r
 \r
@@ -659,6 +702,8 @@ AsciiPrintXY (
 \r
   PrintNum = UnicodeSPrintAsciiFormat (Buffer, BufferSize, Format, Marker);\r
 \r
+  VA_END (Marker);\r
+\r
   ReturnNum = InternalPrintGraphic (PointX, PointY, ForeGround, BackGround, Buffer, PrintNum);\r
 \r
   FreePool (Buffer);\r
@@ -666,3 +711,106 @@ AsciiPrintXY (
   return ReturnNum;\r
 }\r
 \r
+/**\r
+  Appends a formatted Unicode string to a Null-terminated Unicode string\r
+\r
+  This function appends a formatted Unicode string to the Null-terminated\r
+  Unicode string specified by String.   String is optional and may be NULL.\r
+  Storage for the formatted Unicode string returned is allocated using\r
+  AllocatePool().  The pointer to the appended string is returned.  The caller\r
+  is responsible for freeing the returned string.\r
+\r
+  If String is not NULL and not aligned on a 16-bit boundary, then ASSERT().\r
+  If FormatString is NULL, then ASSERT().\r
+  If FormatString is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param[in] String         A Null-terminated Unicode string.\r
+  @param[in] FormatString   A Null-terminated Unicode format string.\r
+  @param[in]  Marker        VA_LIST marker for the variable argument list.\r
+\r
+  @retval NULL    There was not enough available memory.\r
+  @return         Null-terminated Unicode string is that is the formatted\r
+                  string appended to String.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+CatVSPrint (\r
+  IN  CHAR16  *String, OPTIONAL\r
+  IN  CONST CHAR16  *FormatString,\r
+  IN  VA_LIST       Marker\r
+  )\r
+{\r
+  UINTN   CharactersRequired;\r
+  UINTN   SizeRequired;\r
+  CHAR16  *BufferToReturn;\r
+  VA_LIST ExtraMarker;\r
+\r
+  VA_COPY (ExtraMarker, Marker);\r
+  CharactersRequired = SPrintLength(FormatString, ExtraMarker);\r
+  VA_END (ExtraMarker);\r
+\r
+  if (String != NULL) {\r
+    SizeRequired = StrSize(String) + (CharactersRequired * sizeof(CHAR16));\r
+  } else {\r
+    SizeRequired = sizeof(CHAR16) + (CharactersRequired * sizeof(CHAR16));\r
+  }\r
+\r
+  BufferToReturn = AllocatePool(SizeRequired);\r
+\r
+  if (BufferToReturn == NULL) {\r
+    return NULL;\r
+  } else {\r
+    BufferToReturn[0] = L'\0';\r
+  }\r
+\r
+  if (String != NULL) {\r
+    StrCpyS(BufferToReturn, SizeRequired / sizeof(CHAR16), String);\r
+  }\r
+\r
+  UnicodeVSPrint(BufferToReturn + StrLen(BufferToReturn), (CharactersRequired+1) * sizeof(CHAR16), FormatString, Marker);\r
+\r
+  ASSERT(StrSize(BufferToReturn)==SizeRequired);\r
+\r
+  return (BufferToReturn);\r
+}\r
+\r
+/**\r
+  Appends a formatted Unicode string to a Null-terminated Unicode string\r
+\r
+  This function appends a formatted Unicode string to the Null-terminated\r
+  Unicode string specified by String.   String is optional and may be NULL.\r
+  Storage for the formatted Unicode string returned is allocated using\r
+  AllocatePool().  The pointer to the appended string is returned.  The caller\r
+  is responsible for freeing the returned string.\r
+\r
+  If String is not NULL and not aligned on a 16-bit boundary, then ASSERT().\r
+  If FormatString is NULL, then ASSERT().\r
+  If FormatString is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param[in] String         A Null-terminated Unicode string.\r
+  @param[in] FormatString   A Null-terminated Unicode format string.\r
+  @param[in] ...            The variable argument list whose contents are\r
+                            accessed based on the format string specified by\r
+                            FormatString.\r
+\r
+  @retval NULL    There was not enough available memory.\r
+  @return         Null-terminated Unicode string is that is the formatted\r
+                  string appended to String.\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+CatSPrint (\r
+  IN  CHAR16  *String, OPTIONAL\r
+  IN  CONST CHAR16  *FormatString,\r
+  ...\r
+  )\r
+{\r
+  VA_LIST   Marker;\r
+  CHAR16    *NewString;\r
+\r
+  VA_START (Marker, FormatString);\r
+  NewString = CatVSPrint(String, FormatString, Marker);\r
+  VA_END (Marker);\r
+  return NewString;\r
+}\r
+\r