/** @file\r
Print Library internal worker functions.\r
\r
- Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2006 - 2012, 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
\r
#include "PrintLibInternal.h"\r
\r
-#define WARNING_STATUS_NUMBER 4\r
-#define ERROR_STATUS_NUMBER 24\r
+#define WARNING_STATUS_NUMBER 5\r
+#define ERROR_STATUS_NUMBER 33\r
\r
GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mHexStr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};\r
\r
"Warning Delete Failure", // RETURN_WARN_DELETE_FAILURE = 2\r
"Warning Write Failure", // RETURN_WARN_WRITE_FAILURE = 3\r
"Warning Buffer Too Small", // RETURN_WARN_BUFFER_TOO_SMALL = 4\r
+ "Warning Stale Data", // RETURN_WARN_STALE_DATA = 5\r
"Load Error", // RETURN_LOAD_ERROR = 1 | MAX_BIT\r
"Invalid Parameter", // RETURN_INVALID_PARAMETER = 2 | MAX_BIT\r
"Unsupported", // RETURN_UNSUPPORTED = 3 | MAX_BIT\r
"Aborted", // RETURN_ABORTED = 21 | MAX_BIT\r
"ICMP Error", // RETURN_ICMP_ERROR = 22 | MAX_BIT\r
"TFTP Error", // RETURN_TFTP_ERROR = 23 | MAX_BIT\r
- "Protocol Error" // RETURN_PROTOCOL_ERROR = 24 | MAX_BIT\r
+ "Protocol Error", // RETURN_PROTOCOL_ERROR = 24 | MAX_BIT\r
+ "Incompatible Version", // RETURN_INCOMPATIBLE_VERSION = 25 | MAX_BIT\r
+ "Security Violation", // RETURN_SECURITY_VIOLATION = 26 | MAX_BIT\r
+ "CRC Error", // RETURN_CRC_ERROR = 27 | MAX_BIT\r
+ "End of Media", // RETURN_END_OF_MEDIA = 28 | MAX_BIT\r
+ "Reserved (29)", // RESERVED = 29 | MAX_BIT\r
+ "Reserved (30)", // RESERVED = 30 | MAX_BIT\r
+ "End of File", // RETURN_END_OF_FILE = 31 | MAX_BIT\r
+ "Invalid Language", // RETURN_INVALID_LANGUAGE = 32 | MAX_BIT\r
+ "Compromised Data" // RETURN_COMPROMISED_DATA = 33 | MAX_BIT\r
};\r
\r
\r
VA_LIST is used this routine allows the nesting of Vararg routines. Thus \r
this is the main print working routine.\r
\r
- @param Buffer The character buffer to print the results of the parsing\r
- of Format into.\r
- @param BufferSize The maximum number of characters to put into buffer.\r
- @param Flags Initial flags value.\r
- Can only have FORMAT_UNICODE and OUTPUT_UNICODE set.\r
- @param Format A Null-terminated format string.\r
- @param VaListMarker VA_LIST style variable argument list consumed by processing Format.\r
- @param BaseListMarker BASE_LIST style variable argument list consumed by processing Format.\r
+ If COUNT_ONLY_NO_PRINT is set in Flags, Buffer will not be modified at all.\r
+\r
+ @param[out] Buffer The character buffer to print the results of the \r
+ parsing of Format into.\r
+ @param[in] BufferSize The maximum number of characters to put into \r
+ buffer.\r
+ @param[in] Flags Initial flags value.\r
+ Can only have FORMAT_UNICODE, OUTPUT_UNICODE, \r
+ and COUNT_ONLY_NO_PRINT set.\r
+ @param[in] Format A Null-terminated format string.\r
+ @param[in] VaListMarker VA_LIST style variable argument list consumed by\r
+ processing Format.\r
+ @param[in] BaseListMarker BASE_LIST style variable argument list consumed\r
+ by processing Format.\r
\r
@return The number of characters printed not including the Null-terminator.\r
+ If COUNT_ONLY_NO_PRINT was set returns the same, but without any\r
+ modification to Buffer.\r
\r
**/\r
UINTN\r
CHAR8 *OriginalBuffer;\r
CHAR8 *EndBuffer;\r
CHAR8 ValueBuffer[MAXIMUM_VALUE_CHARACTERS];\r
- UINTN BytesPerOutputCharacter;\r
+ UINT32 BytesPerOutputCharacter;\r
UINTN BytesPerFormatCharacter;\r
UINTN FormatMask;\r
UINTN FormatCharacter;\r
UINTN Digits;\r
UINTN Radix;\r
RETURN_STATUS Status;\r
+ UINT32 GuidData1;\r
+ UINT16 GuidData2;\r
+ UINT16 GuidData3;\r
+ UINTN LengthToReturn;\r
\r
- if (BufferSize == 0) {\r
- return 0;\r
+ //\r
+ // If you change this code be sure to match the 2 versions of this function.\r
+ // Nearly identical logic is found in the BasePrintLib and \r
+ // DxePrintLibPrint2Protocol (both PrintLib instances).\r
+ //\r
+\r
+ if ((Flags & COUNT_ONLY_NO_PRINT) != 0) {\r
+ if (BufferSize == 0) {\r
+ Buffer = NULL;\r
+ }\r
+ } else {\r
+ //\r
+ // We can run without a Buffer for counting only.\r
+ //\r
+ if (BufferSize == 0) {\r
+ return 0;\r
+ }\r
+ ASSERT (Buffer != NULL);\r
}\r
- ASSERT (Buffer != NULL);\r
\r
if ((Flags & OUTPUT_UNICODE) != 0) {\r
BytesPerOutputCharacter = 2;\r
BytesPerOutputCharacter = 1;\r
}\r
\r
+ LengthToReturn = 0;\r
+\r
//\r
// Reserve space for the Null terminator.\r
//\r
//\r
// Clear all the flag bits except those that may have been passed in\r
//\r
- Flags &= (OUTPUT_UNICODE | FORMAT_UNICODE);\r
+ Flags &= (OUTPUT_UNICODE | FORMAT_UNICODE | COUNT_ONLY_NO_PRINT);\r
\r
//\r
// Set the default width to zero, and the default precision to 1\r
if (sizeof (VOID *) > 4) {\r
Flags |= LONG_TYPE;\r
}\r
+ //\r
+ // break skipped on purpose\r
+ //\r
case 'X':\r
Flags |= PREFIX_ZERO;\r
//\r
if (TmpGuid == NULL) {\r
ArgumentString = "<null guid>";\r
} else {\r
+ GuidData1 = ReadUnaligned32 (&(TmpGuid->Data1));\r
+ GuidData2 = ReadUnaligned16 (&(TmpGuid->Data2));\r
+ GuidData3 = ReadUnaligned16 (&(TmpGuid->Data3));\r
BasePrintLibSPrint (\r
ValueBuffer,\r
MAXIMUM_VALUE_CHARACTERS, \r
0,\r
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",\r
- TmpGuid->Data1,\r
- TmpGuid->Data2,\r
- TmpGuid->Data3,\r
+ GuidData1,\r
+ GuidData2,\r
+ GuidData3,\r
TmpGuid->Data4[0],\r
TmpGuid->Data4[1],\r
TmpGuid->Data4[2],\r
// Pad before the string\r
//\r
if ((Flags & (PAD_TO_WIDTH | LEFT_JUSTIFY)) == (PAD_TO_WIDTH)) {\r
- Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);\r
+ LengthToReturn += ((Width - Precision) * BytesPerOutputCharacter);\r
+ if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+ Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);\r
+ }\r
}\r
\r
if (ZeroPad) {\r
if (Prefix != 0) {\r
- Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
+ LengthToReturn += (1 * BytesPerOutputCharacter);\r
+ if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+ Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
+ }\r
+ }\r
+ LengthToReturn += ((Precision - Count) * BytesPerOutputCharacter);\r
+ if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+ Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Precision - Count, '0', BytesPerOutputCharacter);\r
}\r
- Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Precision - Count, '0', BytesPerOutputCharacter);\r
} else {\r
- Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Precision - Count, ' ', BytesPerOutputCharacter);\r
+ LengthToReturn += ((Precision - Count) * BytesPerOutputCharacter);\r
+ if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+ Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Precision - Count, ' ', BytesPerOutputCharacter);\r
+ }\r
if (Prefix != 0) {\r
- Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
+ LengthToReturn += (1 * BytesPerOutputCharacter);\r
+ if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+ Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
+ }\r
}\r
}\r
\r
while (Index < Count) {\r
ArgumentCharacter = ((*ArgumentString & 0xff) | (*(ArgumentString + 1) << 8)) & ArgumentMask;\r
\r
- Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ArgumentCharacter, BytesPerOutputCharacter);\r
+ LengthToReturn += (1 * BytesPerOutputCharacter);\r
+ if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+ Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ArgumentCharacter, BytesPerOutputCharacter);\r
+ }\r
ArgumentString += BytesPerArgumentCharacter;\r
Index++;\r
if (Comma) {\r
Digits = 0;\r
Index++;\r
if (Index < Count) {\r
- Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', BytesPerOutputCharacter);\r
+ LengthToReturn += (1 * BytesPerOutputCharacter);\r
+ if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+ Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', BytesPerOutputCharacter);\r
+ }\r
}\r
}\r
}\r
// Pad after the string\r
//\r
if ((Flags & (PAD_TO_WIDTH | LEFT_JUSTIFY)) == (PAD_TO_WIDTH | LEFT_JUSTIFY)) {\r
- Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);\r
+ LengthToReturn += ((Width - Precision) * BytesPerOutputCharacter);\r
+ if ((Flags & COUNT_ONLY_NO_PRINT) == 0 && Buffer != NULL) {\r
+ Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);\r
+ }\r
}\r
\r
//\r
FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
}\r
\r
+ if ((Flags & COUNT_ONLY_NO_PRINT) != 0) {\r
+ return (LengthToReturn / BytesPerOutputCharacter);\r
+ }\r
+\r
+ ASSERT (Buffer != NULL);\r
//\r
// Null terminate the Unicode or ASCII string\r
//\r
)\r
{\r
VA_LIST Marker;\r
+ UINTN NumberOfPrinted;\r
\r
VA_START (Marker, FormatString);\r
- return BasePrintLibSPrintMarker (StartOfBuffer, BufferSize, Flags, FormatString, Marker, NULL);\r
+ NumberOfPrinted = BasePrintLibSPrintMarker (StartOfBuffer, BufferSize, Flags, FormatString, Marker, NULL);\r
+ VA_END (Marker);\r
+ return NumberOfPrinted;\r
}\r