]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BasePrintLib/PrintLibInternal.c
Add 2 functions to UefiLib library class: CatSPrint and CatVSPrint.
[mirror_edk2.git] / MdePkg / Library / BasePrintLib / PrintLibInternal.c
index 2be6ad55e7a158799127e02a1e81a908279a7690..dbab58d49cacd9b7f52e03f5a87c5832253689fb 100644 (file)
@@ -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,18 +334,36 @@ BasePrintLibSPrintMarker (
   UINT32            GuidData1;\r
   UINT16            GuidData2;\r
   UINT16            GuidData3;\r
+  UINT32            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) {\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
+  if (Flags & OUTPUT_UNICODE) {\r
     BytesPerOutputCharacter = 2;\r
   } else {\r
     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,38 @@ 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
+      if (Flags & COUNT_ONLY_NO_PRINT) {\r
+        LengthToReturn += ((Width - Precision) * BytesPerOutputCharacter);\r
+      } else {\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
+        if (Flags & COUNT_ONLY_NO_PRINT) {\r
+          LengthToReturn += (1 * BytesPerOutputCharacter);\r
+        } else {\r
+          Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
+        }\r
+      }\r
+      if (Flags & COUNT_ONLY_NO_PRINT) {\r
+        LengthToReturn += ((Precision - Count) * BytesPerOutputCharacter);\r
+      } else {\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
+      if (Flags & COUNT_ONLY_NO_PRINT) {\r
+        LengthToReturn += ((Precision - Count) * BytesPerOutputCharacter);\r
+      } else {\r
+        Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Precision - Count, ' ', BytesPerOutputCharacter);\r
+      }\r
       if (Prefix != 0) {\r
-        Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
+        if (Flags & COUNT_ONLY_NO_PRINT) {\r
+          LengthToReturn += (1 * BytesPerOutputCharacter);\r
+        } else {\r
+          Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
+        }\r
       }\r
     }\r
 \r
@@ -845,7 +891,11 @@ BasePrintLibSPrintMarker (
     while (Index < Count) {\r
       ArgumentCharacter = ((*ArgumentString & 0xff) | (*(ArgumentString + 1) << 8)) & ArgumentMask;\r
 \r
-      Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ArgumentCharacter, BytesPerOutputCharacter);\r
+      if (Flags & COUNT_ONLY_NO_PRINT) {\r
+        LengthToReturn += (1 * BytesPerOutputCharacter);\r
+      } else {\r
+        Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ArgumentCharacter, BytesPerOutputCharacter);\r
+      }\r
       ArgumentString    += BytesPerArgumentCharacter;\r
       Index++;\r
       if (Comma) {\r
@@ -854,7 +904,11 @@ BasePrintLibSPrintMarker (
           Digits = 0;\r
           Index++;\r
           if (Index < Count) {\r
-            Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', BytesPerOutputCharacter);\r
+            if (Flags & COUNT_ONLY_NO_PRINT) {\r
+              LengthToReturn += (1 * BytesPerOutputCharacter);\r
+            } else {\r
+              Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', BytesPerOutputCharacter);\r
+            }\r
           }\r
         }\r
       }\r
@@ -864,7 +918,11 @@ 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
+      if (Flags & COUNT_ONLY_NO_PRINT) {\r
+        LengthToReturn += ((Width - Precision) * BytesPerOutputCharacter);\r
+      } else {\r
+        Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);\r
+      }\r
     }\r
 \r
     //\r
@@ -878,6 +936,10 @@ BasePrintLibSPrintMarker (
     FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;\r
   }\r
 \r
+  if (Flags & COUNT_ONLY_NO_PRINT) {\r
+    return (LengthToReturn / BytesPerOutputCharacter);\r
+  }\r
+\r
   //\r
   // Null terminate the Unicode or ASCII string\r
   //\r