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
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
//\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
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
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
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
//\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
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
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
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
\r
ConsoleHandle = gST->ConsoleOutHandle;\r
\r
+ ASSERT( ConsoleHandle != NULL);\r
+\r
Status = gBS->HandleProtocol (\r
ConsoleHandle,\r
&gEfiGraphicsOutputProtocolGuid,\r
} 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
//\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
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
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
//\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
}\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
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
\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
}\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
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
\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
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