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