1/*++ 2 3Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR> 4This program and the accompanying materials 5are licensed and made available under the terms and conditions of the BSD License 6which accompanies this distribution. The full text of the license may be found at 7http://opensource.org/licenses/bsd-license.php 8 9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 12Module Name: 13 14 StdErr.c 15 16Abstract: 17 18 Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very 19 simple implemenation of SPrint() and Print() to support debug. 20 21 You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a 22 time. This makes the implementation very simple. 23 24 VSPrint, Print, SPrint format specification has the follwoing form 25 26 %[flags][width]type 27 28 flags: 29 '-' - Left justify 30 '+' - Prefix a sign 31 ' ' - Prefix a blank 32 ',' - Place commas in numberss 33 '0' - Prefix for width with zeros 34 'l' - UINT64 35 'L' - UINT64 36 37 width: 38 '*' - Get width from a UINTN argumnet from the argument list 39 Decimal number that represents width of print 40 41 type: 42 'X' - argument is a UINTN hex number, prefix '0' 43 'x' - argument is a hex number 44 'd' - argument is a decimal number 45 'a' - argument is an ascii string 46 'S','s' - argument is an Unicode string 47 'g' - argument is a pointer to an EFI_GUID 48 't' - argument is a pointer to an EFI_TIME structure 49 'c' - argument is an ascii character 50 'r' - argument is EFI_STATUS 51 '%' - Print a % 52 53--*/ 54 55#include "Tiano.h" 56#include "EfiDriverLib.h" 57#include "EfiCommonLib.h" 58#include "EfiPrintLib.h" 59#include "Print.h" 60 61 62UINTN 63ErrorPrint ( 64 IN CONST CHAR16 *ErrorString, 65 IN CONST CHAR8 *Format, 66 ... 67 ) 68/*++ 69 70Routine Description: 71 72 Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii 73 characters. 74 75Arguments: 76 77 ErrorString - String of error infomation. 78 79 Format - Ascii format string see file header for more details. 80 81 ... - Vararg list consumed by processing Format. 82 83Returns: 84 85 Number of characters printed. 86 87--*/ 88{ 89 UINTN Return; 90 VA_LIST Marker; 91 UINTN Index; 92 UINTN MaxIndex; 93 CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; 94 CHAR16 UnicodeFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; 95 96 MaxIndex = EfiAsciiStrLen ((CHAR8 *) Format); 97 if (MaxIndex >= EFI_DRIVER_LIB_MAX_PRINT_BUFFER) { 98 // 99 // Format string was too long for use to process. 100 // 101 return 0; 102 } 103 104 if (ErrorString != '\0') { 105 if (gST->StdErr != NULL) { 106 // 107 // To be extra safe make sure StdErr has been initialized 108 // 109 gST->StdErr->SetAttribute (gST->StdErr, EFI_TEXT_ATTR (EFI_RED, EFI_BLACK)); 110 gST->StdErr->OutputString (gST->StdErr, (CHAR16 *) ErrorString); 111 gST->StdErr->SetAttribute (gST->StdErr, EFI_TEXT_ATTR (EFI_WHITE, EFI_BLACK)); 112 } 113 } 114 115 for (Index = 0; Index < MaxIndex; Index++) { 116 UnicodeFormat[Index] = (CHAR16) Format[Index]; 117 } 118 119 UnicodeFormat[Index] = 0; 120 121 VA_START (Marker, Format); 122 Return = VSPrint (Buffer, sizeof (Buffer), UnicodeFormat, Marker); 123 VA_END (Marker); 124 125 // 126 // Need to convert to Unicode to do an OutputString 127 // 128 129 if (gST->StdErr != NULL) { 130 // 131 // To be extra safe make sure StdErr has been initialized 132 // 133 gST->StdErr->OutputString (gST->StdErr, Buffer); 134 } 135 136 return Return; 137} 138 139 140UINTN 141Aprint ( 142 IN CONST CHAR8 *Format, 143 ... 144 ) 145/*++ 146 147Routine Description: 148 149 Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii 150 characters. 151 152Arguments: 153 154 Format - Ascii format string see file header for more details. 155 156 ... - Vararg list consumed by processing Format. 157 158Returns: 159 160 Number of characters printed. 161 162--*/ 163{ 164 UINTN Return; 165 VA_LIST Marker; 166 UINTN Index; 167 UINTN MaxIndex; 168 CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; 169 CHAR16 UnicodeFormat[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; 170 171 MaxIndex = EfiAsciiStrLen ((CHAR8 *) Format); 172 if (MaxIndex >= EFI_DRIVER_LIB_MAX_PRINT_BUFFER) { 173 // 174 // Format string was too long for use to process. 175 // 176 return 0; 177 } 178 179 for (Index = 0; Index <= MaxIndex; Index++) { 180 UnicodeFormat[Index] = (CHAR16) Format[Index]; 181 } 182 183 VA_START (Marker, Format); 184 Return = VSPrint (Buffer, sizeof (Buffer), UnicodeFormat, Marker); 185 VA_END (Marker); 186 187 // 188 // Need to convert to Unicode to do an OutputString 189 // 190 191 if (gST->ConOut != NULL) { 192 // 193 // To be extra safe make sure ConOut has been initialized 194 // 195 gST->ConOut->OutputString (gST->ConOut, Buffer); 196 } 197 198 return Return; 199} 200 201 202UINTN 203Print ( 204 IN CONST CHAR16 *Format, 205 ... 206 ) 207/*++ 208 209Routine Description: 210 211 Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii 212 characters. 213 214Arguments: 215 216 Format - Ascii format string see file header for more details. 217 218 ... - Vararg list consumed by processing Format. 219 220Returns: 221 222 Number of characters printed. 223 224--*/ 225{ 226 UINTN Return; 227 VA_LIST Marker; 228 CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; 229 230 VA_START (Marker, Format); 231 Return = VSPrint (Buffer, sizeof (Buffer), Format, Marker); 232 VA_END (Marker); 233 234 if (gST->ConOut != NULL) { 235 // 236 // To be extra safe make sure ConOut has been initialized 237 // 238 gST->ConOut->OutputString (gST->ConOut, Buffer); 239 } 240 241 return Return; 242} 243 244UINTN 245UPrint ( 246 IN CONST CHAR16 *Format, 247 ... 248 ) 249/*++ 250 251Routine Description: 252 253 Print function for a maximum of EFI_DRIVER_LIB_MAX_PRINT_BUFFER ascii 254 characters. 255 256Arguments: 257 258 Format - Ascii format string see file header for more details. 259 260 ... - Vararg list consumed by processing Format. 261 262Returns: 263 264 Number of characters printed. 265 266--*/ 267{ 268 UINTN Return; 269 VA_LIST Marker; 270 CHAR16 Buffer[EFI_DRIVER_LIB_MAX_PRINT_BUFFER]; 271 272 VA_START (Marker, Format); 273 Return = VSPrint (Buffer, sizeof (Buffer), Format, Marker); 274 VA_END (Marker); 275 276 if (gST->ConOut != NULL) { 277 // 278 // To be extra safe make sure ConOut has been initialized 279 // 280 gST->ConOut->OutputString (gST->ConOut, Buffer); 281 } 282 283 return Return; 284} 285