1*385cc6b4SJerry Jelinek /******************************************************************************* 2*385cc6b4SJerry Jelinek * 3*385cc6b4SJerry Jelinek * Module Name: utnonansi - Non-ansi C library functions 4*385cc6b4SJerry Jelinek * 5*385cc6b4SJerry Jelinek ******************************************************************************/ 6*385cc6b4SJerry Jelinek 7*385cc6b4SJerry Jelinek /* 8*385cc6b4SJerry Jelinek * Copyright (C) 2000 - 2016, Intel Corp. 9*385cc6b4SJerry Jelinek * All rights reserved. 10*385cc6b4SJerry Jelinek * 11*385cc6b4SJerry Jelinek * Redistribution and use in source and binary forms, with or without 12*385cc6b4SJerry Jelinek * modification, are permitted provided that the following conditions 13*385cc6b4SJerry Jelinek * are met: 14*385cc6b4SJerry Jelinek * 1. Redistributions of source code must retain the above copyright 15*385cc6b4SJerry Jelinek * notice, this list of conditions, and the following disclaimer, 16*385cc6b4SJerry Jelinek * without modification. 17*385cc6b4SJerry Jelinek * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18*385cc6b4SJerry Jelinek * substantially similar to the "NO WARRANTY" disclaimer below 19*385cc6b4SJerry Jelinek * ("Disclaimer") and any redistribution must be conditioned upon 20*385cc6b4SJerry Jelinek * including a substantially similar Disclaimer requirement for further 21*385cc6b4SJerry Jelinek * binary redistribution. 22*385cc6b4SJerry Jelinek * 3. Neither the names of the above-listed copyright holders nor the names 23*385cc6b4SJerry Jelinek * of any contributors may be used to endorse or promote products derived 24*385cc6b4SJerry Jelinek * from this software without specific prior written permission. 25*385cc6b4SJerry Jelinek * 26*385cc6b4SJerry Jelinek * Alternatively, this software may be distributed under the terms of the 27*385cc6b4SJerry Jelinek * GNU General Public License ("GPL") version 2 as published by the Free 28*385cc6b4SJerry Jelinek * Software Foundation. 29*385cc6b4SJerry Jelinek * 30*385cc6b4SJerry Jelinek * NO WARRANTY 31*385cc6b4SJerry Jelinek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32*385cc6b4SJerry Jelinek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33*385cc6b4SJerry Jelinek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34*385cc6b4SJerry Jelinek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35*385cc6b4SJerry Jelinek * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36*385cc6b4SJerry Jelinek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37*385cc6b4SJerry Jelinek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38*385cc6b4SJerry Jelinek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39*385cc6b4SJerry Jelinek * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40*385cc6b4SJerry Jelinek * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41*385cc6b4SJerry Jelinek * POSSIBILITY OF SUCH DAMAGES. 42*385cc6b4SJerry Jelinek */ 43*385cc6b4SJerry Jelinek 44*385cc6b4SJerry Jelinek #include "acpi.h" 45*385cc6b4SJerry Jelinek #include "accommon.h" 46*385cc6b4SJerry Jelinek 47*385cc6b4SJerry Jelinek 48*385cc6b4SJerry Jelinek #define _COMPONENT ACPI_UTILITIES 49*385cc6b4SJerry Jelinek ACPI_MODULE_NAME ("utnonansi") 50*385cc6b4SJerry Jelinek 51*385cc6b4SJerry Jelinek 52*385cc6b4SJerry Jelinek /* 53*385cc6b4SJerry Jelinek * Non-ANSI C library functions - strlwr, strupr, stricmp, and a 64-bit 54*385cc6b4SJerry Jelinek * version of strtoul. 55*385cc6b4SJerry Jelinek */ 56*385cc6b4SJerry Jelinek 57*385cc6b4SJerry Jelinek /******************************************************************************* 58*385cc6b4SJerry Jelinek * 59*385cc6b4SJerry Jelinek * FUNCTION: AcpiUtStrlwr (strlwr) 60*385cc6b4SJerry Jelinek * 61*385cc6b4SJerry Jelinek * PARAMETERS: SrcString - The source string to convert 62*385cc6b4SJerry Jelinek * 63*385cc6b4SJerry Jelinek * RETURN: None 64*385cc6b4SJerry Jelinek * 65*385cc6b4SJerry Jelinek * DESCRIPTION: Convert a string to lowercase 66*385cc6b4SJerry Jelinek * 67*385cc6b4SJerry Jelinek ******************************************************************************/ 68*385cc6b4SJerry Jelinek 69*385cc6b4SJerry Jelinek void 70*385cc6b4SJerry Jelinek AcpiUtStrlwr ( 71*385cc6b4SJerry Jelinek char *SrcString) 72*385cc6b4SJerry Jelinek { 73*385cc6b4SJerry Jelinek char *String; 74*385cc6b4SJerry Jelinek 75*385cc6b4SJerry Jelinek 76*385cc6b4SJerry Jelinek ACPI_FUNCTION_ENTRY (); 77*385cc6b4SJerry Jelinek 78*385cc6b4SJerry Jelinek 79*385cc6b4SJerry Jelinek if (!SrcString) 80*385cc6b4SJerry Jelinek { 81*385cc6b4SJerry Jelinek return; 82*385cc6b4SJerry Jelinek } 83*385cc6b4SJerry Jelinek 84*385cc6b4SJerry Jelinek /* Walk entire string, lowercasing the letters */ 85*385cc6b4SJerry Jelinek 86*385cc6b4SJerry Jelinek for (String = SrcString; *String; String++) 87*385cc6b4SJerry Jelinek { 88*385cc6b4SJerry Jelinek *String = (char) tolower ((int) *String); 89*385cc6b4SJerry Jelinek } 90*385cc6b4SJerry Jelinek } 91*385cc6b4SJerry Jelinek 92*385cc6b4SJerry Jelinek 93*385cc6b4SJerry Jelinek /******************************************************************************* 94*385cc6b4SJerry Jelinek * 95*385cc6b4SJerry Jelinek * FUNCTION: AcpiUtStrupr (strupr) 96*385cc6b4SJerry Jelinek * 97*385cc6b4SJerry Jelinek * PARAMETERS: SrcString - The source string to convert 98*385cc6b4SJerry Jelinek * 99*385cc6b4SJerry Jelinek * RETURN: None 100*385cc6b4SJerry Jelinek * 101*385cc6b4SJerry Jelinek * DESCRIPTION: Convert a string to uppercase 102*385cc6b4SJerry Jelinek * 103*385cc6b4SJerry Jelinek ******************************************************************************/ 104*385cc6b4SJerry Jelinek 105*385cc6b4SJerry Jelinek void 106*385cc6b4SJerry Jelinek AcpiUtStrupr ( 107*385cc6b4SJerry Jelinek char *SrcString) 108*385cc6b4SJerry Jelinek { 109*385cc6b4SJerry Jelinek char *String; 110*385cc6b4SJerry Jelinek 111*385cc6b4SJerry Jelinek 112*385cc6b4SJerry Jelinek ACPI_FUNCTION_ENTRY (); 113*385cc6b4SJerry Jelinek 114*385cc6b4SJerry Jelinek 115*385cc6b4SJerry Jelinek if (!SrcString) 116*385cc6b4SJerry Jelinek { 117*385cc6b4SJerry Jelinek return; 118*385cc6b4SJerry Jelinek } 119*385cc6b4SJerry Jelinek 120*385cc6b4SJerry Jelinek /* Walk entire string, uppercasing the letters */ 121*385cc6b4SJerry Jelinek 122*385cc6b4SJerry Jelinek for (String = SrcString; *String; String++) 123*385cc6b4SJerry Jelinek { 124*385cc6b4SJerry Jelinek *String = (char) toupper ((int) *String); 125*385cc6b4SJerry Jelinek } 126*385cc6b4SJerry Jelinek } 127*385cc6b4SJerry Jelinek 128*385cc6b4SJerry Jelinek 129*385cc6b4SJerry Jelinek /****************************************************************************** 130*385cc6b4SJerry Jelinek * 131*385cc6b4SJerry Jelinek * FUNCTION: AcpiUtStricmp (stricmp) 132*385cc6b4SJerry Jelinek * 133*385cc6b4SJerry Jelinek * PARAMETERS: String1 - first string to compare 134*385cc6b4SJerry Jelinek * String2 - second string to compare 135*385cc6b4SJerry Jelinek * 136*385cc6b4SJerry Jelinek * RETURN: int that signifies string relationship. Zero means strings 137*385cc6b4SJerry Jelinek * are equal. 138*385cc6b4SJerry Jelinek * 139*385cc6b4SJerry Jelinek * DESCRIPTION: Case-insensitive string compare. Implementation of the 140*385cc6b4SJerry Jelinek * non-ANSI stricmp function. 141*385cc6b4SJerry Jelinek * 142*385cc6b4SJerry Jelinek ******************************************************************************/ 143*385cc6b4SJerry Jelinek 144*385cc6b4SJerry Jelinek int 145*385cc6b4SJerry Jelinek AcpiUtStricmp ( 146*385cc6b4SJerry Jelinek char *String1, 147*385cc6b4SJerry Jelinek char *String2) 148*385cc6b4SJerry Jelinek { 149*385cc6b4SJerry Jelinek int c1; 150*385cc6b4SJerry Jelinek int c2; 151*385cc6b4SJerry Jelinek 152*385cc6b4SJerry Jelinek 153*385cc6b4SJerry Jelinek do 154*385cc6b4SJerry Jelinek { 155*385cc6b4SJerry Jelinek c1 = tolower ((int) *String1); 156*385cc6b4SJerry Jelinek c2 = tolower ((int) *String2); 157*385cc6b4SJerry Jelinek 158*385cc6b4SJerry Jelinek String1++; 159*385cc6b4SJerry Jelinek String2++; 160*385cc6b4SJerry Jelinek } 161*385cc6b4SJerry Jelinek while ((c1 == c2) && (c1)); 162*385cc6b4SJerry Jelinek 163*385cc6b4SJerry Jelinek return (c1 - c2); 164*385cc6b4SJerry Jelinek } 165*385cc6b4SJerry Jelinek 166*385cc6b4SJerry Jelinek 167*385cc6b4SJerry Jelinek #if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) 168*385cc6b4SJerry Jelinek /******************************************************************************* 169*385cc6b4SJerry Jelinek * 170*385cc6b4SJerry Jelinek * FUNCTION: AcpiUtSafeStrcpy, AcpiUtSafeStrcat, AcpiUtSafeStrncat 171*385cc6b4SJerry Jelinek * 172*385cc6b4SJerry Jelinek * PARAMETERS: Adds a "DestSize" parameter to each of the standard string 173*385cc6b4SJerry Jelinek * functions. This is the size of the Destination buffer. 174*385cc6b4SJerry Jelinek * 175*385cc6b4SJerry Jelinek * RETURN: TRUE if the operation would overflow the destination buffer. 176*385cc6b4SJerry Jelinek * 177*385cc6b4SJerry Jelinek * DESCRIPTION: Safe versions of standard Clib string functions. Ensure that 178*385cc6b4SJerry Jelinek * the result of the operation will not overflow the output string 179*385cc6b4SJerry Jelinek * buffer. 180*385cc6b4SJerry Jelinek * 181*385cc6b4SJerry Jelinek * NOTE: These functions are typically only helpful for processing 182*385cc6b4SJerry Jelinek * user input and command lines. For most ACPICA code, the 183*385cc6b4SJerry Jelinek * required buffer length is precisely calculated before buffer 184*385cc6b4SJerry Jelinek * allocation, so the use of these functions is unnecessary. 185*385cc6b4SJerry Jelinek * 186*385cc6b4SJerry Jelinek ******************************************************************************/ 187*385cc6b4SJerry Jelinek 188*385cc6b4SJerry Jelinek BOOLEAN 189*385cc6b4SJerry Jelinek AcpiUtSafeStrcpy ( 190*385cc6b4SJerry Jelinek char *Dest, 191*385cc6b4SJerry Jelinek ACPI_SIZE DestSize, 192*385cc6b4SJerry Jelinek char *Source) 193*385cc6b4SJerry Jelinek { 194*385cc6b4SJerry Jelinek 195*385cc6b4SJerry Jelinek if (strlen (Source) >= DestSize) 196*385cc6b4SJerry Jelinek { 197*385cc6b4SJerry Jelinek return (TRUE); 198*385cc6b4SJerry Jelinek } 199*385cc6b4SJerry Jelinek 200*385cc6b4SJerry Jelinek strcpy (Dest, Source); 201*385cc6b4SJerry Jelinek return (FALSE); 202*385cc6b4SJerry Jelinek } 203*385cc6b4SJerry Jelinek 204*385cc6b4SJerry Jelinek BOOLEAN 205*385cc6b4SJerry Jelinek AcpiUtSafeStrcat ( 206*385cc6b4SJerry Jelinek char *Dest, 207*385cc6b4SJerry Jelinek ACPI_SIZE DestSize, 208*385cc6b4SJerry Jelinek char *Source) 209*385cc6b4SJerry Jelinek { 210*385cc6b4SJerry Jelinek 211*385cc6b4SJerry Jelinek if ((strlen (Dest) + strlen (Source)) >= DestSize) 212*385cc6b4SJerry Jelinek { 213*385cc6b4SJerry Jelinek return (TRUE); 214*385cc6b4SJerry Jelinek } 215*385cc6b4SJerry Jelinek 216*385cc6b4SJerry Jelinek strcat (Dest, Source); 217*385cc6b4SJerry Jelinek return (FALSE); 218*385cc6b4SJerry Jelinek } 219*385cc6b4SJerry Jelinek 220*385cc6b4SJerry Jelinek BOOLEAN 221*385cc6b4SJerry Jelinek AcpiUtSafeStrncat ( 222*385cc6b4SJerry Jelinek char *Dest, 223*385cc6b4SJerry Jelinek ACPI_SIZE DestSize, 224*385cc6b4SJerry Jelinek char *Source, 225*385cc6b4SJerry Jelinek ACPI_SIZE MaxTransferLength) 226*385cc6b4SJerry Jelinek { 227*385cc6b4SJerry Jelinek ACPI_SIZE ActualTransferLength; 228*385cc6b4SJerry Jelinek 229*385cc6b4SJerry Jelinek 230*385cc6b4SJerry Jelinek ActualTransferLength = ACPI_MIN (MaxTransferLength, strlen (Source)); 231*385cc6b4SJerry Jelinek 232*385cc6b4SJerry Jelinek if ((strlen (Dest) + ActualTransferLength) >= DestSize) 233*385cc6b4SJerry Jelinek { 234*385cc6b4SJerry Jelinek return (TRUE); 235*385cc6b4SJerry Jelinek } 236*385cc6b4SJerry Jelinek 237*385cc6b4SJerry Jelinek strncat (Dest, Source, MaxTransferLength); 238*385cc6b4SJerry Jelinek return (FALSE); 239*385cc6b4SJerry Jelinek } 240*385cc6b4SJerry Jelinek #endif 241*385cc6b4SJerry Jelinek 242*385cc6b4SJerry Jelinek 243*385cc6b4SJerry Jelinek /******************************************************************************* 244*385cc6b4SJerry Jelinek * 245*385cc6b4SJerry Jelinek * FUNCTION: AcpiUtStrtoul64 246*385cc6b4SJerry Jelinek * 247*385cc6b4SJerry Jelinek * PARAMETERS: String - Null terminated string 248*385cc6b4SJerry Jelinek * Base - Radix of the string: 16 or 10 or 249*385cc6b4SJerry Jelinek * ACPI_ANY_BASE 250*385cc6b4SJerry Jelinek * MaxIntegerByteWidth - Maximum allowable integer,in bytes: 251*385cc6b4SJerry Jelinek * 4 or 8 (32 or 64 bits) 252*385cc6b4SJerry Jelinek * RetInteger - Where the converted integer is 253*385cc6b4SJerry Jelinek * returned 254*385cc6b4SJerry Jelinek * 255*385cc6b4SJerry Jelinek * RETURN: Status and Converted value 256*385cc6b4SJerry Jelinek * 257*385cc6b4SJerry Jelinek * DESCRIPTION: Convert a string into an unsigned value. Performs either a 258*385cc6b4SJerry Jelinek * 32-bit or 64-bit conversion, depending on the input integer 259*385cc6b4SJerry Jelinek * size (often the current mode of the interpreter). 260*385cc6b4SJerry Jelinek * 261*385cc6b4SJerry Jelinek * NOTES: Negative numbers are not supported, as they are not supported 262*385cc6b4SJerry Jelinek * by ACPI. 263*385cc6b4SJerry Jelinek * 264*385cc6b4SJerry Jelinek * AcpiGbl_IntegerByteWidth should be set to the proper width. 265*385cc6b4SJerry Jelinek * For the core ACPICA code, this width depends on the DSDT 266*385cc6b4SJerry Jelinek * version. For iASL, the default byte width is always 8 for the 267*385cc6b4SJerry Jelinek * parser, but error checking is performed later to flag cases 268*385cc6b4SJerry Jelinek * where a 64-bit constant is defined in a 32-bit DSDT/SSDT. 269*385cc6b4SJerry Jelinek * 270*385cc6b4SJerry Jelinek * Does not support Octal strings, not needed at this time. 271*385cc6b4SJerry Jelinek * 272*385cc6b4SJerry Jelinek ******************************************************************************/ 273*385cc6b4SJerry Jelinek 274*385cc6b4SJerry Jelinek ACPI_STATUS 275*385cc6b4SJerry Jelinek AcpiUtStrtoul64 ( 276*385cc6b4SJerry Jelinek char *String, 277*385cc6b4SJerry Jelinek UINT32 Base, 278*385cc6b4SJerry Jelinek UINT32 MaxIntegerByteWidth, 279*385cc6b4SJerry Jelinek UINT64 *RetInteger) 280*385cc6b4SJerry Jelinek { 281*385cc6b4SJerry Jelinek UINT32 ThisDigit = 0; 282*385cc6b4SJerry Jelinek UINT64 ReturnValue = 0; 283*385cc6b4SJerry Jelinek UINT64 Quotient; 284*385cc6b4SJerry Jelinek UINT64 Dividend; 285*385cc6b4SJerry Jelinek UINT8 ValidDigits = 0; 286*385cc6b4SJerry Jelinek UINT8 SignOf0x = 0; 287*385cc6b4SJerry Jelinek UINT8 Term = 0; 288*385cc6b4SJerry Jelinek 289*385cc6b4SJerry Jelinek 290*385cc6b4SJerry Jelinek ACPI_FUNCTION_TRACE_STR (UtStrtoul64, String); 291*385cc6b4SJerry Jelinek 292*385cc6b4SJerry Jelinek 293*385cc6b4SJerry Jelinek switch (Base) 294*385cc6b4SJerry Jelinek { 295*385cc6b4SJerry Jelinek case ACPI_ANY_BASE: 296*385cc6b4SJerry Jelinek case 10: 297*385cc6b4SJerry Jelinek case 16: 298*385cc6b4SJerry Jelinek 299*385cc6b4SJerry Jelinek break; 300*385cc6b4SJerry Jelinek 301*385cc6b4SJerry Jelinek default: 302*385cc6b4SJerry Jelinek 303*385cc6b4SJerry Jelinek /* Invalid Base */ 304*385cc6b4SJerry Jelinek 305*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_BAD_PARAMETER); 306*385cc6b4SJerry Jelinek } 307*385cc6b4SJerry Jelinek 308*385cc6b4SJerry Jelinek if (!String) 309*385cc6b4SJerry Jelinek { 310*385cc6b4SJerry Jelinek goto ErrorExit; 311*385cc6b4SJerry Jelinek } 312*385cc6b4SJerry Jelinek 313*385cc6b4SJerry Jelinek /* Skip over any white space in the buffer */ 314*385cc6b4SJerry Jelinek 315*385cc6b4SJerry Jelinek while ((*String) && (isspace ((int) *String) || *String == '\t')) 316*385cc6b4SJerry Jelinek { 317*385cc6b4SJerry Jelinek String++; 318*385cc6b4SJerry Jelinek } 319*385cc6b4SJerry Jelinek 320*385cc6b4SJerry Jelinek if (Base == ACPI_ANY_BASE) 321*385cc6b4SJerry Jelinek { 322*385cc6b4SJerry Jelinek /* 323*385cc6b4SJerry Jelinek * Base equal to ACPI_ANY_BASE means 'Either decimal or hex'. 324*385cc6b4SJerry Jelinek * We need to determine if it is decimal or hexadecimal. 325*385cc6b4SJerry Jelinek */ 326*385cc6b4SJerry Jelinek if ((*String == '0') && (tolower ((int) *(String + 1)) == 'x')) 327*385cc6b4SJerry Jelinek { 328*385cc6b4SJerry Jelinek SignOf0x = 1; 329*385cc6b4SJerry Jelinek Base = 16; 330*385cc6b4SJerry Jelinek 331*385cc6b4SJerry Jelinek /* Skip over the leading '0x' */ 332*385cc6b4SJerry Jelinek String += 2; 333*385cc6b4SJerry Jelinek } 334*385cc6b4SJerry Jelinek else 335*385cc6b4SJerry Jelinek { 336*385cc6b4SJerry Jelinek Base = 10; 337*385cc6b4SJerry Jelinek } 338*385cc6b4SJerry Jelinek } 339*385cc6b4SJerry Jelinek 340*385cc6b4SJerry Jelinek /* Any string left? Check that '0x' is not followed by white space. */ 341*385cc6b4SJerry Jelinek 342*385cc6b4SJerry Jelinek if (!(*String) || isspace ((int) *String) || *String == '\t') 343*385cc6b4SJerry Jelinek { 344*385cc6b4SJerry Jelinek if (Base == ACPI_ANY_BASE) 345*385cc6b4SJerry Jelinek { 346*385cc6b4SJerry Jelinek goto ErrorExit; 347*385cc6b4SJerry Jelinek } 348*385cc6b4SJerry Jelinek else 349*385cc6b4SJerry Jelinek { 350*385cc6b4SJerry Jelinek goto AllDone; 351*385cc6b4SJerry Jelinek } 352*385cc6b4SJerry Jelinek } 353*385cc6b4SJerry Jelinek 354*385cc6b4SJerry Jelinek /* 355*385cc6b4SJerry Jelinek * Perform a 32-bit or 64-bit conversion, depending upon the input 356*385cc6b4SJerry Jelinek * byte width 357*385cc6b4SJerry Jelinek */ 358*385cc6b4SJerry Jelinek Dividend = (MaxIntegerByteWidth <= ACPI_MAX32_BYTE_WIDTH) ? 359*385cc6b4SJerry Jelinek ACPI_UINT32_MAX : ACPI_UINT64_MAX; 360*385cc6b4SJerry Jelinek 361*385cc6b4SJerry Jelinek /* Main loop: convert the string to a 32- or 64-bit integer */ 362*385cc6b4SJerry Jelinek 363*385cc6b4SJerry Jelinek while (*String) 364*385cc6b4SJerry Jelinek { 365*385cc6b4SJerry Jelinek if (isdigit ((int) *String)) 366*385cc6b4SJerry Jelinek { 367*385cc6b4SJerry Jelinek /* Convert ASCII 0-9 to Decimal value */ 368*385cc6b4SJerry Jelinek 369*385cc6b4SJerry Jelinek ThisDigit = ((UINT8) *String) - '0'; 370*385cc6b4SJerry Jelinek } 371*385cc6b4SJerry Jelinek else if (Base == 10) 372*385cc6b4SJerry Jelinek { 373*385cc6b4SJerry Jelinek /* Digit is out of range; possible in ToInteger case only */ 374*385cc6b4SJerry Jelinek 375*385cc6b4SJerry Jelinek Term = 1; 376*385cc6b4SJerry Jelinek } 377*385cc6b4SJerry Jelinek else 378*385cc6b4SJerry Jelinek { 379*385cc6b4SJerry Jelinek ThisDigit = (UINT8) toupper ((int) *String); 380*385cc6b4SJerry Jelinek if (isxdigit ((int) ThisDigit)) 381*385cc6b4SJerry Jelinek { 382*385cc6b4SJerry Jelinek /* Convert ASCII Hex char to value */ 383*385cc6b4SJerry Jelinek 384*385cc6b4SJerry Jelinek ThisDigit = ThisDigit - 'A' + 10; 385*385cc6b4SJerry Jelinek } 386*385cc6b4SJerry Jelinek else 387*385cc6b4SJerry Jelinek { 388*385cc6b4SJerry Jelinek Term = 1; 389*385cc6b4SJerry Jelinek } 390*385cc6b4SJerry Jelinek } 391*385cc6b4SJerry Jelinek 392*385cc6b4SJerry Jelinek if (Term) 393*385cc6b4SJerry Jelinek { 394*385cc6b4SJerry Jelinek if (Base == ACPI_ANY_BASE) 395*385cc6b4SJerry Jelinek { 396*385cc6b4SJerry Jelinek goto ErrorExit; 397*385cc6b4SJerry Jelinek } 398*385cc6b4SJerry Jelinek else 399*385cc6b4SJerry Jelinek { 400*385cc6b4SJerry Jelinek break; 401*385cc6b4SJerry Jelinek } 402*385cc6b4SJerry Jelinek } 403*385cc6b4SJerry Jelinek else if ((ValidDigits == 0) && (ThisDigit == 0) && !SignOf0x) 404*385cc6b4SJerry Jelinek { 405*385cc6b4SJerry Jelinek /* Skip zeros */ 406*385cc6b4SJerry Jelinek String++; 407*385cc6b4SJerry Jelinek continue; 408*385cc6b4SJerry Jelinek } 409*385cc6b4SJerry Jelinek 410*385cc6b4SJerry Jelinek ValidDigits++; 411*385cc6b4SJerry Jelinek 412*385cc6b4SJerry Jelinek if (SignOf0x && ((ValidDigits > 16) || 413*385cc6b4SJerry Jelinek ((ValidDigits > 8) && (MaxIntegerByteWidth <= ACPI_MAX32_BYTE_WIDTH)))) 414*385cc6b4SJerry Jelinek { 415*385cc6b4SJerry Jelinek /* 416*385cc6b4SJerry Jelinek * This is ToInteger operation case. 417*385cc6b4SJerry Jelinek * No restrictions for string-to-integer conversion, 418*385cc6b4SJerry Jelinek * see ACPI spec. 419*385cc6b4SJerry Jelinek */ 420*385cc6b4SJerry Jelinek goto ErrorExit; 421*385cc6b4SJerry Jelinek } 422*385cc6b4SJerry Jelinek 423*385cc6b4SJerry Jelinek /* Divide the digit into the correct position */ 424*385cc6b4SJerry Jelinek 425*385cc6b4SJerry Jelinek (void) AcpiUtShortDivide ( 426*385cc6b4SJerry Jelinek (Dividend - (UINT64) ThisDigit), Base, &Quotient, NULL); 427*385cc6b4SJerry Jelinek 428*385cc6b4SJerry Jelinek if (ReturnValue > Quotient) 429*385cc6b4SJerry Jelinek { 430*385cc6b4SJerry Jelinek if (Base == ACPI_ANY_BASE) 431*385cc6b4SJerry Jelinek { 432*385cc6b4SJerry Jelinek goto ErrorExit; 433*385cc6b4SJerry Jelinek } 434*385cc6b4SJerry Jelinek else 435*385cc6b4SJerry Jelinek { 436*385cc6b4SJerry Jelinek break; 437*385cc6b4SJerry Jelinek } 438*385cc6b4SJerry Jelinek } 439*385cc6b4SJerry Jelinek 440*385cc6b4SJerry Jelinek ReturnValue *= Base; 441*385cc6b4SJerry Jelinek ReturnValue += ThisDigit; 442*385cc6b4SJerry Jelinek String++; 443*385cc6b4SJerry Jelinek } 444*385cc6b4SJerry Jelinek 445*385cc6b4SJerry Jelinek /* All done, normal exit */ 446*385cc6b4SJerry Jelinek 447*385cc6b4SJerry Jelinek AllDone: 448*385cc6b4SJerry Jelinek 449*385cc6b4SJerry Jelinek ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n", 450*385cc6b4SJerry Jelinek ACPI_FORMAT_UINT64 (ReturnValue))); 451*385cc6b4SJerry Jelinek 452*385cc6b4SJerry Jelinek *RetInteger = ReturnValue; 453*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_OK); 454*385cc6b4SJerry Jelinek 455*385cc6b4SJerry Jelinek 456*385cc6b4SJerry Jelinek ErrorExit: 457*385cc6b4SJerry Jelinek 458*385cc6b4SJerry Jelinek /* Base was set/validated above (10 or 16) */ 459*385cc6b4SJerry Jelinek 460*385cc6b4SJerry Jelinek if (Base == 10) 461*385cc6b4SJerry Jelinek { 462*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT); 463*385cc6b4SJerry Jelinek } 464*385cc6b4SJerry Jelinek else 465*385cc6b4SJerry Jelinek { 466*385cc6b4SJerry Jelinek return_ACPI_STATUS (AE_BAD_HEX_CONSTANT); 467*385cc6b4SJerry Jelinek } 468*385cc6b4SJerry Jelinek } 469*385cc6b4SJerry Jelinek 470*385cc6b4SJerry Jelinek 471*385cc6b4SJerry Jelinek #ifdef _OBSOLETE_FUNCTIONS 472*385cc6b4SJerry Jelinek /* Removed: 01/2016 */ 473*385cc6b4SJerry Jelinek 474*385cc6b4SJerry Jelinek /******************************************************************************* 475*385cc6b4SJerry Jelinek * 476*385cc6b4SJerry Jelinek * FUNCTION: strtoul64 477*385cc6b4SJerry Jelinek * 478*385cc6b4SJerry Jelinek * PARAMETERS: String - Null terminated string 479*385cc6b4SJerry Jelinek * Terminater - Where a pointer to the terminating byte 480*385cc6b4SJerry Jelinek * is returned 481*385cc6b4SJerry Jelinek * Base - Radix of the string 482*385cc6b4SJerry Jelinek * 483*385cc6b4SJerry Jelinek * RETURN: Converted value 484*385cc6b4SJerry Jelinek * 485*385cc6b4SJerry Jelinek * DESCRIPTION: Convert a string into an unsigned value. 486*385cc6b4SJerry Jelinek * 487*385cc6b4SJerry Jelinek ******************************************************************************/ 488*385cc6b4SJerry Jelinek 489*385cc6b4SJerry Jelinek ACPI_STATUS 490*385cc6b4SJerry Jelinek strtoul64 ( 491*385cc6b4SJerry Jelinek char *String, 492*385cc6b4SJerry Jelinek UINT32 Base, 493*385cc6b4SJerry Jelinek UINT64 *RetInteger) 494*385cc6b4SJerry Jelinek { 495*385cc6b4SJerry Jelinek UINT32 Index; 496*385cc6b4SJerry Jelinek UINT32 Sign; 497*385cc6b4SJerry Jelinek UINT64 ReturnValue = 0; 498*385cc6b4SJerry Jelinek ACPI_STATUS Status = AE_OK; 499*385cc6b4SJerry Jelinek 500*385cc6b4SJerry Jelinek 501*385cc6b4SJerry Jelinek *RetInteger = 0; 502*385cc6b4SJerry Jelinek 503*385cc6b4SJerry Jelinek switch (Base) 504*385cc6b4SJerry Jelinek { 505*385cc6b4SJerry Jelinek case 0: 506*385cc6b4SJerry Jelinek case 8: 507*385cc6b4SJerry Jelinek case 10: 508*385cc6b4SJerry Jelinek case 16: 509*385cc6b4SJerry Jelinek 510*385cc6b4SJerry Jelinek break; 511*385cc6b4SJerry Jelinek 512*385cc6b4SJerry Jelinek default: 513*385cc6b4SJerry Jelinek /* 514*385cc6b4SJerry Jelinek * The specified Base parameter is not in the domain of 515*385cc6b4SJerry Jelinek * this function: 516*385cc6b4SJerry Jelinek */ 517*385cc6b4SJerry Jelinek return (AE_BAD_PARAMETER); 518*385cc6b4SJerry Jelinek } 519*385cc6b4SJerry Jelinek 520*385cc6b4SJerry Jelinek /* Skip over any white space in the buffer: */ 521*385cc6b4SJerry Jelinek 522*385cc6b4SJerry Jelinek while (isspace ((int) *String) || *String == '\t') 523*385cc6b4SJerry Jelinek { 524*385cc6b4SJerry Jelinek ++String; 525*385cc6b4SJerry Jelinek } 526*385cc6b4SJerry Jelinek 527*385cc6b4SJerry Jelinek /* 528*385cc6b4SJerry Jelinek * The buffer may contain an optional plus or minus sign. 529*385cc6b4SJerry Jelinek * If it does, then skip over it but remember what is was: 530*385cc6b4SJerry Jelinek */ 531*385cc6b4SJerry Jelinek if (*String == '-') 532*385cc6b4SJerry Jelinek { 533*385cc6b4SJerry Jelinek Sign = ACPI_SIGN_NEGATIVE; 534*385cc6b4SJerry Jelinek ++String; 535*385cc6b4SJerry Jelinek } 536*385cc6b4SJerry Jelinek else if (*String == '+') 537*385cc6b4SJerry Jelinek { 538*385cc6b4SJerry Jelinek ++String; 539*385cc6b4SJerry Jelinek Sign = ACPI_SIGN_POSITIVE; 540*385cc6b4SJerry Jelinek } 541*385cc6b4SJerry Jelinek else 542*385cc6b4SJerry Jelinek { 543*385cc6b4SJerry Jelinek Sign = ACPI_SIGN_POSITIVE; 544*385cc6b4SJerry Jelinek } 545*385cc6b4SJerry Jelinek 546*385cc6b4SJerry Jelinek /* 547*385cc6b4SJerry Jelinek * If the input parameter Base is zero, then we need to 548*385cc6b4SJerry Jelinek * determine if it is octal, decimal, or hexadecimal: 549*385cc6b4SJerry Jelinek */ 550*385cc6b4SJerry Jelinek if (Base == 0) 551*385cc6b4SJerry Jelinek { 552*385cc6b4SJerry Jelinek if (*String == '0') 553*385cc6b4SJerry Jelinek { 554*385cc6b4SJerry Jelinek if (tolower ((int) *(++String)) == 'x') 555*385cc6b4SJerry Jelinek { 556*385cc6b4SJerry Jelinek Base = 16; 557*385cc6b4SJerry Jelinek ++String; 558*385cc6b4SJerry Jelinek } 559*385cc6b4SJerry Jelinek else 560*385cc6b4SJerry Jelinek { 561*385cc6b4SJerry Jelinek Base = 8; 562*385cc6b4SJerry Jelinek } 563*385cc6b4SJerry Jelinek } 564*385cc6b4SJerry Jelinek else 565*385cc6b4SJerry Jelinek { 566*385cc6b4SJerry Jelinek Base = 10; 567*385cc6b4SJerry Jelinek } 568*385cc6b4SJerry Jelinek } 569*385cc6b4SJerry Jelinek 570*385cc6b4SJerry Jelinek /* 571*385cc6b4SJerry Jelinek * For octal and hexadecimal bases, skip over the leading 572*385cc6b4SJerry Jelinek * 0 or 0x, if they are present. 573*385cc6b4SJerry Jelinek */ 574*385cc6b4SJerry Jelinek if (Base == 8 && *String == '0') 575*385cc6b4SJerry Jelinek { 576*385cc6b4SJerry Jelinek String++; 577*385cc6b4SJerry Jelinek } 578*385cc6b4SJerry Jelinek 579*385cc6b4SJerry Jelinek if (Base == 16 && 580*385cc6b4SJerry Jelinek *String == '0' && 581*385cc6b4SJerry Jelinek tolower ((int) *(++String)) == 'x') 582*385cc6b4SJerry Jelinek { 583*385cc6b4SJerry Jelinek String++; 584*385cc6b4SJerry Jelinek } 585*385cc6b4SJerry Jelinek 586*385cc6b4SJerry Jelinek /* Main loop: convert the string to an unsigned long */ 587*385cc6b4SJerry Jelinek 588*385cc6b4SJerry Jelinek while (*String) 589*385cc6b4SJerry Jelinek { 590*385cc6b4SJerry Jelinek if (isdigit ((int) *String)) 591*385cc6b4SJerry Jelinek { 592*385cc6b4SJerry Jelinek Index = ((UINT8) *String) - '0'; 593*385cc6b4SJerry Jelinek } 594*385cc6b4SJerry Jelinek else 595*385cc6b4SJerry Jelinek { 596*385cc6b4SJerry Jelinek Index = (UINT8) toupper ((int) *String); 597*385cc6b4SJerry Jelinek if (isupper ((int) Index)) 598*385cc6b4SJerry Jelinek { 599*385cc6b4SJerry Jelinek Index = Index - 'A' + 10; 600*385cc6b4SJerry Jelinek } 601*385cc6b4SJerry Jelinek else 602*385cc6b4SJerry Jelinek { 603*385cc6b4SJerry Jelinek goto ErrorExit; 604*385cc6b4SJerry Jelinek } 605*385cc6b4SJerry Jelinek } 606*385cc6b4SJerry Jelinek 607*385cc6b4SJerry Jelinek if (Index >= Base) 608*385cc6b4SJerry Jelinek { 609*385cc6b4SJerry Jelinek goto ErrorExit; 610*385cc6b4SJerry Jelinek } 611*385cc6b4SJerry Jelinek 612*385cc6b4SJerry Jelinek /* Check to see if value is out of range: */ 613*385cc6b4SJerry Jelinek 614*385cc6b4SJerry Jelinek if (ReturnValue > ((ACPI_UINT64_MAX - (UINT64) Index) / 615*385cc6b4SJerry Jelinek (UINT64) Base)) 616*385cc6b4SJerry Jelinek { 617*385cc6b4SJerry Jelinek goto ErrorExit; 618*385cc6b4SJerry Jelinek } 619*385cc6b4SJerry Jelinek else 620*385cc6b4SJerry Jelinek { 621*385cc6b4SJerry Jelinek ReturnValue *= Base; 622*385cc6b4SJerry Jelinek ReturnValue += Index; 623*385cc6b4SJerry Jelinek } 624*385cc6b4SJerry Jelinek 625*385cc6b4SJerry Jelinek ++String; 626*385cc6b4SJerry Jelinek } 627*385cc6b4SJerry Jelinek 628*385cc6b4SJerry Jelinek 629*385cc6b4SJerry Jelinek /* If a minus sign was present, then "the conversion is negated": */ 630*385cc6b4SJerry Jelinek 631*385cc6b4SJerry Jelinek if (Sign == ACPI_SIGN_NEGATIVE) 632*385cc6b4SJerry Jelinek { 633*385cc6b4SJerry Jelinek ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1; 634*385cc6b4SJerry Jelinek } 635*385cc6b4SJerry Jelinek 636*385cc6b4SJerry Jelinek *RetInteger = ReturnValue; 637*385cc6b4SJerry Jelinek return (Status); 638*385cc6b4SJerry Jelinek 639*385cc6b4SJerry Jelinek 640*385cc6b4SJerry Jelinek ErrorExit: 641*385cc6b4SJerry Jelinek switch (Base) 642*385cc6b4SJerry Jelinek { 643*385cc6b4SJerry Jelinek case 8: 644*385cc6b4SJerry Jelinek 645*385cc6b4SJerry Jelinek Status = AE_BAD_OCTAL_CONSTANT; 646*385cc6b4SJerry Jelinek break; 647*385cc6b4SJerry Jelinek 648*385cc6b4SJerry Jelinek case 10: 649*385cc6b4SJerry Jelinek 650*385cc6b4SJerry Jelinek Status = AE_BAD_DECIMAL_CONSTANT; 651*385cc6b4SJerry Jelinek break; 652*385cc6b4SJerry Jelinek 653*385cc6b4SJerry Jelinek case 16: 654*385cc6b4SJerry Jelinek 655*385cc6b4SJerry Jelinek Status = AE_BAD_HEX_CONSTANT; 656*385cc6b4SJerry Jelinek break; 657*385cc6b4SJerry Jelinek 658*385cc6b4SJerry Jelinek default: 659*385cc6b4SJerry Jelinek 660*385cc6b4SJerry Jelinek /* Base validated above */ 661*385cc6b4SJerry Jelinek 662*385cc6b4SJerry Jelinek break; 663*385cc6b4SJerry Jelinek } 664*385cc6b4SJerry Jelinek 665*385cc6b4SJerry Jelinek return (Status); 666*385cc6b4SJerry Jelinek } 667*385cc6b4SJerry Jelinek #endif 668