]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BasePrintLib/PrintLibInternal.c
Add Missing invocations to VA_END() for VA_START().
[mirror_edk2.git] / MdePkg / Library / BasePrintLib / PrintLibInternal.c
index 2be6ad55e7a158799127e02a1e81a908279a7690..8a0cfa6e20e4737f65e9a4e52af3ebbec70cee74 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Print Library internal worker functions.\r
 \r
-  Copyright (c) 2006 - 2011, 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
@@ -275,16 +275,24 @@ BasePrintLibConvertValueToString (
   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
@@ -300,7 +308,7 @@ BasePrintLibSPrintMarker (
   CHAR8             *OriginalBuffer;\r
   CHAR8             *EndBuffer;\r
   CHAR8             ValueBuffer[MAXIMUM_VALUE_CHARACTERS];\r
-  UINT            BytesPerOutputCharacter;\r
+  UINT32            BytesPerOutputCharacter;\r
   UINTN             BytesPerFormatCharacter;\r
   UINTN             FormatMask;\r
   UINTN             FormatCharacter;\r
@@ -326,11 +334,27 @@ BasePrintLibSPrintMarker (
   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
@@ -338,6 +362,8 @@ BasePrintLibSPrintMarker (
     BytesPerOutputCharacter = 1;\r
   }\r
 \r
+  LengthToReturn = 0;\r
+\r
   //\r
   // Reserve space for the Null terminator.\r
   //\r
@@ -379,7 +405,7 @@ BasePrintLibSPrintMarker (
     //\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
@@ -816,18 +842,33 @@ BasePrintLibSPrintMarker (
     // 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
@@ -845,7 +886,10 @@ BasePrintLibSPrintMarker (
     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
@@ -854,7 +898,10 @@ BasePrintLibSPrintMarker (
           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
@@ -864,7 +911,10 @@ BasePrintLibSPrintMarker (
     // 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
@@ -878,6 +928,11 @@ BasePrintLibSPrintMarker (
     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
@@ -927,7 +982,10 @@ BasePrintLibSPrint (
   )\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