diff options
author | Bob Moore <robert.moore@intel.com> | 2015-07-23 00:53:49 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-07-23 17:09:08 -0400 |
commit | 276291962ebf43abebb491ddcd922009de9fde4b (patch) | |
tree | 14dafffc9a84d5f2a2ece4e2d8ce6235b6032d99 /drivers/acpi/acpica/utstring.c | |
parent | 5a4f0693a586d73a65ccc7959e81a5618de265fe (diff) |
ACPICA: Cleanup use of all non-ANSI local C library functions
ACPICA commit 7c490c28a18b435c543c6b410e7e7c2131fccc78
ACPICA implements all non-ANSI functions locally. However, there
are sometimes two or more versions of the same function throughout
the ACPICA code. This change fixes this.
Adds a new file, utilities/utnonansi.c
Link: https://github.com/acpica/acpica/commit/7c490c28
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/utstring.c')
-rw-r--r-- | drivers/acpi/acpica/utstring.c | 342 |
1 files changed, 0 insertions, 342 deletions
diff --git a/drivers/acpi/acpica/utstring.c b/drivers/acpi/acpica/utstring.c index 8f3c883dfe0e..4ddd105d9741 100644 --- a/drivers/acpi/acpica/utstring.c +++ b/drivers/acpi/acpica/utstring.c | |||
@@ -48,286 +48,6 @@ | |||
48 | #define _COMPONENT ACPI_UTILITIES | 48 | #define _COMPONENT ACPI_UTILITIES |
49 | ACPI_MODULE_NAME("utstring") | 49 | ACPI_MODULE_NAME("utstring") |
50 | 50 | ||
51 | /* | ||
52 | * Non-ANSI C library functions - strlwr, strupr, stricmp, and a 64-bit | ||
53 | * version of strtoul. | ||
54 | */ | ||
55 | #ifdef ACPI_ASL_COMPILER | ||
56 | /******************************************************************************* | ||
57 | * | ||
58 | * FUNCTION: acpi_ut_strlwr (strlwr) | ||
59 | * | ||
60 | * PARAMETERS: src_string - The source string to convert | ||
61 | * | ||
62 | * RETURN: None | ||
63 | * | ||
64 | * DESCRIPTION: Convert string to lowercase | ||
65 | * | ||
66 | * NOTE: This is not a POSIX function, so it appears here, not in utclib.c | ||
67 | * | ||
68 | ******************************************************************************/ | ||
69 | void acpi_ut_strlwr(char *src_string) | ||
70 | { | ||
71 | char *string; | ||
72 | |||
73 | ACPI_FUNCTION_ENTRY(); | ||
74 | |||
75 | if (!src_string) { | ||
76 | return; | ||
77 | } | ||
78 | |||
79 | /* Walk entire string, lowercasing the letters */ | ||
80 | |||
81 | for (string = src_string; *string; string++) { | ||
82 | *string = (char)tolower((int)*string); | ||
83 | } | ||
84 | |||
85 | return; | ||
86 | } | ||
87 | |||
88 | /****************************************************************************** | ||
89 | * | ||
90 | * FUNCTION: acpi_ut_stricmp (stricmp) | ||
91 | * | ||
92 | * PARAMETERS: string1 - first string to compare | ||
93 | * string2 - second string to compare | ||
94 | * | ||
95 | * RETURN: int that signifies string relationship. Zero means strings | ||
96 | * are equal. | ||
97 | * | ||
98 | * DESCRIPTION: Implementation of the non-ANSI stricmp function (compare | ||
99 | * strings with no case sensitivity) | ||
100 | * | ||
101 | ******************************************************************************/ | ||
102 | |||
103 | int acpi_ut_stricmp(char *string1, char *string2) | ||
104 | { | ||
105 | int c1; | ||
106 | int c2; | ||
107 | |||
108 | do { | ||
109 | c1 = tolower((int)*string1); | ||
110 | c2 = tolower((int)*string2); | ||
111 | |||
112 | string1++; | ||
113 | string2++; | ||
114 | } | ||
115 | while ((c1 == c2) && (c1)); | ||
116 | |||
117 | return (c1 - c2); | ||
118 | } | ||
119 | #endif | ||
120 | |||
121 | /******************************************************************************* | ||
122 | * | ||
123 | * FUNCTION: acpi_ut_strupr (strupr) | ||
124 | * | ||
125 | * PARAMETERS: src_string - The source string to convert | ||
126 | * | ||
127 | * RETURN: None | ||
128 | * | ||
129 | * DESCRIPTION: Convert string to uppercase | ||
130 | * | ||
131 | * NOTE: This is not a POSIX function, so it appears here, not in utclib.c | ||
132 | * | ||
133 | ******************************************************************************/ | ||
134 | |||
135 | void acpi_ut_strupr(char *src_string) | ||
136 | { | ||
137 | char *string; | ||
138 | |||
139 | ACPI_FUNCTION_ENTRY(); | ||
140 | |||
141 | if (!src_string) { | ||
142 | return; | ||
143 | } | ||
144 | |||
145 | /* Walk entire string, uppercasing the letters */ | ||
146 | |||
147 | for (string = src_string; *string; string++) { | ||
148 | *string = (char)toupper((int)*string); | ||
149 | } | ||
150 | |||
151 | return; | ||
152 | } | ||
153 | |||
154 | /******************************************************************************* | ||
155 | * | ||
156 | * FUNCTION: acpi_ut_strtoul64 | ||
157 | * | ||
158 | * PARAMETERS: string - Null terminated string | ||
159 | * base - Radix of the string: 16 or ACPI_ANY_BASE; | ||
160 | * ACPI_ANY_BASE means 'in behalf of to_integer' | ||
161 | * ret_integer - Where the converted integer is returned | ||
162 | * | ||
163 | * RETURN: Status and Converted value | ||
164 | * | ||
165 | * DESCRIPTION: Convert a string into an unsigned value. Performs either a | ||
166 | * 32-bit or 64-bit conversion, depending on the current mode | ||
167 | * of the interpreter. | ||
168 | * NOTE: Does not support Octal strings, not needed. | ||
169 | * | ||
170 | ******************************************************************************/ | ||
171 | |||
172 | acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer) | ||
173 | { | ||
174 | u32 this_digit = 0; | ||
175 | u64 return_value = 0; | ||
176 | u64 quotient; | ||
177 | u64 dividend; | ||
178 | u32 to_integer_op = (base == ACPI_ANY_BASE); | ||
179 | u32 mode32 = (acpi_gbl_integer_byte_width == 4); | ||
180 | u8 valid_digits = 0; | ||
181 | u8 sign_of0x = 0; | ||
182 | u8 term = 0; | ||
183 | |||
184 | ACPI_FUNCTION_TRACE_STR(ut_stroul64, string); | ||
185 | |||
186 | switch (base) { | ||
187 | case ACPI_ANY_BASE: | ||
188 | case 16: | ||
189 | |||
190 | break; | ||
191 | |||
192 | default: | ||
193 | |||
194 | /* Invalid Base */ | ||
195 | |||
196 | return_ACPI_STATUS(AE_BAD_PARAMETER); | ||
197 | } | ||
198 | |||
199 | if (!string) { | ||
200 | goto error_exit; | ||
201 | } | ||
202 | |||
203 | /* Skip over any white space in the buffer */ | ||
204 | |||
205 | while ((*string) && (isspace((int)*string) || *string == '\t')) { | ||
206 | string++; | ||
207 | } | ||
208 | |||
209 | if (to_integer_op) { | ||
210 | /* | ||
211 | * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'. | ||
212 | * We need to determine if it is decimal or hexadecimal. | ||
213 | */ | ||
214 | if ((*string == '0') && (tolower((int)*(string + 1)) == 'x')) { | ||
215 | sign_of0x = 1; | ||
216 | base = 16; | ||
217 | |||
218 | /* Skip over the leading '0x' */ | ||
219 | string += 2; | ||
220 | } else { | ||
221 | base = 10; | ||
222 | } | ||
223 | } | ||
224 | |||
225 | /* Any string left? Check that '0x' is not followed by white space. */ | ||
226 | |||
227 | if (!(*string) || isspace((int)*string) || *string == '\t') { | ||
228 | if (to_integer_op) { | ||
229 | goto error_exit; | ||
230 | } else { | ||
231 | goto all_done; | ||
232 | } | ||
233 | } | ||
234 | |||
235 | /* | ||
236 | * Perform a 32-bit or 64-bit conversion, depending upon the current | ||
237 | * execution mode of the interpreter | ||
238 | */ | ||
239 | dividend = (mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX; | ||
240 | |||
241 | /* Main loop: convert the string to a 32- or 64-bit integer */ | ||
242 | |||
243 | while (*string) { | ||
244 | if (isdigit((int)*string)) { | ||
245 | |||
246 | /* Convert ASCII 0-9 to Decimal value */ | ||
247 | |||
248 | this_digit = ((u8)*string) - '0'; | ||
249 | } else if (base == 10) { | ||
250 | |||
251 | /* Digit is out of range; possible in to_integer case only */ | ||
252 | |||
253 | term = 1; | ||
254 | } else { | ||
255 | this_digit = (u8)toupper((int)*string); | ||
256 | if (isxdigit((int)this_digit)) { | ||
257 | |||
258 | /* Convert ASCII Hex char to value */ | ||
259 | |||
260 | this_digit = this_digit - 'A' + 10; | ||
261 | } else { | ||
262 | term = 1; | ||
263 | } | ||
264 | } | ||
265 | |||
266 | if (term) { | ||
267 | if (to_integer_op) { | ||
268 | goto error_exit; | ||
269 | } else { | ||
270 | break; | ||
271 | } | ||
272 | } else if ((valid_digits == 0) && (this_digit == 0) | ||
273 | && !sign_of0x) { | ||
274 | |||
275 | /* Skip zeros */ | ||
276 | string++; | ||
277 | continue; | ||
278 | } | ||
279 | |||
280 | valid_digits++; | ||
281 | |||
282 | if (sign_of0x | ||
283 | && ((valid_digits > 16) | ||
284 | || ((valid_digits > 8) && mode32))) { | ||
285 | /* | ||
286 | * This is to_integer operation case. | ||
287 | * No any restrictions for string-to-integer conversion, | ||
288 | * see ACPI spec. | ||
289 | */ | ||
290 | goto error_exit; | ||
291 | } | ||
292 | |||
293 | /* Divide the digit into the correct position */ | ||
294 | |||
295 | (void)acpi_ut_short_divide((dividend - (u64)this_digit), | ||
296 | base, "ient, NULL); | ||
297 | |||
298 | if (return_value > quotient) { | ||
299 | if (to_integer_op) { | ||
300 | goto error_exit; | ||
301 | } else { | ||
302 | break; | ||
303 | } | ||
304 | } | ||
305 | |||
306 | return_value *= base; | ||
307 | return_value += this_digit; | ||
308 | string++; | ||
309 | } | ||
310 | |||
311 | /* All done, normal exit */ | ||
312 | |||
313 | all_done: | ||
314 | |||
315 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n", | ||
316 | ACPI_FORMAT_UINT64(return_value))); | ||
317 | |||
318 | *ret_integer = return_value; | ||
319 | return_ACPI_STATUS(AE_OK); | ||
320 | |||
321 | error_exit: | ||
322 | /* Base was set/validated above */ | ||
323 | |||
324 | if (base == 10) { | ||
325 | return_ACPI_STATUS(AE_BAD_DECIMAL_CONSTANT); | ||
326 | } else { | ||
327 | return_ACPI_STATUS(AE_BAD_HEX_CONSTANT); | ||
328 | } | ||
329 | } | ||
330 | |||
331 | /******************************************************************************* | 51 | /******************************************************************************* |
332 | * | 52 | * |
333 | * FUNCTION: acpi_ut_print_string | 53 | * FUNCTION: acpi_ut_print_string |
@@ -342,7 +62,6 @@ error_exit: | |||
342 | * sequences. | 62 | * sequences. |
343 | * | 63 | * |
344 | ******************************************************************************/ | 64 | ******************************************************************************/ |
345 | |||
346 | void acpi_ut_print_string(char *string, u16 max_length) | 65 | void acpi_ut_print_string(char *string, u16 max_length) |
347 | { | 66 | { |
348 | u32 i; | 67 | u32 i; |
@@ -584,64 +303,3 @@ void ut_convert_backslashes(char *pathname) | |||
584 | } | 303 | } |
585 | } | 304 | } |
586 | #endif | 305 | #endif |
587 | |||
588 | #if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) | ||
589 | /******************************************************************************* | ||
590 | * | ||
591 | * FUNCTION: acpi_ut_safe_strcpy, acpi_ut_safe_strcat, acpi_ut_safe_strncat | ||
592 | * | ||
593 | * PARAMETERS: Adds a "DestSize" parameter to each of the standard string | ||
594 | * functions. This is the size of the Destination buffer. | ||
595 | * | ||
596 | * RETURN: TRUE if the operation would overflow the destination buffer. | ||
597 | * | ||
598 | * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that | ||
599 | * the result of the operation will not overflow the output string | ||
600 | * buffer. | ||
601 | * | ||
602 | * NOTE: These functions are typically only helpful for processing | ||
603 | * user input and command lines. For most ACPICA code, the | ||
604 | * required buffer length is precisely calculated before buffer | ||
605 | * allocation, so the use of these functions is unnecessary. | ||
606 | * | ||
607 | ******************************************************************************/ | ||
608 | |||
609 | u8 acpi_ut_safe_strcpy(char *dest, acpi_size dest_size, char *source) | ||
610 | { | ||
611 | |||
612 | if (strlen(source) >= dest_size) { | ||
613 | return (TRUE); | ||
614 | } | ||
615 | |||
616 | strcpy(dest, source); | ||
617 | return (FALSE); | ||
618 | } | ||
619 | |||
620 | u8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source) | ||
621 | { | ||
622 | |||
623 | if ((strlen(dest) + strlen(source)) >= dest_size) { | ||
624 | return (TRUE); | ||
625 | } | ||
626 | |||
627 | strcat(dest, source); | ||
628 | return (FALSE); | ||
629 | } | ||
630 | |||
631 | u8 | ||
632 | acpi_ut_safe_strncat(char *dest, | ||
633 | acpi_size dest_size, | ||
634 | char *source, acpi_size max_transfer_length) | ||
635 | { | ||
636 | acpi_size actual_transfer_length; | ||
637 | |||
638 | actual_transfer_length = ACPI_MIN(max_transfer_length, strlen(source)); | ||
639 | |||
640 | if ((strlen(dest) + actual_transfer_length) >= dest_size) { | ||
641 | return (TRUE); | ||
642 | } | ||
643 | |||
644 | strncat(dest, source, max_transfer_length); | ||
645 | return (FALSE); | ||
646 | } | ||
647 | #endif | ||