+/** @file\r
+ Mde UEFI library API implemention.\r
+ Print to StdErr or ConOut defined in EFI_SYSTEM_TABLE\r
+\r
+ Copyright (c) 2007, 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
+\r
+**/\r
+\r
+/** \r
+ Internal function which prints a formatted Unicode string to the console output device \r
+ specified by Console\r
+\r
+ This function prints a formatted Unicode string to the console output device \r
+ specified by Console and returns the number of Unicode characters that printed \r
+ to it. If the length of the formatted Unicode string is greater than PcdUefiLibMaxPrintBufferSize, \r
+ then only the first PcdUefiLibMaxPrintBufferSize characters are sent to Console.\r
+\r
+ @param Format Null-terminated Unicode format string.\r
+ @param Console The output console.\r
+ @param Marker VA_LIST marker for the variable argument list.\r
+ \r
+ If Format is NULL, then ASSERT().\r
+ If Format is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+**/\r
+\r
+STATIC\r
+UINTN\r
+InternalPrint (\r
+ IN CONST CHAR16 *Format,\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *Console,\r
+ IN VA_LIST Marker\r
+ )\r
+{\r
+ UINTN Return;\r
+ CHAR16 *Buffer;\r
+ UINTN BufferSize;\r
+\r
+ ASSERT (Format != NULL);\r
+ ASSERT (((UINTN) Format & 0x01) == 0);\r
+\r
+ BufferSize = (PcdGet32 (PcdUefiLibMaxPrintBufferSize) + 1) * sizeof (CHAR16);\r
+ \r
+ Buffer = (CHAR16 *) AllocatePool(BufferSize);\r
+ ASSERT (Buffer != NULL);\r
+\r
+ Return = UnicodeVSPrint (Buffer, BufferSize, Format, Marker);\r
+\r
+ if (Console != NULL) {\r
+ //\r
+ // To be extra safe make sure ConOut has been initialized\r
+ //\r
+ Console->OutputString (Console, Buffer);\r
+ }\r
+\r
+ FreePool (Buffer);\r
+\r
+ return Return; \r
+}\r
+\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
+ PcdUefiLibMaxPrintBufferSize characters are sent to ConOut.\r
+\r
+ @param Format Null-terminated Unicode format string.\r
+ @param ... VARARG list consumed to process Format.\r
+ If Format is NULL, then ASSERT().\r
+ If Format is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+Print (\r
+ IN CONST CHAR16 *Format,\r
+ ...\r
+ )\r
+{\r
+ VA_LIST Marker;\r
+ UINTN Return;\r
+\r
+ VA_START (Marker, Format);\r
+\r
+ Return = InternalPrint (Format, gST->ConOut, Marker);\r
+\r
+ VA_END (Marker);\r
+\r
+ return Return;\r
+}\r
+\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
+ PcdUefiLibMaxPrintBufferSize characters are sent to StdErr.\r
+\r
+ @param Format Null-terminated Unicode format string.\r
+ @param ... VARARG list consumed to process Format.\r
+ If Format is NULL, then ASSERT().\r
+ If Format is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+**/\r
+\r
+UINTN\r
+EFIAPI\r
+ErrorPrint (\r
+ IN CONST CHAR16 *Format,\r
+ ...\r
+ )\r
+{\r
+ VA_LIST Marker;\r
+ UINTN Return;\r
+\r
+ VA_START (Marker, Format);\r
+\r
+ Return = InternalPrint( Format, gST->StdErr, Marker);\r
+\r
+ VA_END (Marker);\r
+\r
+ return Return;\r
+}\r
+\r
+\r
+/** \r
+ Internal function which prints a formatted ASCII string to the console output device \r
+ specified by Console\r
+\r
+ This function prints a formatted ASCII string to the console output device \r
+ specified by Console and returns the number of ASCII characters that printed \r
+ to it. If the length of the formatted ASCII string is greater than PcdUefiLibMaxPrintBufferSize, \r
+ then only the first PcdUefiLibMaxPrintBufferSize characters are sent to Console.\r
+\r
+ @param Format Null-terminated ASCII format string.\r
+ @param Console The output console.\r
+ @param Marker VA_LIST marker for the variable argument list.\r
+ \r
+ If Format is NULL, then ASSERT().\r
+ \r
+**/\r
+\r
+STATIC\r
+UINTN\r
+AsciiInternalPrint (\r
+ IN CONST CHAR8 *Format,\r
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *Console,\r
+ IN VA_LIST Marker\r
+ )\r
+{\r
+ UINTN Return;\r
+ CHAR16 *Buffer;\r
+ UINTN BufferSize;\r
+\r
+ ASSERT (Format != NULL);\r
+\r
+ BufferSize = (PcdGet32 (PcdUefiLibMaxPrintBufferSize) + 1) * sizeof (CHAR16);\r
+ \r
+ Buffer = (CHAR16 *) AllocatePool(BufferSize);\r
+ ASSERT (Buffer != NULL);\r
+\r
+ Return = UnicodeVSPrintAsciiFormat (Buffer, BufferSize, Format, Marker);\r
+\r
+ if (Console != NULL) {\r
+ //\r
+ // To be extra safe make sure ConOut has been initialized\r
+ //\r
+ Console->OutputString (Console, Buffer);\r
+ }\r
+\r
+ FreePool (Buffer);\r
+\r
+ return Return; \r
+}\r
+\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
+ PcdUefiLibMaxPrintBufferSize characters are sent to ConOut.\r
+\r
+ @param Format Null-terminated ASCII format string.\r
+ @param ... VARARG list consumed to process Format.\r
+ If Format is NULL, then ASSERT().\r
+ If Format is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsciiPrint (\r
+ IN CONST CHAR8 *Format,\r
+ ...\r
+ )\r
+{\r
+ VA_LIST Marker;\r
+ UINTN Return;\r
+\r
+ VA_START (Marker, Format);\r
+\r
+ Return = AsciiInternalPrint( Format, gST->ConOut, Marker);\r
+\r
+ VA_END (Marker);\r
+\r
+ return Return;\r
+}\r
+\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
+ PcdUefiLibMaxPrintBufferSize characters are sent to StdErr.\r
+\r
+ @param Format Null-terminated ASCII format string.\r
+ @param ... VARARG list consumed to process Format.\r
+ If Format is NULL, then ASSERT().\r
+ If Format is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsciiErrorPrint (\r
+ IN CONST CHAR8 *Format,\r
+ ...\r
+ )\r
+{\r
+ VA_LIST Marker;\r
+ UINTN Return;\r
+\r
+ VA_START (Marker, Format);\r
+\r
+ Return = AsciiInternalPrint( Format, gST->StdErr, Marker);\r
+\r
+ VA_END (Marker);\r
+\r
+ return Return;\r
+}\r
+\r