\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
+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
\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
CHAR8 *\r
BasePrintLibFillBuffer (\r
CHAR8 *Buffer,\r
+ CHAR8 *EndBuffer,\r
INTN Length,\r
UINTN Character,\r
INTN Increment\r
{\r
INTN Index;\r
\r
- for (Index = 0; Index < Length; Index++) {\r
+ for (Index = 0; Index < Length && Buffer < EndBuffer; Index++) {\r
*Buffer = (CHAR8) Character;\r
*(Buffer + 1) = (CHAR8) (Character >> 8);\r
Buffer += Increment;\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 total number of characters placed in Buffer is returned.\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
@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.\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 Total number of characters required to perform the conversion.\r
+ @return The number of characters in Buffer not including the Null-terminator.\r
\r
**/\r
UINTN\r
)\r
{\r
CHAR8 *OriginalBuffer;\r
+ CHAR8 *EndBuffer;\r
CHAR8 ValueBuffer[MAXIMUM_VALUE_CHARACTERS];\r
UINTN Count;\r
UINTN Digits;\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, 1, '-', Increment);\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, Width - Count, '0', Increment);\r
+ Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Count, '0', Increment);\r
}\r
\r
- Digits = 3 - (Count % 3);\r
+ Digits = Count % 3;\r
+ if (Digits != 0) {\r
+ Digits = 3 - Digits;\r
+ }\r
for (Index = 0; Index < Count; Index++) {\r
- Buffer = BasePrintLibFillBuffer (Buffer, 1, ValueBuffer[Count - Index], Increment);\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, 1, ',', Increment);\r
+ Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', Increment);\r
}\r
}\r
}\r
}\r
\r
- Buffer = BasePrintLibFillBuffer (Buffer, 1, 0, Increment);\r
+ BasePrintLibFillBuffer (Buffer, EndBuffer + Increment, 1, 0, Increment);\r
\r
return ((Buffer - OriginalBuffer) / Increment);\r
}\r