]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkPkg/Library/FrameworkUefiLib/UefiLibPrint.c
Remove IntelFrameworkModulePkg
[mirror_edk2.git] / IntelFrameworkPkg / Library / FrameworkUefiLib / UefiLibPrint.c
index 3f4f4f5f57ec70085a5e0eb3a0bfab335bf27aae..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. 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) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -90,23 +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
@@ -129,23 +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
@@ -225,22 +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
@@ -264,22 +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
@@ -474,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
@@ -553,24 +554,24 @@ 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
+  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
+  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
@@ -583,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
@@ -623,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
@@ -631,24 +634,24 @@ 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
+  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
+  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
@@ -660,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
@@ -699,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
@@ -706,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