]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/ValueToString.c
Refine code to make it more safely.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / EfiCommonLib / ValueToString.c
CommitLineData
3eb9473e 1/*++\r
2\r
b5f8b5b0 3Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
4ea9375a 4This program and the accompanying materials \r
3eb9473e 5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 ValueToString.c\r
15\r
16Abstract:\r
17\r
18 Routines changing value to Hex or Dec string\r
19\r
20--*/\r
21\r
22#include "Tiano.h"\r
23#include "EfiDriverLib.h"\r
24\r
25static CHAR16 mHexStr[] = { L'0', L'1', L'2', L'3', L'4', L'5', L'6', L'7',\r
26 L'8', L'9', L'A', L'B', L'C', L'D', L'E', L'F' };\r
27\r
28UINTN\r
29EfiValueToHexStr (\r
30 IN OUT CHAR16 *Buffer, \r
31 IN UINT64 Value, \r
32 IN UINTN Flags, \r
33 IN UINTN Width\r
34 )\r
35/*++\r
36\r
37Routine Description:\r
38\r
39 VSPrint worker function that prints a Value as a hex number in Buffer\r
40\r
41Arguments:\r
42\r
43 Buffer - Location to place ascii hex string of Value.\r
44\r
45 Value - Hex value to convert to a string in Buffer.\r
46\r
47 Flags - Flags to use in printing Hex string, see file header for details.\r
48\r
49 Width - Width of hex value.\r
50\r
51Returns: \r
52\r
53 Number of characters printed. \r
54\r
55--*/\r
56{\r
57 CHAR16 TempBuffer[CHARACTER_NUMBER_FOR_VALUE];\r
58 CHAR16 *TempStr;\r
59 CHAR16 Prefix;\r
60 CHAR16 *BufferPtr;\r
61 UINTN Count;\r
62 UINTN Index;\r
63\r
64 TempStr = TempBuffer;\r
65 BufferPtr = Buffer;\r
66\r
67 //\r
68 // Count starts at one since we will null terminate. Each iteration of the\r
69 // loop picks off one nibble. Oh yea TempStr ends up backwards\r
70 //\r
71 Count = 0;\r
72 \r
73 if (Width > CHARACTER_NUMBER_FOR_VALUE - 1) {\r
74 Width = CHARACTER_NUMBER_FOR_VALUE - 1;\r
75 }\r
76\r
77 do {\r
78 Index = ((UINTN)Value & 0xf);\r
79 *(TempStr++) = mHexStr[Index];\r
80 Value = RShiftU64 (Value, 4);\r
81 Count++;\r
82 } while (Value != 0);\r
83\r
84 if (Flags & PREFIX_ZERO) {\r
85 Prefix = '0';\r
86 } else { \r
87 Prefix = ' ';\r
88 }\r
89\r
90 Index = Count;\r
91 if (!(Flags & LEFT_JUSTIFY)) {\r
92 for (; Index < Width; Index++) {\r
93 *(TempStr++) = Prefix;\r
94 }\r
95 }\r
96\r
97 //\r
98 // Reverse temp string into Buffer.\r
99 //\r
100 if (Width > 0 && (UINTN) (TempStr - TempBuffer) > Width) {\r
101 TempStr = TempBuffer + Width;\r
102 }\r
103 Index = 0;\r
104 while (TempStr != TempBuffer) {\r
105 *(BufferPtr++) = *(--TempStr);\r
106 Index++;\r
107 }\r
108 \r
109 *BufferPtr = 0;\r
110 return Index;\r
111}\r
112\r
113\r
114UINTN\r
115EfiValueToString (\r
116 IN OUT CHAR16 *Buffer, \r
117 IN INT64 Value, \r
118 IN UINTN Flags,\r
119 IN UINTN Width\r
120 )\r
121/*++\r
122\r
123Routine Description:\r
124\r
125 VSPrint worker function that prints a Value as a decimal number in Buffer\r
126\r
127Arguments:\r
128\r
129 Buffer - Location to place ascii decimal number string of Value.\r
130\r
131 Value - Decimal value to convert to a string in Buffer.\r
132\r
133 Flags - Flags to use in printing decimal string, see file header for details.\r
134\r
135 Width - Width of hex value.\r
136\r
137Returns: \r
138\r
139 Number of characters printed. \r
140\r
141--*/\r
142{\r
143 CHAR16 TempBuffer[CHARACTER_NUMBER_FOR_VALUE];\r
144 CHAR16 *TempStr;\r
145 CHAR16 *BufferPtr;\r
146 UINTN Count;\r
147 UINTN ValueCharNum;\r
148 UINTN Remainder;\r
149 CHAR16 Prefix;\r
150 UINTN Index;\r
151 BOOLEAN ValueIsNegative;\r
152\r
153 TempStr = TempBuffer;\r
154 BufferPtr = Buffer;\r
155 Count = 0;\r
156 ValueCharNum = 0;\r
157 ValueIsNegative = FALSE;\r
b5f8b5b0 158 Remainder = 0;\r
3eb9473e 159\r
160 if (Width > CHARACTER_NUMBER_FOR_VALUE - 1) {\r
161 Width = CHARACTER_NUMBER_FOR_VALUE - 1;\r
162 }\r
163\r
164 if (Value < 0) {\r
165 Value = -Value;\r
166 ValueIsNegative = TRUE;\r
167 }\r
168\r
169 do {\r
170 Value = (INT64)DivU64x32 ((UINT64)Value, 10, &Remainder);\r
171 *(TempStr++) = (CHAR16)(Remainder + '0');\r
172 ValueCharNum++;\r
173 Count++;\r
174 if ((Flags & COMMA_TYPE) == COMMA_TYPE) {\r
175 if (ValueCharNum % 3 == 0 && Value != 0) {\r
176 *(TempStr++) = ',';\r
177 Count++;\r
178 }\r
179 }\r
180 } while (Value != 0);\r
181\r
182 if (ValueIsNegative) {\r
183 *(TempStr++) = '-';\r
184 Count++;\r
185 }\r
186\r
187 if ((Flags & PREFIX_ZERO) && !ValueIsNegative) {\r
188 Prefix = '0';\r
189 } else { \r
190 Prefix = ' ';\r
191 } \r
192\r
193 Index = Count;\r
194 if (!(Flags & LEFT_JUSTIFY)) {\r
195 for (; Index < Width; Index++) {\r
196 *(TempStr++) = Prefix;\r
197 }\r
198 }\r
199\r
200 //\r
201 // Reverse temp string into Buffer.\r
202 //\r
203 if (Width > 0 && (UINTN) (TempStr - TempBuffer) > Width) {\r
204 TempStr = TempBuffer + Width;\r
205 }\r
206 Index = 0;\r
207 while (TempStr != TempBuffer) {\r
208 *(BufferPtr++) = *(--TempStr);\r
209 Index++;\r
210 }\r
211\r
212 *BufferPtr = 0;\r
213 return Index;\r
214}\r