xref: /freebsd/sys/contrib/dev/acpica/components/utilities/utnonansi.c (revision fe0f0bbb19f4f267df5c6249d1af4d6f665dfd52)
1*fe0f0bbbSJung-uk Kim /*******************************************************************************
2*fe0f0bbbSJung-uk Kim  *
3*fe0f0bbbSJung-uk Kim  * Module Name: utnonansi - Non-ansi C library functions
4*fe0f0bbbSJung-uk Kim  *
5*fe0f0bbbSJung-uk Kim  ******************************************************************************/
6*fe0f0bbbSJung-uk Kim 
7*fe0f0bbbSJung-uk Kim /*
8*fe0f0bbbSJung-uk Kim  * Copyright (C) 2000 - 2015, Intel Corp.
9*fe0f0bbbSJung-uk Kim  * All rights reserved.
10*fe0f0bbbSJung-uk Kim  *
11*fe0f0bbbSJung-uk Kim  * Redistribution and use in source and binary forms, with or without
12*fe0f0bbbSJung-uk Kim  * modification, are permitted provided that the following conditions
13*fe0f0bbbSJung-uk Kim  * are met:
14*fe0f0bbbSJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
15*fe0f0bbbSJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
16*fe0f0bbbSJung-uk Kim  *    without modification.
17*fe0f0bbbSJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18*fe0f0bbbSJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
19*fe0f0bbbSJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
20*fe0f0bbbSJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
21*fe0f0bbbSJung-uk Kim  *    binary redistribution.
22*fe0f0bbbSJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
23*fe0f0bbbSJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
24*fe0f0bbbSJung-uk Kim  *    from this software without specific prior written permission.
25*fe0f0bbbSJung-uk Kim  *
26*fe0f0bbbSJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
27*fe0f0bbbSJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
28*fe0f0bbbSJung-uk Kim  * Software Foundation.
29*fe0f0bbbSJung-uk Kim  *
30*fe0f0bbbSJung-uk Kim  * NO WARRANTY
31*fe0f0bbbSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32*fe0f0bbbSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33*fe0f0bbbSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34*fe0f0bbbSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35*fe0f0bbbSJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36*fe0f0bbbSJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37*fe0f0bbbSJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38*fe0f0bbbSJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39*fe0f0bbbSJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40*fe0f0bbbSJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41*fe0f0bbbSJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
42*fe0f0bbbSJung-uk Kim  */
43*fe0f0bbbSJung-uk Kim 
44*fe0f0bbbSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h>
45*fe0f0bbbSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h>
46*fe0f0bbbSJung-uk Kim 
47*fe0f0bbbSJung-uk Kim 
48*fe0f0bbbSJung-uk Kim #define _COMPONENT          ACPI_UTILITIES
49*fe0f0bbbSJung-uk Kim         ACPI_MODULE_NAME    ("utnonansi")
50*fe0f0bbbSJung-uk Kim 
51*fe0f0bbbSJung-uk Kim 
52*fe0f0bbbSJung-uk Kim /*
53*fe0f0bbbSJung-uk Kim  * Non-ANSI C library functions - strlwr, strupr, stricmp, and a 64-bit
54*fe0f0bbbSJung-uk Kim  * version of strtoul.
55*fe0f0bbbSJung-uk Kim  */
56*fe0f0bbbSJung-uk Kim 
57*fe0f0bbbSJung-uk Kim /*******************************************************************************
58*fe0f0bbbSJung-uk Kim  *
59*fe0f0bbbSJung-uk Kim  * FUNCTION:    AcpiUtStrlwr (strlwr)
60*fe0f0bbbSJung-uk Kim  *
61*fe0f0bbbSJung-uk Kim  * PARAMETERS:  SrcString       - The source string to convert
62*fe0f0bbbSJung-uk Kim  *
63*fe0f0bbbSJung-uk Kim  * RETURN:      None
64*fe0f0bbbSJung-uk Kim  *
65*fe0f0bbbSJung-uk Kim  * DESCRIPTION: Convert a string to lowercase
66*fe0f0bbbSJung-uk Kim  *
67*fe0f0bbbSJung-uk Kim  ******************************************************************************/
68*fe0f0bbbSJung-uk Kim 
69*fe0f0bbbSJung-uk Kim void
70*fe0f0bbbSJung-uk Kim AcpiUtStrlwr (
71*fe0f0bbbSJung-uk Kim     char                    *SrcString)
72*fe0f0bbbSJung-uk Kim {
73*fe0f0bbbSJung-uk Kim     char                    *String;
74*fe0f0bbbSJung-uk Kim 
75*fe0f0bbbSJung-uk Kim 
76*fe0f0bbbSJung-uk Kim     ACPI_FUNCTION_ENTRY ();
77*fe0f0bbbSJung-uk Kim 
78*fe0f0bbbSJung-uk Kim 
79*fe0f0bbbSJung-uk Kim     if (!SrcString)
80*fe0f0bbbSJung-uk Kim     {
81*fe0f0bbbSJung-uk Kim         return;
82*fe0f0bbbSJung-uk Kim     }
83*fe0f0bbbSJung-uk Kim 
84*fe0f0bbbSJung-uk Kim     /* Walk entire string, lowercasing the letters */
85*fe0f0bbbSJung-uk Kim 
86*fe0f0bbbSJung-uk Kim     for (String = SrcString; *String; String++)
87*fe0f0bbbSJung-uk Kim     {
88*fe0f0bbbSJung-uk Kim         *String = (char) tolower ((int) *String);
89*fe0f0bbbSJung-uk Kim     }
90*fe0f0bbbSJung-uk Kim }
91*fe0f0bbbSJung-uk Kim 
92*fe0f0bbbSJung-uk Kim 
93*fe0f0bbbSJung-uk Kim /*******************************************************************************
94*fe0f0bbbSJung-uk Kim  *
95*fe0f0bbbSJung-uk Kim  * FUNCTION:    AcpiUtStrupr (strupr)
96*fe0f0bbbSJung-uk Kim  *
97*fe0f0bbbSJung-uk Kim  * PARAMETERS:  SrcString       - The source string to convert
98*fe0f0bbbSJung-uk Kim  *
99*fe0f0bbbSJung-uk Kim  * RETURN:      None
100*fe0f0bbbSJung-uk Kim  *
101*fe0f0bbbSJung-uk Kim  * DESCRIPTION: Convert a string to uppercase
102*fe0f0bbbSJung-uk Kim  *
103*fe0f0bbbSJung-uk Kim  ******************************************************************************/
104*fe0f0bbbSJung-uk Kim 
105*fe0f0bbbSJung-uk Kim void
106*fe0f0bbbSJung-uk Kim AcpiUtStrupr (
107*fe0f0bbbSJung-uk Kim     char                    *SrcString)
108*fe0f0bbbSJung-uk Kim {
109*fe0f0bbbSJung-uk Kim     char                    *String;
110*fe0f0bbbSJung-uk Kim 
111*fe0f0bbbSJung-uk Kim 
112*fe0f0bbbSJung-uk Kim     ACPI_FUNCTION_ENTRY ();
113*fe0f0bbbSJung-uk Kim 
114*fe0f0bbbSJung-uk Kim 
115*fe0f0bbbSJung-uk Kim     if (!SrcString)
116*fe0f0bbbSJung-uk Kim     {
117*fe0f0bbbSJung-uk Kim         return;
118*fe0f0bbbSJung-uk Kim     }
119*fe0f0bbbSJung-uk Kim 
120*fe0f0bbbSJung-uk Kim     /* Walk entire string, uppercasing the letters */
121*fe0f0bbbSJung-uk Kim 
122*fe0f0bbbSJung-uk Kim     for (String = SrcString; *String; String++)
123*fe0f0bbbSJung-uk Kim     {
124*fe0f0bbbSJung-uk Kim         *String = (char) toupper ((int) *String);
125*fe0f0bbbSJung-uk Kim     }
126*fe0f0bbbSJung-uk Kim }
127*fe0f0bbbSJung-uk Kim 
128*fe0f0bbbSJung-uk Kim 
129*fe0f0bbbSJung-uk Kim /******************************************************************************
130*fe0f0bbbSJung-uk Kim  *
131*fe0f0bbbSJung-uk Kim  * FUNCTION:    AcpiUtStricmp (stricmp)
132*fe0f0bbbSJung-uk Kim  *
133*fe0f0bbbSJung-uk Kim  * PARAMETERS:  String1             - first string to compare
134*fe0f0bbbSJung-uk Kim  *              String2             - second string to compare
135*fe0f0bbbSJung-uk Kim  *
136*fe0f0bbbSJung-uk Kim  * RETURN:      int that signifies string relationship. Zero means strings
137*fe0f0bbbSJung-uk Kim  *              are equal.
138*fe0f0bbbSJung-uk Kim  *
139*fe0f0bbbSJung-uk Kim  * DESCRIPTION: Case-insensitive string compare. Implementation of the
140*fe0f0bbbSJung-uk Kim  *              non-ANSI stricmp function.
141*fe0f0bbbSJung-uk Kim  *
142*fe0f0bbbSJung-uk Kim  ******************************************************************************/
143*fe0f0bbbSJung-uk Kim 
144*fe0f0bbbSJung-uk Kim int
145*fe0f0bbbSJung-uk Kim AcpiUtStricmp (
146*fe0f0bbbSJung-uk Kim     char                    *String1,
147*fe0f0bbbSJung-uk Kim     char                    *String2)
148*fe0f0bbbSJung-uk Kim {
149*fe0f0bbbSJung-uk Kim     int                     c1;
150*fe0f0bbbSJung-uk Kim     int                     c2;
151*fe0f0bbbSJung-uk Kim 
152*fe0f0bbbSJung-uk Kim 
153*fe0f0bbbSJung-uk Kim     do
154*fe0f0bbbSJung-uk Kim     {
155*fe0f0bbbSJung-uk Kim         c1 = tolower ((int) *String1);
156*fe0f0bbbSJung-uk Kim         c2 = tolower ((int) *String2);
157*fe0f0bbbSJung-uk Kim 
158*fe0f0bbbSJung-uk Kim         String1++;
159*fe0f0bbbSJung-uk Kim         String2++;
160*fe0f0bbbSJung-uk Kim     }
161*fe0f0bbbSJung-uk Kim     while ((c1 == c2) && (c1));
162*fe0f0bbbSJung-uk Kim 
163*fe0f0bbbSJung-uk Kim     return (c1 - c2);
164*fe0f0bbbSJung-uk Kim }
165*fe0f0bbbSJung-uk Kim 
166*fe0f0bbbSJung-uk Kim 
167*fe0f0bbbSJung-uk Kim /*******************************************************************************
168*fe0f0bbbSJung-uk Kim  *
169*fe0f0bbbSJung-uk Kim  * FUNCTION:    AcpiUtStrtoul64
170*fe0f0bbbSJung-uk Kim  *
171*fe0f0bbbSJung-uk Kim  * PARAMETERS:  String          - Null terminated string
172*fe0f0bbbSJung-uk Kim  *              Base            - Radix of the string: 16 or ACPI_ANY_BASE;
173*fe0f0bbbSJung-uk Kim  *                                ACPI_ANY_BASE means 'in behalf of ToInteger'
174*fe0f0bbbSJung-uk Kim  *              RetInteger      - Where the converted integer is returned
175*fe0f0bbbSJung-uk Kim  *
176*fe0f0bbbSJung-uk Kim  * RETURN:      Status and Converted value
177*fe0f0bbbSJung-uk Kim  *
178*fe0f0bbbSJung-uk Kim  * DESCRIPTION: Convert a string into an unsigned value. Performs either a
179*fe0f0bbbSJung-uk Kim  *              32-bit or 64-bit conversion, depending on the current mode
180*fe0f0bbbSJung-uk Kim  *              of the interpreter.
181*fe0f0bbbSJung-uk Kim  *
182*fe0f0bbbSJung-uk Kim  * NOTE:        Does not support Octal strings, not needed.
183*fe0f0bbbSJung-uk Kim  *
184*fe0f0bbbSJung-uk Kim  ******************************************************************************/
185*fe0f0bbbSJung-uk Kim 
186*fe0f0bbbSJung-uk Kim ACPI_STATUS
187*fe0f0bbbSJung-uk Kim AcpiUtStrtoul64 (
188*fe0f0bbbSJung-uk Kim     char                    *String,
189*fe0f0bbbSJung-uk Kim     UINT32                  Base,
190*fe0f0bbbSJung-uk Kim     UINT64                  *RetInteger)
191*fe0f0bbbSJung-uk Kim {
192*fe0f0bbbSJung-uk Kim     UINT32                  ThisDigit = 0;
193*fe0f0bbbSJung-uk Kim     UINT64                  ReturnValue = 0;
194*fe0f0bbbSJung-uk Kim     UINT64                  Quotient;
195*fe0f0bbbSJung-uk Kim     UINT64                  Dividend;
196*fe0f0bbbSJung-uk Kim     UINT32                  ToIntegerOp = (Base == ACPI_ANY_BASE);
197*fe0f0bbbSJung-uk Kim     UINT32                  Mode32 = (AcpiGbl_IntegerByteWidth == 4);
198*fe0f0bbbSJung-uk Kim     UINT8                   ValidDigits = 0;
199*fe0f0bbbSJung-uk Kim     UINT8                   SignOf0x = 0;
200*fe0f0bbbSJung-uk Kim     UINT8                   Term = 0;
201*fe0f0bbbSJung-uk Kim 
202*fe0f0bbbSJung-uk Kim 
203*fe0f0bbbSJung-uk Kim     ACPI_FUNCTION_TRACE_STR (UtStroul64, String);
204*fe0f0bbbSJung-uk Kim 
205*fe0f0bbbSJung-uk Kim 
206*fe0f0bbbSJung-uk Kim     switch (Base)
207*fe0f0bbbSJung-uk Kim     {
208*fe0f0bbbSJung-uk Kim     case ACPI_ANY_BASE:
209*fe0f0bbbSJung-uk Kim     case 16:
210*fe0f0bbbSJung-uk Kim 
211*fe0f0bbbSJung-uk Kim         break;
212*fe0f0bbbSJung-uk Kim 
213*fe0f0bbbSJung-uk Kim     default:
214*fe0f0bbbSJung-uk Kim 
215*fe0f0bbbSJung-uk Kim         /* Invalid Base */
216*fe0f0bbbSJung-uk Kim 
217*fe0f0bbbSJung-uk Kim         return_ACPI_STATUS (AE_BAD_PARAMETER);
218*fe0f0bbbSJung-uk Kim     }
219*fe0f0bbbSJung-uk Kim 
220*fe0f0bbbSJung-uk Kim     if (!String)
221*fe0f0bbbSJung-uk Kim     {
222*fe0f0bbbSJung-uk Kim         goto ErrorExit;
223*fe0f0bbbSJung-uk Kim     }
224*fe0f0bbbSJung-uk Kim 
225*fe0f0bbbSJung-uk Kim     /* Skip over any white space in the buffer */
226*fe0f0bbbSJung-uk Kim 
227*fe0f0bbbSJung-uk Kim     while ((*String) && (isspace ((int) *String) || *String == '\t'))
228*fe0f0bbbSJung-uk Kim     {
229*fe0f0bbbSJung-uk Kim         String++;
230*fe0f0bbbSJung-uk Kim     }
231*fe0f0bbbSJung-uk Kim 
232*fe0f0bbbSJung-uk Kim     if (ToIntegerOp)
233*fe0f0bbbSJung-uk Kim     {
234*fe0f0bbbSJung-uk Kim         /*
235*fe0f0bbbSJung-uk Kim          * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'.
236*fe0f0bbbSJung-uk Kim          * We need to determine if it is decimal or hexadecimal.
237*fe0f0bbbSJung-uk Kim          */
238*fe0f0bbbSJung-uk Kim         if ((*String == '0') && (tolower ((int) *(String + 1)) == 'x'))
239*fe0f0bbbSJung-uk Kim         {
240*fe0f0bbbSJung-uk Kim             SignOf0x = 1;
241*fe0f0bbbSJung-uk Kim             Base = 16;
242*fe0f0bbbSJung-uk Kim 
243*fe0f0bbbSJung-uk Kim             /* Skip over the leading '0x' */
244*fe0f0bbbSJung-uk Kim             String += 2;
245*fe0f0bbbSJung-uk Kim         }
246*fe0f0bbbSJung-uk Kim         else
247*fe0f0bbbSJung-uk Kim         {
248*fe0f0bbbSJung-uk Kim             Base = 10;
249*fe0f0bbbSJung-uk Kim         }
250*fe0f0bbbSJung-uk Kim     }
251*fe0f0bbbSJung-uk Kim 
252*fe0f0bbbSJung-uk Kim     /* Any string left? Check that '0x' is not followed by white space. */
253*fe0f0bbbSJung-uk Kim 
254*fe0f0bbbSJung-uk Kim     if (!(*String) || isspace ((int) *String) || *String == '\t')
255*fe0f0bbbSJung-uk Kim     {
256*fe0f0bbbSJung-uk Kim         if (ToIntegerOp)
257*fe0f0bbbSJung-uk Kim         {
258*fe0f0bbbSJung-uk Kim             goto ErrorExit;
259*fe0f0bbbSJung-uk Kim         }
260*fe0f0bbbSJung-uk Kim         else
261*fe0f0bbbSJung-uk Kim         {
262*fe0f0bbbSJung-uk Kim             goto AllDone;
263*fe0f0bbbSJung-uk Kim         }
264*fe0f0bbbSJung-uk Kim     }
265*fe0f0bbbSJung-uk Kim 
266*fe0f0bbbSJung-uk Kim     /*
267*fe0f0bbbSJung-uk Kim      * Perform a 32-bit or 64-bit conversion, depending upon the current
268*fe0f0bbbSJung-uk Kim      * execution mode of the interpreter
269*fe0f0bbbSJung-uk Kim      */
270*fe0f0bbbSJung-uk Kim     Dividend = (Mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;
271*fe0f0bbbSJung-uk Kim 
272*fe0f0bbbSJung-uk Kim     /* Main loop: convert the string to a 32- or 64-bit integer */
273*fe0f0bbbSJung-uk Kim 
274*fe0f0bbbSJung-uk Kim     while (*String)
275*fe0f0bbbSJung-uk Kim     {
276*fe0f0bbbSJung-uk Kim         if (isdigit ((int) *String))
277*fe0f0bbbSJung-uk Kim         {
278*fe0f0bbbSJung-uk Kim             /* Convert ASCII 0-9 to Decimal value */
279*fe0f0bbbSJung-uk Kim 
280*fe0f0bbbSJung-uk Kim             ThisDigit = ((UINT8) *String) - '0';
281*fe0f0bbbSJung-uk Kim         }
282*fe0f0bbbSJung-uk Kim         else if (Base == 10)
283*fe0f0bbbSJung-uk Kim         {
284*fe0f0bbbSJung-uk Kim             /* Digit is out of range; possible in ToInteger case only */
285*fe0f0bbbSJung-uk Kim 
286*fe0f0bbbSJung-uk Kim             Term = 1;
287*fe0f0bbbSJung-uk Kim         }
288*fe0f0bbbSJung-uk Kim         else
289*fe0f0bbbSJung-uk Kim         {
290*fe0f0bbbSJung-uk Kim             ThisDigit = (UINT8) toupper ((int) *String);
291*fe0f0bbbSJung-uk Kim             if (isxdigit ((int) ThisDigit))
292*fe0f0bbbSJung-uk Kim             {
293*fe0f0bbbSJung-uk Kim                 /* Convert ASCII Hex char to value */
294*fe0f0bbbSJung-uk Kim 
295*fe0f0bbbSJung-uk Kim                 ThisDigit = ThisDigit - 'A' + 10;
296*fe0f0bbbSJung-uk Kim             }
297*fe0f0bbbSJung-uk Kim             else
298*fe0f0bbbSJung-uk Kim             {
299*fe0f0bbbSJung-uk Kim                 Term = 1;
300*fe0f0bbbSJung-uk Kim             }
301*fe0f0bbbSJung-uk Kim         }
302*fe0f0bbbSJung-uk Kim 
303*fe0f0bbbSJung-uk Kim         if (Term)
304*fe0f0bbbSJung-uk Kim         {
305*fe0f0bbbSJung-uk Kim             if (ToIntegerOp)
306*fe0f0bbbSJung-uk Kim             {
307*fe0f0bbbSJung-uk Kim                 goto ErrorExit;
308*fe0f0bbbSJung-uk Kim             }
309*fe0f0bbbSJung-uk Kim             else
310*fe0f0bbbSJung-uk Kim             {
311*fe0f0bbbSJung-uk Kim                 break;
312*fe0f0bbbSJung-uk Kim             }
313*fe0f0bbbSJung-uk Kim         }
314*fe0f0bbbSJung-uk Kim         else if ((ValidDigits == 0) && (ThisDigit == 0) && !SignOf0x)
315*fe0f0bbbSJung-uk Kim         {
316*fe0f0bbbSJung-uk Kim             /* Skip zeros */
317*fe0f0bbbSJung-uk Kim             String++;
318*fe0f0bbbSJung-uk Kim             continue;
319*fe0f0bbbSJung-uk Kim         }
320*fe0f0bbbSJung-uk Kim 
321*fe0f0bbbSJung-uk Kim         ValidDigits++;
322*fe0f0bbbSJung-uk Kim 
323*fe0f0bbbSJung-uk Kim         if (SignOf0x && ((ValidDigits > 16) || ((ValidDigits > 8) && Mode32)))
324*fe0f0bbbSJung-uk Kim         {
325*fe0f0bbbSJung-uk Kim             /*
326*fe0f0bbbSJung-uk Kim              * This is ToInteger operation case.
327*fe0f0bbbSJung-uk Kim              * No any restrictions for string-to-integer conversion,
328*fe0f0bbbSJung-uk Kim              * see ACPI spec.
329*fe0f0bbbSJung-uk Kim              */
330*fe0f0bbbSJung-uk Kim             goto ErrorExit;
331*fe0f0bbbSJung-uk Kim         }
332*fe0f0bbbSJung-uk Kim 
333*fe0f0bbbSJung-uk Kim         /* Divide the digit into the correct position */
334*fe0f0bbbSJung-uk Kim 
335*fe0f0bbbSJung-uk Kim         (void) AcpiUtShortDivide ((Dividend - (UINT64) ThisDigit),
336*fe0f0bbbSJung-uk Kim                     Base, &Quotient, NULL);
337*fe0f0bbbSJung-uk Kim 
338*fe0f0bbbSJung-uk Kim         if (ReturnValue > Quotient)
339*fe0f0bbbSJung-uk Kim         {
340*fe0f0bbbSJung-uk Kim             if (ToIntegerOp)
341*fe0f0bbbSJung-uk Kim             {
342*fe0f0bbbSJung-uk Kim                 goto ErrorExit;
343*fe0f0bbbSJung-uk Kim             }
344*fe0f0bbbSJung-uk Kim             else
345*fe0f0bbbSJung-uk Kim             {
346*fe0f0bbbSJung-uk Kim                 break;
347*fe0f0bbbSJung-uk Kim             }
348*fe0f0bbbSJung-uk Kim         }
349*fe0f0bbbSJung-uk Kim 
350*fe0f0bbbSJung-uk Kim         ReturnValue *= Base;
351*fe0f0bbbSJung-uk Kim         ReturnValue += ThisDigit;
352*fe0f0bbbSJung-uk Kim         String++;
353*fe0f0bbbSJung-uk Kim     }
354*fe0f0bbbSJung-uk Kim 
355*fe0f0bbbSJung-uk Kim     /* All done, normal exit */
356*fe0f0bbbSJung-uk Kim 
357*fe0f0bbbSJung-uk Kim AllDone:
358*fe0f0bbbSJung-uk Kim 
359*fe0f0bbbSJung-uk Kim     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
360*fe0f0bbbSJung-uk Kim         ACPI_FORMAT_UINT64 (ReturnValue)));
361*fe0f0bbbSJung-uk Kim 
362*fe0f0bbbSJung-uk Kim     *RetInteger = ReturnValue;
363*fe0f0bbbSJung-uk Kim     return_ACPI_STATUS (AE_OK);
364*fe0f0bbbSJung-uk Kim 
365*fe0f0bbbSJung-uk Kim 
366*fe0f0bbbSJung-uk Kim ErrorExit:
367*fe0f0bbbSJung-uk Kim     /* Base was set/validated above */
368*fe0f0bbbSJung-uk Kim 
369*fe0f0bbbSJung-uk Kim     if (Base == 10)
370*fe0f0bbbSJung-uk Kim     {
371*fe0f0bbbSJung-uk Kim         return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT);
372*fe0f0bbbSJung-uk Kim     }
373*fe0f0bbbSJung-uk Kim     else
374*fe0f0bbbSJung-uk Kim     {
375*fe0f0bbbSJung-uk Kim         return_ACPI_STATUS (AE_BAD_HEX_CONSTANT);
376*fe0f0bbbSJung-uk Kim     }
377*fe0f0bbbSJung-uk Kim }
378*fe0f0bbbSJung-uk Kim 
379*fe0f0bbbSJung-uk Kim 
380*fe0f0bbbSJung-uk Kim #if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION)
381*fe0f0bbbSJung-uk Kim /*******************************************************************************
382*fe0f0bbbSJung-uk Kim  *
383*fe0f0bbbSJung-uk Kim  * FUNCTION:    AcpiUtSafeStrcpy, AcpiUtSafeStrcat, AcpiUtSafeStrncat
384*fe0f0bbbSJung-uk Kim  *
385*fe0f0bbbSJung-uk Kim  * PARAMETERS:  Adds a "DestSize" parameter to each of the standard string
386*fe0f0bbbSJung-uk Kim  *              functions. This is the size of the Destination buffer.
387*fe0f0bbbSJung-uk Kim  *
388*fe0f0bbbSJung-uk Kim  * RETURN:      TRUE if the operation would overflow the destination buffer.
389*fe0f0bbbSJung-uk Kim  *
390*fe0f0bbbSJung-uk Kim  * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that
391*fe0f0bbbSJung-uk Kim  *              the result of the operation will not overflow the output string
392*fe0f0bbbSJung-uk Kim  *              buffer.
393*fe0f0bbbSJung-uk Kim  *
394*fe0f0bbbSJung-uk Kim  * NOTE:        These functions are typically only helpful for processing
395*fe0f0bbbSJung-uk Kim  *              user input and command lines. For most ACPICA code, the
396*fe0f0bbbSJung-uk Kim  *              required buffer length is precisely calculated before buffer
397*fe0f0bbbSJung-uk Kim  *              allocation, so the use of these functions is unnecessary.
398*fe0f0bbbSJung-uk Kim  *
399*fe0f0bbbSJung-uk Kim  ******************************************************************************/
400*fe0f0bbbSJung-uk Kim 
401*fe0f0bbbSJung-uk Kim BOOLEAN
402*fe0f0bbbSJung-uk Kim AcpiUtSafeStrcpy (
403*fe0f0bbbSJung-uk Kim     char                    *Dest,
404*fe0f0bbbSJung-uk Kim     ACPI_SIZE               DestSize,
405*fe0f0bbbSJung-uk Kim     char                    *Source)
406*fe0f0bbbSJung-uk Kim {
407*fe0f0bbbSJung-uk Kim 
408*fe0f0bbbSJung-uk Kim     if (strlen (Source) >= DestSize)
409*fe0f0bbbSJung-uk Kim     {
410*fe0f0bbbSJung-uk Kim         return (TRUE);
411*fe0f0bbbSJung-uk Kim     }
412*fe0f0bbbSJung-uk Kim 
413*fe0f0bbbSJung-uk Kim     strcpy (Dest, Source);
414*fe0f0bbbSJung-uk Kim     return (FALSE);
415*fe0f0bbbSJung-uk Kim }
416*fe0f0bbbSJung-uk Kim 
417*fe0f0bbbSJung-uk Kim BOOLEAN
418*fe0f0bbbSJung-uk Kim AcpiUtSafeStrcat (
419*fe0f0bbbSJung-uk Kim     char                    *Dest,
420*fe0f0bbbSJung-uk Kim     ACPI_SIZE               DestSize,
421*fe0f0bbbSJung-uk Kim     char                    *Source)
422*fe0f0bbbSJung-uk Kim {
423*fe0f0bbbSJung-uk Kim 
424*fe0f0bbbSJung-uk Kim     if ((strlen (Dest) + strlen (Source)) >= DestSize)
425*fe0f0bbbSJung-uk Kim     {
426*fe0f0bbbSJung-uk Kim         return (TRUE);
427*fe0f0bbbSJung-uk Kim     }
428*fe0f0bbbSJung-uk Kim 
429*fe0f0bbbSJung-uk Kim     strcat (Dest, Source);
430*fe0f0bbbSJung-uk Kim     return (FALSE);
431*fe0f0bbbSJung-uk Kim }
432*fe0f0bbbSJung-uk Kim 
433*fe0f0bbbSJung-uk Kim #ifndef _KERNEL
434*fe0f0bbbSJung-uk Kim BOOLEAN
435*fe0f0bbbSJung-uk Kim AcpiUtSafeStrncat (
436*fe0f0bbbSJung-uk Kim     char                    *Dest,
437*fe0f0bbbSJung-uk Kim     ACPI_SIZE               DestSize,
438*fe0f0bbbSJung-uk Kim     char                    *Source,
439*fe0f0bbbSJung-uk Kim     ACPI_SIZE               MaxTransferLength)
440*fe0f0bbbSJung-uk Kim {
441*fe0f0bbbSJung-uk Kim     ACPI_SIZE               ActualTransferLength;
442*fe0f0bbbSJung-uk Kim 
443*fe0f0bbbSJung-uk Kim 
444*fe0f0bbbSJung-uk Kim     ActualTransferLength = ACPI_MIN (MaxTransferLength, strlen (Source));
445*fe0f0bbbSJung-uk Kim 
446*fe0f0bbbSJung-uk Kim     if ((strlen (Dest) + ActualTransferLength) >= DestSize)
447*fe0f0bbbSJung-uk Kim     {
448*fe0f0bbbSJung-uk Kim         return (TRUE);
449*fe0f0bbbSJung-uk Kim     }
450*fe0f0bbbSJung-uk Kim 
451*fe0f0bbbSJung-uk Kim     strncat (Dest, Source, MaxTransferLength);
452*fe0f0bbbSJung-uk Kim     return (FALSE);
453*fe0f0bbbSJung-uk Kim }
454*fe0f0bbbSJung-uk Kim #endif
455*fe0f0bbbSJung-uk Kim #endif
456