]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BasePrintLib/PrintLibInternal.c
1) Added BIT0, BIT1, …, BIT63 to the Base Defines
[mirror_edk2.git] / MdePkg / Library / BasePrintLib / PrintLibInternal.c
index 0a75a3c58114e04614d0ec31c3b136602798d6c1..675e2a80e28ede2ca5794b60f6b90be34f7a5e71 100644 (file)
-/** @file\r
-  Print Library worker functions.\r
-\r
-  Copyright (c) 2006, 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
-  Module Name:  PrintLibInternal.c\r
-\r
-**/\r
-\r
-#include "PrintLibInternal.h"\r
-\r
-static CONST CHAR8 mHexStr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};\r
-\r
-\r
-/**\r
-  Internal function that places the character into the Buffer.\r
-\r
-  Internal function that places ASCII or Unicode character into the Buffer.\r
-\r
-  @param  Buffer      Buffer to place the Unicode or ASCII string.\r
-  @param  EndBuffer   The end of the input Buffer. No characters will be\r
-                      placed after that. \r
-  @param  Length      Count of character to be placed into Buffer.\r
-  @param  Character   Character to be placed into Buffer.\r
-  @param  Increment   Character increment in Buffer.\r
-\r
-  @return Number of characters printed.\r
-\r
-**/\r
-CHAR8 *\r
-BasePrintLibFillBuffer (\r
-  CHAR8   *Buffer,\r
-  CHAR8   *EndBuffer,\r
-  INTN    Length,\r
-  UINTN   Character,\r
-  INTN    Increment\r
-  )\r
-{\r
-  INTN  Index;\r
-\r
-  for (Index = 0; Index < Length && Buffer < EndBuffer; Index++) {\r
-    *Buffer       =  (CHAR8) Character;\r
-    *(Buffer + 1) =  (CHAR8) (Character >> 8);\r
-    Buffer        += Increment;\r
-  }\r
-  return Buffer;\r
-}\r
-\r
-/**\r
-  Internal function that convert a decimal number to a string in Buffer.\r
-\r
-  Print worker function that convert a decimal number to a string in Buffer.\r
-\r
-  @param  Buffer    Location to place the Unicode or ASCII string of Value.\r
-  @param  Value     Value to convert to a Decimal or Hexidecimal string in Buffer.\r
-  @param  Radix     Radix of the value\r
-\r
-  @return Number of characters printed.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-BasePrintLibValueToString (\r
-  IN OUT CHAR8  *Buffer,\r
-  IN INT64      Value,\r
-  IN UINTN      Radix\r
-  )\r
-{\r
-  UINTN   Digits;\r
-  UINT32  Remainder;\r
-\r
-  //\r
-  // Loop to convert one digit at a time in reverse order\r
-  //\r
-  *(Buffer++) = 0;\r
-  Digits = 0;\r
-  do {\r
-    Value = (INT64)DivU64x32Remainder ((UINT64)Value, (UINT32)Radix, &Remainder);\r
-    *(Buffer++) = mHexStr[Remainder];\r
-    Digits++;\r
-  } while (Value != 0);\r
-  return Digits;\r
-}\r
-\r
-/**\r
-  Internal function that converts a decimal value to a Null-terminated string.\r
-  \r
-  Converts the decimal number specified by Value to a Null-terminated  \r
-  string specified by Buffer containing at most Width characters.\r
-  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.\r
-  The number of characters in Buffer is returned not including the Null-terminator.\r
-  If the conversion contains more than Width characters, then only the first\r
-  Width characters are returned, and the total number of characters \r
-  required to perform the conversion is returned.\r
-  Additional conversion parameters are specified in Flags.  \r
-  The Flags bit LEFT_JUSTIFY is always ignored.\r
-  All conversions are left justified in Buffer.\r
-  If Width is 0, PREFIX_ZERO is ignored in Flags.\r
-  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas\r
-  are inserted every 3rd digit starting from the right.\r
-  If Value is < 0, then the fist character in Buffer is a '-'.\r
-  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, \r
-  then Buffer is padded with '0' characters so the combination of the optional '-' \r
-  sign character, '0' characters, digit characters for Value, and the Null-terminator\r
-  add up to Width characters.\r
-\r
-  If Buffer is NULL, then ASSERT().\r
-  If unsupported bits are set in Flags, then ASSERT().\r
-  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()\r
-\r
-  @param  Buffer    Pointer to the output buffer for the produced Null-terminated\r
-                    string.\r
-  @param  Flags     The bitmask of flags that specify left justification, zero pad,\r
-                    and commas.\r
-  @param  Value     The 64-bit signed value to convert to a string.\r
-  @param  Width     The maximum number of characters to place in Buffer, not including\r
-                    the Null-terminator.\r
-  @param  Increment Character increment in Buffer.\r
-  \r
-  @return The number of characters in Buffer not including the Null-terminator.\r
-\r
-**/\r
-UINTN\r
-BasePrintLibConvertValueToString (\r
-  IN OUT CHAR8   *Buffer,\r
-  IN UINTN       Flags,\r
-  IN INT64       Value,\r
-  IN UINTN       Width,\r
-  IN UINTN       Increment\r
-  )\r
-{\r
-  CHAR8  *OriginalBuffer;\r
-  CHAR8  *EndBuffer;\r
-  CHAR8  ValueBuffer[MAXIMUM_VALUE_CHARACTERS];\r
-  UINTN  Count;\r
-  UINTN  Digits;\r
-  UINTN  Index;\r
-\r
-  ASSERT (Buffer != NULL);\r
-  ASSERT (Width < MAXIMUM_VALUE_CHARACTERS);\r
-  //\r
-  // Make sure Flags can only contain supported bits.\r
-  //\r
-  ASSERT ((Flags & ~(LEFT_JUSTIFY | COMMA_TYPE | PREFIX_ZERO)) == 0);\r
-\r
-  OriginalBuffer = Buffer;\r
-\r
-  if (Width == 0 || (Flags & COMMA_TYPE) != 0) {\r
-    Flags &= (~PREFIX_ZERO);\r
-  }\r
-\r
-  if (Width == 0) {\r
-    Width = MAXIMUM_VALUE_CHARACTERS - 1;\r
-  }\r
-  //\r
-  // Set the tag for the end of the input Buffer.\r
-  //\r
-  EndBuffer = Buffer + Width * Increment;\r
-\r
-  if (Value < 0) {\r
-    Value = -Value;\r
-    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, '-', Increment);\r
-    Width--;\r
-  }\r
-\r
-  Count = BasePrintLibValueToString (ValueBuffer, Value, 10);\r
-\r
-  if ((Flags & PREFIX_ZERO) != 0) {\r
-    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Count, '0', Increment);\r
-  }\r
-\r
-  Digits = Count % 3;\r
-  if (Digits != 0) {\r
-    Digits = 3 - Digits;\r
-  }\r
-  for (Index = 0; Index < Count; Index++) {\r
-    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ValueBuffer[Count - Index], Increment);\r
-    if ((Flags & COMMA_TYPE) != 0) {\r
-      Digits++;\r
-      if (Digits == 3) {\r
-        Digits = 0;\r
-        if ((Index + 1) < Count) {\r
-          Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', Increment);\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  BasePrintLibFillBuffer (Buffer, EndBuffer, 1, 0, Increment);\r
-\r
-  return ((Buffer - OriginalBuffer) / Increment);\r
-}\r
+/** @file
+  Print Library worker functions.
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  PrintLibInternal.c
+
+**/
+
+#include "PrintLibInternal.h"
+
+GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mHexStr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
+
+
+/**
+  Internal function that places the character into the Buffer.
+
+  Internal function that places ASCII or Unicode character into the Buffer.
+
+  @param  Buffer      Buffer to place the Unicode or ASCII string.
+  @param  EndBuffer   The end of the input Buffer. No characters will be
+                      placed after that. 
+  @param  Length      Count of character to be placed into Buffer.
+  @param  Character   Character to be placed into Buffer.
+  @param  Increment   Character increment in Buffer.
+
+  @return Number of characters printed.
+
+**/
+CHAR8 *
+BasePrintLibFillBuffer (
+  CHAR8   *Buffer,
+  CHAR8   *EndBuffer,
+  INTN    Length,
+  UINTN   Character,
+  INTN    Increment
+  )
+{
+  INTN  Index;
+
+  for (Index = 0; Index < Length && Buffer < EndBuffer; Index++) {
+    *Buffer       =  (CHAR8) Character;
+    *(Buffer + 1) =  (CHAR8) (Character >> 8);
+    Buffer        += Increment;
+  }
+  return Buffer;
+}
+
+/**
+  Internal function that convert a decimal number to a string in Buffer.
+
+  Print worker function that convert a decimal number to a string in Buffer.
+
+  @param  Buffer    Location to place the Unicode or ASCII string of Value.
+  @param  Value     Value to convert to a Decimal or Hexidecimal string in Buffer.
+  @param  Radix     Radix of the value
+
+  @return Number of characters printed.
+
+**/
+UINTN
+EFIAPI
+BasePrintLibValueToString (
+  IN OUT CHAR8  *Buffer,
+  IN INT64      Value,
+  IN UINTN      Radix
+  )
+{
+  UINTN   Digits;
+  UINT32  Remainder;
+
+  //
+  // Loop to convert one digit at a time in reverse order
+  //
+  *(Buffer++) = 0;
+  Digits = 0;
+  do {
+    Value = (INT64)DivU64x32Remainder ((UINT64)Value, (UINT32)Radix, &Remainder);
+    *(Buffer++) = mHexStr[Remainder];
+    Digits++;
+  } while (Value != 0);
+  return Digits;
+}
+
+/**
+  Internal function that converts a decimal value to a Null-terminated string.
+  
+  Converts the decimal number specified by Value to a Null-terminated  
+  string specified by Buffer containing at most Width characters.
+  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.
+  The number of characters in Buffer is returned not including the Null-terminator.
+  If the conversion contains more than Width characters, then only the first
+  Width characters are returned, and the total number of characters 
+  required to perform the conversion is returned.
+  Additional conversion parameters are specified in Flags.  
+  The Flags bit LEFT_JUSTIFY is always ignored.
+  All conversions are left justified in Buffer.
+  If Width is 0, PREFIX_ZERO is ignored in Flags.
+  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas
+  are inserted every 3rd digit starting from the right.
+  If HEX_RADIX is set in Flags, then the output buffer will be formatted in hexadecimal format.
+  If Value is < 0 and HEX_RADIX is not set in Flags, then the fist character in Buffer is a '-'.
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, 
+  then Buffer is padded with '0' characters so the combination of the optional '-' 
+  sign character, '0' characters, digit characters for Value, and the Null-terminator
+  add up to Width characters.
+  If both COMMA_TYPE and HEX_RADIX are set in Flags, then ASSERT().
+
+  If Buffer is NULL, then ASSERT().
+  If unsupported bits are set in Flags, then ASSERT().
+  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()
+
+  @param  Buffer    Pointer to the output buffer for the produced Null-terminated
+                    string.
+  @param  Flags     The bitmask of flags that specify left justification, zero pad,
+                    and commas.
+  @param  Value     The 64-bit signed value to convert to a string.
+  @param  Width     The maximum number of characters to place in Buffer, not including
+                    the Null-terminator.
+  @param  Increment Character increment in Buffer.
+  
+  @return The number of characters in Buffer not including the Null-terminator.
+
+**/
+UINTN
+BasePrintLibConvertValueToString (
+  IN OUT CHAR8   *Buffer,
+  IN UINTN       Flags,
+  IN INT64       Value,
+  IN UINTN       Width,
+  IN UINTN       Increment
+  )
+{
+  CHAR8  *OriginalBuffer;
+  CHAR8  *EndBuffer;
+  CHAR8  ValueBuffer[MAXIMUM_VALUE_CHARACTERS];
+  UINTN  Count;
+  UINTN  Digits;
+  UINTN  Index;
+  UINTN  Radix;
+
+  ASSERT (Buffer != NULL);
+  ASSERT (Width < MAXIMUM_VALUE_CHARACTERS);
+  //
+  // Make sure Flags can only contain supported bits.
+  //
+  ASSERT ((Flags & ~(LEFT_JUSTIFY | COMMA_TYPE | PREFIX_ZERO | RADIX_HEX)) == 0);
+
+  //
+  // If both COMMA_TYPE and HEX_RADIX are set, then ASSERT ()
+  //
+  ASSERT (((Flags & COMMA_TYPE) != 0 && (Flags & RADIX_HEX) != 0) == FALSE);
+
+  OriginalBuffer = Buffer;
+
+  if (Width == 0 || (Flags & COMMA_TYPE) != 0) {
+    Flags &= (~PREFIX_ZERO);
+  }
+
+  if (Width == 0) {
+    Width = MAXIMUM_VALUE_CHARACTERS - 1;
+  }
+  //
+  // Set the tag for the end of the input Buffer.
+  //
+  EndBuffer = Buffer + Width * Increment;
+
+  if ((Value < 0) && ((Flags & RADIX_HEX) == 0)) {
+    Value = -Value;
+    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, '-', Increment);
+    Width--;
+  }
+
+  Radix = ((Flags & RADIX_HEX) == 0)? 10 : 16;
+  Count = BasePrintLibValueToString (ValueBuffer, Value, Radix);
+
+  if ((Flags & PREFIX_ZERO) != 0) {
+    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Count, '0', Increment);
+  }
+
+  Digits = Count % 3;
+  if (Digits != 0) {
+    Digits = 3 - Digits;
+  }
+  for (Index = 0; Index < Count; Index++) {
+    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ValueBuffer[Count - Index], Increment);
+    if ((Flags & COMMA_TYPE) != 0) {
+      Digits++;
+      if (Digits == 3) {
+        Digits = 0;
+        if ((Index + 1) < Count) {
+          Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', Increment);
+        }
+      }
+    }
+  }
+
+  BasePrintLibFillBuffer (Buffer, EndBuffer + Increment, 1, 0, Increment);
+
+  return ((Buffer - OriginalBuffer) / Increment);
+}
+