1*2f6a1a81SJung-uk Kim /******************************************************************************* 2*2f6a1a81SJung-uk Kim * 3*2f6a1a81SJung-uk Kim * Module Name: utstrsuppt - Support functions for string-to-integer conversion 4*2f6a1a81SJung-uk Kim * 5*2f6a1a81SJung-uk Kim ******************************************************************************/ 6*2f6a1a81SJung-uk Kim 7*2f6a1a81SJung-uk Kim /****************************************************************************** 8*2f6a1a81SJung-uk Kim * 9*2f6a1a81SJung-uk Kim * 1. Copyright Notice 10*2f6a1a81SJung-uk Kim * 11*2f6a1a81SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp. 12*2f6a1a81SJung-uk Kim * All rights reserved. 13*2f6a1a81SJung-uk Kim * 14*2f6a1a81SJung-uk Kim * 2. License 15*2f6a1a81SJung-uk Kim * 16*2f6a1a81SJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 17*2f6a1a81SJung-uk Kim * rights. You may have additional license terms from the party that provided 18*2f6a1a81SJung-uk Kim * you this software, covering your right to use that party's intellectual 19*2f6a1a81SJung-uk Kim * property rights. 20*2f6a1a81SJung-uk Kim * 21*2f6a1a81SJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22*2f6a1a81SJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 23*2f6a1a81SJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24*2f6a1a81SJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 25*2f6a1a81SJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 26*2f6a1a81SJung-uk Kim * Code in any form, with the right to sublicense such rights; and 27*2f6a1a81SJung-uk Kim * 28*2f6a1a81SJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29*2f6a1a81SJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 30*2f6a1a81SJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 31*2f6a1a81SJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 32*2f6a1a81SJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 33*2f6a1a81SJung-uk Kim * license, and in no event shall the patent license extend to any additions 34*2f6a1a81SJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 35*2f6a1a81SJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 36*2f6a1a81SJung-uk Kim * 37*2f6a1a81SJung-uk Kim * The above copyright and patent license is granted only if the following 38*2f6a1a81SJung-uk Kim * conditions are met: 39*2f6a1a81SJung-uk Kim * 40*2f6a1a81SJung-uk Kim * 3. Conditions 41*2f6a1a81SJung-uk Kim * 42*2f6a1a81SJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43*2f6a1a81SJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 44*2f6a1a81SJung-uk Kim * Code or modification with rights to further distribute source must include 45*2f6a1a81SJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 46*2f6a1a81SJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 47*2f6a1a81SJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 48*2f6a1a81SJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 49*2f6a1a81SJung-uk Kim * Code and the date of any change. Licensee must include in that file the 50*2f6a1a81SJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 51*2f6a1a81SJung-uk Kim * must include a prominent statement that the modification is derived, 52*2f6a1a81SJung-uk Kim * directly or indirectly, from Original Intel Code. 53*2f6a1a81SJung-uk Kim * 54*2f6a1a81SJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55*2f6a1a81SJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 56*2f6a1a81SJung-uk Kim * Code or modification without rights to further distribute source must 57*2f6a1a81SJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 58*2f6a1a81SJung-uk Kim * documentation and/or other materials provided with distribution. In 59*2f6a1a81SJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 60*2f6a1a81SJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 61*2f6a1a81SJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 62*2f6a1a81SJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 63*2f6a1a81SJung-uk Kim * not to intellectual property embodied in modifications its licensee may 64*2f6a1a81SJung-uk Kim * make. 65*2f6a1a81SJung-uk Kim * 66*2f6a1a81SJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 67*2f6a1a81SJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 68*2f6a1a81SJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 69*2f6a1a81SJung-uk Kim * provision in the documentation and/or other materials provided with the 70*2f6a1a81SJung-uk Kim * distribution. 71*2f6a1a81SJung-uk Kim * 72*2f6a1a81SJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 73*2f6a1a81SJung-uk Kim * Intel Code. 74*2f6a1a81SJung-uk Kim * 75*2f6a1a81SJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76*2f6a1a81SJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 77*2f6a1a81SJung-uk Kim * other dealings in products derived from or relating to the Covered Code 78*2f6a1a81SJung-uk Kim * without prior written authorization from Intel. 79*2f6a1a81SJung-uk Kim * 80*2f6a1a81SJung-uk Kim * 4. Disclaimer and Export Compliance 81*2f6a1a81SJung-uk Kim * 82*2f6a1a81SJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83*2f6a1a81SJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84*2f6a1a81SJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85*2f6a1a81SJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86*2f6a1a81SJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87*2f6a1a81SJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88*2f6a1a81SJung-uk Kim * PARTICULAR PURPOSE. 89*2f6a1a81SJung-uk Kim * 90*2f6a1a81SJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91*2f6a1a81SJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92*2f6a1a81SJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93*2f6a1a81SJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94*2f6a1a81SJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95*2f6a1a81SJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96*2f6a1a81SJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97*2f6a1a81SJung-uk Kim * LIMITED REMEDY. 98*2f6a1a81SJung-uk Kim * 99*2f6a1a81SJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 100*2f6a1a81SJung-uk Kim * software or system incorporating such software without first obtaining any 101*2f6a1a81SJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 102*2f6a1a81SJung-uk Kim * any other agency or department of the United States Government. In the 103*2f6a1a81SJung-uk Kim * event Licensee exports any such software from the United States or 104*2f6a1a81SJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 105*2f6a1a81SJung-uk Kim * ensure that the distribution and export/re-export of the software is in 106*2f6a1a81SJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 107*2f6a1a81SJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108*2f6a1a81SJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 109*2f6a1a81SJung-uk Kim * software, or service, directly or indirectly, to any country for which the 110*2f6a1a81SJung-uk Kim * United States government or any agency thereof requires an export license, 111*2f6a1a81SJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 112*2f6a1a81SJung-uk Kim * such license, approval or letter. 113*2f6a1a81SJung-uk Kim * 114*2f6a1a81SJung-uk Kim ***************************************************************************** 115*2f6a1a81SJung-uk Kim * 116*2f6a1a81SJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 117*2f6a1a81SJung-uk Kim * following license: 118*2f6a1a81SJung-uk Kim * 119*2f6a1a81SJung-uk Kim * Redistribution and use in source and binary forms, with or without 120*2f6a1a81SJung-uk Kim * modification, are permitted provided that the following conditions 121*2f6a1a81SJung-uk Kim * are met: 122*2f6a1a81SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 123*2f6a1a81SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 124*2f6a1a81SJung-uk Kim * without modification. 125*2f6a1a81SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126*2f6a1a81SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 127*2f6a1a81SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 128*2f6a1a81SJung-uk Kim * including a substantially similar Disclaimer requirement for further 129*2f6a1a81SJung-uk Kim * binary redistribution. 130*2f6a1a81SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 131*2f6a1a81SJung-uk Kim * of any contributors may be used to endorse or promote products derived 132*2f6a1a81SJung-uk Kim * from this software without specific prior written permission. 133*2f6a1a81SJung-uk Kim * 134*2f6a1a81SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135*2f6a1a81SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136*2f6a1a81SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137*2f6a1a81SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138*2f6a1a81SJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139*2f6a1a81SJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140*2f6a1a81SJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141*2f6a1a81SJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142*2f6a1a81SJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143*2f6a1a81SJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144*2f6a1a81SJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145*2f6a1a81SJung-uk Kim * 146*2f6a1a81SJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 147*2f6a1a81SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 148*2f6a1a81SJung-uk Kim * Software Foundation. 149*2f6a1a81SJung-uk Kim * 150*2f6a1a81SJung-uk Kim *****************************************************************************/ 151*2f6a1a81SJung-uk Kim 152*2f6a1a81SJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 153*2f6a1a81SJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 154*2f6a1a81SJung-uk Kim 155*2f6a1a81SJung-uk Kim #define _COMPONENT ACPI_UTILITIES 156*2f6a1a81SJung-uk Kim ACPI_MODULE_NAME ("utstrsuppt") 157*2f6a1a81SJung-uk Kim 158*2f6a1a81SJung-uk Kim 159*2f6a1a81SJung-uk Kim /* Local prototypes */ 160*2f6a1a81SJung-uk Kim 161*2f6a1a81SJung-uk Kim static ACPI_STATUS 162*2f6a1a81SJung-uk Kim AcpiUtInsertDigit ( 163*2f6a1a81SJung-uk Kim UINT64 *AccumulatedValue, 164*2f6a1a81SJung-uk Kim UINT32 Base, 165*2f6a1a81SJung-uk Kim int AsciiDigit); 166*2f6a1a81SJung-uk Kim 167*2f6a1a81SJung-uk Kim static ACPI_STATUS 168*2f6a1a81SJung-uk Kim AcpiUtStrtoulMultiply64 ( 169*2f6a1a81SJung-uk Kim UINT64 Multiplicand, 170*2f6a1a81SJung-uk Kim UINT64 Multiplier, 171*2f6a1a81SJung-uk Kim UINT64 *OutProduct); 172*2f6a1a81SJung-uk Kim 173*2f6a1a81SJung-uk Kim static ACPI_STATUS 174*2f6a1a81SJung-uk Kim AcpiUtStrtoulAdd64 ( 175*2f6a1a81SJung-uk Kim UINT64 Addend1, 176*2f6a1a81SJung-uk Kim UINT64 Addend2, 177*2f6a1a81SJung-uk Kim UINT64 *OutSum); 178*2f6a1a81SJung-uk Kim 179*2f6a1a81SJung-uk Kim 180*2f6a1a81SJung-uk Kim /******************************************************************************* 181*2f6a1a81SJung-uk Kim * 182*2f6a1a81SJung-uk Kim * FUNCTION: AcpiUtConvertOctalString 183*2f6a1a81SJung-uk Kim * 184*2f6a1a81SJung-uk Kim * PARAMETERS: String - Null terminated input string 185*2f6a1a81SJung-uk Kim * ReturnValuePtr - Where the converted value is returned 186*2f6a1a81SJung-uk Kim * 187*2f6a1a81SJung-uk Kim * RETURN: Status and 64-bit converted integer 188*2f6a1a81SJung-uk Kim * 189*2f6a1a81SJung-uk Kim * DESCRIPTION: Performs a base 8 conversion of the input string to an 190*2f6a1a81SJung-uk Kim * integer value, either 32 or 64 bits. 191*2f6a1a81SJung-uk Kim * 192*2f6a1a81SJung-uk Kim * NOTE: Maximum 64-bit unsigned octal value is 01777777777777777777777 193*2f6a1a81SJung-uk Kim * Maximum 32-bit unsigned octal value is 037777777777 194*2f6a1a81SJung-uk Kim * 195*2f6a1a81SJung-uk Kim ******************************************************************************/ 196*2f6a1a81SJung-uk Kim 197*2f6a1a81SJung-uk Kim ACPI_STATUS 198*2f6a1a81SJung-uk Kim AcpiUtConvertOctalString ( 199*2f6a1a81SJung-uk Kim char *String, 200*2f6a1a81SJung-uk Kim UINT64 *ReturnValuePtr) 201*2f6a1a81SJung-uk Kim { 202*2f6a1a81SJung-uk Kim UINT64 AccumulatedValue = 0; 203*2f6a1a81SJung-uk Kim ACPI_STATUS Status = AE_OK; 204*2f6a1a81SJung-uk Kim 205*2f6a1a81SJung-uk Kim 206*2f6a1a81SJung-uk Kim /* Convert each ASCII byte in the input string */ 207*2f6a1a81SJung-uk Kim 208*2f6a1a81SJung-uk Kim while (*String) 209*2f6a1a81SJung-uk Kim { 210*2f6a1a81SJung-uk Kim /* Character must be ASCII 0-7, otherwise terminate with no error */ 211*2f6a1a81SJung-uk Kim 212*2f6a1a81SJung-uk Kim if (!(ACPI_IS_OCTAL_DIGIT (*String))) 213*2f6a1a81SJung-uk Kim { 214*2f6a1a81SJung-uk Kim break; 215*2f6a1a81SJung-uk Kim } 216*2f6a1a81SJung-uk Kim 217*2f6a1a81SJung-uk Kim /* Convert and insert this octal digit into the accumulator */ 218*2f6a1a81SJung-uk Kim 219*2f6a1a81SJung-uk Kim Status = AcpiUtInsertDigit (&AccumulatedValue, 8, *String); 220*2f6a1a81SJung-uk Kim if (ACPI_FAILURE (Status)) 221*2f6a1a81SJung-uk Kim { 222*2f6a1a81SJung-uk Kim Status = AE_OCTAL_OVERFLOW; 223*2f6a1a81SJung-uk Kim break; 224*2f6a1a81SJung-uk Kim } 225*2f6a1a81SJung-uk Kim 226*2f6a1a81SJung-uk Kim String++; 227*2f6a1a81SJung-uk Kim } 228*2f6a1a81SJung-uk Kim 229*2f6a1a81SJung-uk Kim /* Always return the value that has been accumulated */ 230*2f6a1a81SJung-uk Kim 231*2f6a1a81SJung-uk Kim *ReturnValuePtr = AccumulatedValue; 232*2f6a1a81SJung-uk Kim return (Status); 233*2f6a1a81SJung-uk Kim } 234*2f6a1a81SJung-uk Kim 235*2f6a1a81SJung-uk Kim 236*2f6a1a81SJung-uk Kim /******************************************************************************* 237*2f6a1a81SJung-uk Kim * 238*2f6a1a81SJung-uk Kim * FUNCTION: AcpiUtConvertDecimalString 239*2f6a1a81SJung-uk Kim * 240*2f6a1a81SJung-uk Kim * PARAMETERS: String - Null terminated input string 241*2f6a1a81SJung-uk Kim * ReturnValuePtr - Where the converted value is returned 242*2f6a1a81SJung-uk Kim * 243*2f6a1a81SJung-uk Kim * RETURN: Status and 64-bit converted integer 244*2f6a1a81SJung-uk Kim * 245*2f6a1a81SJung-uk Kim * DESCRIPTION: Performs a base 10 conversion of the input string to an 246*2f6a1a81SJung-uk Kim * integer value, either 32 or 64 bits. 247*2f6a1a81SJung-uk Kim * 248*2f6a1a81SJung-uk Kim * NOTE: Maximum 64-bit unsigned decimal value is 18446744073709551615 249*2f6a1a81SJung-uk Kim * Maximum 32-bit unsigned decimal value is 4294967295 250*2f6a1a81SJung-uk Kim * 251*2f6a1a81SJung-uk Kim ******************************************************************************/ 252*2f6a1a81SJung-uk Kim 253*2f6a1a81SJung-uk Kim ACPI_STATUS 254*2f6a1a81SJung-uk Kim AcpiUtConvertDecimalString ( 255*2f6a1a81SJung-uk Kim char *String, 256*2f6a1a81SJung-uk Kim UINT64 *ReturnValuePtr) 257*2f6a1a81SJung-uk Kim { 258*2f6a1a81SJung-uk Kim UINT64 AccumulatedValue = 0; 259*2f6a1a81SJung-uk Kim ACPI_STATUS Status = AE_OK; 260*2f6a1a81SJung-uk Kim 261*2f6a1a81SJung-uk Kim 262*2f6a1a81SJung-uk Kim /* Convert each ASCII byte in the input string */ 263*2f6a1a81SJung-uk Kim 264*2f6a1a81SJung-uk Kim while (*String) 265*2f6a1a81SJung-uk Kim { 266*2f6a1a81SJung-uk Kim /* Character must be ASCII 0-9, otherwise terminate with no error */ 267*2f6a1a81SJung-uk Kim 268*2f6a1a81SJung-uk Kim if (!isdigit (*String)) 269*2f6a1a81SJung-uk Kim { 270*2f6a1a81SJung-uk Kim break; 271*2f6a1a81SJung-uk Kim } 272*2f6a1a81SJung-uk Kim 273*2f6a1a81SJung-uk Kim /* Convert and insert this decimal digit into the accumulator */ 274*2f6a1a81SJung-uk Kim 275*2f6a1a81SJung-uk Kim Status = AcpiUtInsertDigit (&AccumulatedValue, 10, *String); 276*2f6a1a81SJung-uk Kim if (ACPI_FAILURE (Status)) 277*2f6a1a81SJung-uk Kim { 278*2f6a1a81SJung-uk Kim Status = AE_DECIMAL_OVERFLOW; 279*2f6a1a81SJung-uk Kim break; 280*2f6a1a81SJung-uk Kim } 281*2f6a1a81SJung-uk Kim 282*2f6a1a81SJung-uk Kim String++; 283*2f6a1a81SJung-uk Kim } 284*2f6a1a81SJung-uk Kim 285*2f6a1a81SJung-uk Kim /* Always return the value that has been accumulated */ 286*2f6a1a81SJung-uk Kim 287*2f6a1a81SJung-uk Kim *ReturnValuePtr = AccumulatedValue; 288*2f6a1a81SJung-uk Kim return (Status); 289*2f6a1a81SJung-uk Kim } 290*2f6a1a81SJung-uk Kim 291*2f6a1a81SJung-uk Kim 292*2f6a1a81SJung-uk Kim /******************************************************************************* 293*2f6a1a81SJung-uk Kim * 294*2f6a1a81SJung-uk Kim * FUNCTION: AcpiUtConvertHexString 295*2f6a1a81SJung-uk Kim * 296*2f6a1a81SJung-uk Kim * PARAMETERS: String - Null terminated input string 297*2f6a1a81SJung-uk Kim * ReturnValuePtr - Where the converted value is returned 298*2f6a1a81SJung-uk Kim * 299*2f6a1a81SJung-uk Kim * RETURN: Status and 64-bit converted integer 300*2f6a1a81SJung-uk Kim * 301*2f6a1a81SJung-uk Kim * DESCRIPTION: Performs a base 16 conversion of the input string to an 302*2f6a1a81SJung-uk Kim * integer value, either 32 or 64 bits. 303*2f6a1a81SJung-uk Kim * 304*2f6a1a81SJung-uk Kim * NOTE: Maximum 64-bit unsigned hex value is 0xFFFFFFFFFFFFFFFF 305*2f6a1a81SJung-uk Kim * Maximum 32-bit unsigned hex value is 0xFFFFFFFF 306*2f6a1a81SJung-uk Kim * 307*2f6a1a81SJung-uk Kim ******************************************************************************/ 308*2f6a1a81SJung-uk Kim 309*2f6a1a81SJung-uk Kim ACPI_STATUS 310*2f6a1a81SJung-uk Kim AcpiUtConvertHexString ( 311*2f6a1a81SJung-uk Kim char *String, 312*2f6a1a81SJung-uk Kim UINT64 *ReturnValuePtr) 313*2f6a1a81SJung-uk Kim { 314*2f6a1a81SJung-uk Kim UINT64 AccumulatedValue = 0; 315*2f6a1a81SJung-uk Kim ACPI_STATUS Status = AE_OK; 316*2f6a1a81SJung-uk Kim 317*2f6a1a81SJung-uk Kim 318*2f6a1a81SJung-uk Kim /* Convert each ASCII byte in the input string */ 319*2f6a1a81SJung-uk Kim 320*2f6a1a81SJung-uk Kim while (*String) 321*2f6a1a81SJung-uk Kim { 322*2f6a1a81SJung-uk Kim /* Must be ASCII A-F, a-f, or 0-9, otherwise terminate with no error */ 323*2f6a1a81SJung-uk Kim 324*2f6a1a81SJung-uk Kim if (!isxdigit (*String)) 325*2f6a1a81SJung-uk Kim { 326*2f6a1a81SJung-uk Kim break; 327*2f6a1a81SJung-uk Kim } 328*2f6a1a81SJung-uk Kim 329*2f6a1a81SJung-uk Kim /* Convert and insert this hex digit into the accumulator */ 330*2f6a1a81SJung-uk Kim 331*2f6a1a81SJung-uk Kim Status = AcpiUtInsertDigit (&AccumulatedValue, 16, *String); 332*2f6a1a81SJung-uk Kim if (ACPI_FAILURE (Status)) 333*2f6a1a81SJung-uk Kim { 334*2f6a1a81SJung-uk Kim Status = AE_HEX_OVERFLOW; 335*2f6a1a81SJung-uk Kim break; 336*2f6a1a81SJung-uk Kim } 337*2f6a1a81SJung-uk Kim 338*2f6a1a81SJung-uk Kim String++; 339*2f6a1a81SJung-uk Kim } 340*2f6a1a81SJung-uk Kim 341*2f6a1a81SJung-uk Kim /* Always return the value that has been accumulated */ 342*2f6a1a81SJung-uk Kim 343*2f6a1a81SJung-uk Kim *ReturnValuePtr = AccumulatedValue; 344*2f6a1a81SJung-uk Kim return (Status); 345*2f6a1a81SJung-uk Kim } 346*2f6a1a81SJung-uk Kim 347*2f6a1a81SJung-uk Kim 348*2f6a1a81SJung-uk Kim /******************************************************************************* 349*2f6a1a81SJung-uk Kim * 350*2f6a1a81SJung-uk Kim * FUNCTION: AcpiUtRemoveLeadingZeros 351*2f6a1a81SJung-uk Kim * 352*2f6a1a81SJung-uk Kim * PARAMETERS: String - Pointer to input ASCII string 353*2f6a1a81SJung-uk Kim * 354*2f6a1a81SJung-uk Kim * RETURN: Next character after any leading zeros. This character may be 355*2f6a1a81SJung-uk Kim * used by the caller to detect end-of-string. 356*2f6a1a81SJung-uk Kim * 357*2f6a1a81SJung-uk Kim * DESCRIPTION: Remove any leading zeros in the input string. Return the 358*2f6a1a81SJung-uk Kim * next character after the final ASCII zero to enable the caller 359*2f6a1a81SJung-uk Kim * to check for the end of the string (NULL terminator). 360*2f6a1a81SJung-uk Kim * 361*2f6a1a81SJung-uk Kim ******************************************************************************/ 362*2f6a1a81SJung-uk Kim 363*2f6a1a81SJung-uk Kim char 364*2f6a1a81SJung-uk Kim AcpiUtRemoveLeadingZeros ( 365*2f6a1a81SJung-uk Kim char **String) 366*2f6a1a81SJung-uk Kim { 367*2f6a1a81SJung-uk Kim 368*2f6a1a81SJung-uk Kim while (**String == ACPI_ASCII_ZERO) 369*2f6a1a81SJung-uk Kim { 370*2f6a1a81SJung-uk Kim *String += 1; 371*2f6a1a81SJung-uk Kim } 372*2f6a1a81SJung-uk Kim 373*2f6a1a81SJung-uk Kim return (**String); 374*2f6a1a81SJung-uk Kim } 375*2f6a1a81SJung-uk Kim 376*2f6a1a81SJung-uk Kim 377*2f6a1a81SJung-uk Kim /******************************************************************************* 378*2f6a1a81SJung-uk Kim * 379*2f6a1a81SJung-uk Kim * FUNCTION: AcpiUtRemoveWhitespace 380*2f6a1a81SJung-uk Kim * 381*2f6a1a81SJung-uk Kim * PARAMETERS: String - Pointer to input ASCII string 382*2f6a1a81SJung-uk Kim * 383*2f6a1a81SJung-uk Kim * RETURN: Next character after any whitespace. This character may be 384*2f6a1a81SJung-uk Kim * used by the caller to detect end-of-string. 385*2f6a1a81SJung-uk Kim * 386*2f6a1a81SJung-uk Kim * DESCRIPTION: Remove any leading whitespace in the input string. Return the 387*2f6a1a81SJung-uk Kim * next character after the final ASCII zero to enable the caller 388*2f6a1a81SJung-uk Kim * to check for the end of the string (NULL terminator). 389*2f6a1a81SJung-uk Kim * 390*2f6a1a81SJung-uk Kim ******************************************************************************/ 391*2f6a1a81SJung-uk Kim 392*2f6a1a81SJung-uk Kim char 393*2f6a1a81SJung-uk Kim AcpiUtRemoveWhitespace ( 394*2f6a1a81SJung-uk Kim char **String) 395*2f6a1a81SJung-uk Kim { 396*2f6a1a81SJung-uk Kim 397*2f6a1a81SJung-uk Kim while (isspace ((UINT8) **String)) 398*2f6a1a81SJung-uk Kim { 399*2f6a1a81SJung-uk Kim *String += 1; 400*2f6a1a81SJung-uk Kim } 401*2f6a1a81SJung-uk Kim 402*2f6a1a81SJung-uk Kim return (**String); 403*2f6a1a81SJung-uk Kim } 404*2f6a1a81SJung-uk Kim 405*2f6a1a81SJung-uk Kim 406*2f6a1a81SJung-uk Kim /******************************************************************************* 407*2f6a1a81SJung-uk Kim * 408*2f6a1a81SJung-uk Kim * FUNCTION: AcpiUtDetectHexPrefix 409*2f6a1a81SJung-uk Kim * 410*2f6a1a81SJung-uk Kim * PARAMETERS: String - Pointer to input ASCII string 411*2f6a1a81SJung-uk Kim * 412*2f6a1a81SJung-uk Kim * RETURN: TRUE if a "0x" prefix was found at the start of the string 413*2f6a1a81SJung-uk Kim * 414*2f6a1a81SJung-uk Kim * DESCRIPTION: Detect and remove a hex "0x" prefix 415*2f6a1a81SJung-uk Kim * 416*2f6a1a81SJung-uk Kim ******************************************************************************/ 417*2f6a1a81SJung-uk Kim 418*2f6a1a81SJung-uk Kim BOOLEAN 419*2f6a1a81SJung-uk Kim AcpiUtDetectHexPrefix ( 420*2f6a1a81SJung-uk Kim char **String) 421*2f6a1a81SJung-uk Kim { 422*2f6a1a81SJung-uk Kim 423*2f6a1a81SJung-uk Kim if ((**String == ACPI_ASCII_ZERO) && 424*2f6a1a81SJung-uk Kim (tolower ((int) *(*String + 1)) == 'x')) 425*2f6a1a81SJung-uk Kim { 426*2f6a1a81SJung-uk Kim *String += 2; /* Go past the leading 0x */ 427*2f6a1a81SJung-uk Kim return (TRUE); 428*2f6a1a81SJung-uk Kim } 429*2f6a1a81SJung-uk Kim 430*2f6a1a81SJung-uk Kim return (FALSE); /* Not a hex string */ 431*2f6a1a81SJung-uk Kim } 432*2f6a1a81SJung-uk Kim 433*2f6a1a81SJung-uk Kim 434*2f6a1a81SJung-uk Kim /******************************************************************************* 435*2f6a1a81SJung-uk Kim * 436*2f6a1a81SJung-uk Kim * FUNCTION: AcpiUtDetectOctalPrefix 437*2f6a1a81SJung-uk Kim * 438*2f6a1a81SJung-uk Kim * PARAMETERS: String - Pointer to input ASCII string 439*2f6a1a81SJung-uk Kim * 440*2f6a1a81SJung-uk Kim * RETURN: True if an octal "0" prefix was found at the start of the 441*2f6a1a81SJung-uk Kim * string 442*2f6a1a81SJung-uk Kim * 443*2f6a1a81SJung-uk Kim * DESCRIPTION: Detect and remove an octal prefix (zero) 444*2f6a1a81SJung-uk Kim * 445*2f6a1a81SJung-uk Kim ******************************************************************************/ 446*2f6a1a81SJung-uk Kim 447*2f6a1a81SJung-uk Kim BOOLEAN 448*2f6a1a81SJung-uk Kim AcpiUtDetectOctalPrefix ( 449*2f6a1a81SJung-uk Kim char **String) 450*2f6a1a81SJung-uk Kim { 451*2f6a1a81SJung-uk Kim 452*2f6a1a81SJung-uk Kim if (**String == ACPI_ASCII_ZERO) 453*2f6a1a81SJung-uk Kim { 454*2f6a1a81SJung-uk Kim *String += 1; /* Go past the leading 0 */ 455*2f6a1a81SJung-uk Kim return (TRUE); 456*2f6a1a81SJung-uk Kim } 457*2f6a1a81SJung-uk Kim 458*2f6a1a81SJung-uk Kim return (FALSE); /* Not an octal string */ 459*2f6a1a81SJung-uk Kim } 460*2f6a1a81SJung-uk Kim 461*2f6a1a81SJung-uk Kim 462*2f6a1a81SJung-uk Kim /******************************************************************************* 463*2f6a1a81SJung-uk Kim * 464*2f6a1a81SJung-uk Kim * FUNCTION: AcpiUtInsertDigit 465*2f6a1a81SJung-uk Kim * 466*2f6a1a81SJung-uk Kim * PARAMETERS: AccumulatedValue - Current value of the integer value 467*2f6a1a81SJung-uk Kim * accumulator. The new value is 468*2f6a1a81SJung-uk Kim * returned here. 469*2f6a1a81SJung-uk Kim * Base - Radix, either 8/10/16 470*2f6a1a81SJung-uk Kim * AsciiDigit - ASCII single digit to be inserted 471*2f6a1a81SJung-uk Kim * 472*2f6a1a81SJung-uk Kim * RETURN: Status and result of the convert/insert operation. The only 473*2f6a1a81SJung-uk Kim * possible returned exception code is numeric overflow of 474*2f6a1a81SJung-uk Kim * either the multiply or add conversion operations. 475*2f6a1a81SJung-uk Kim * 476*2f6a1a81SJung-uk Kim * DESCRIPTION: Generic conversion and insertion function for all bases: 477*2f6a1a81SJung-uk Kim * 478*2f6a1a81SJung-uk Kim * 1) Multiply the current accumulated/converted value by the 479*2f6a1a81SJung-uk Kim * base in order to make room for the new character. 480*2f6a1a81SJung-uk Kim * 481*2f6a1a81SJung-uk Kim * 2) Convert the new character to binary and add it to the 482*2f6a1a81SJung-uk Kim * current accumulated value. 483*2f6a1a81SJung-uk Kim * 484*2f6a1a81SJung-uk Kim * Note: The only possible exception indicates an integer 485*2f6a1a81SJung-uk Kim * overflow (AE_NUMERIC_OVERFLOW) 486*2f6a1a81SJung-uk Kim * 487*2f6a1a81SJung-uk Kim ******************************************************************************/ 488*2f6a1a81SJung-uk Kim 489*2f6a1a81SJung-uk Kim static ACPI_STATUS 490*2f6a1a81SJung-uk Kim AcpiUtInsertDigit ( 491*2f6a1a81SJung-uk Kim UINT64 *AccumulatedValue, 492*2f6a1a81SJung-uk Kim UINT32 Base, 493*2f6a1a81SJung-uk Kim int AsciiDigit) 494*2f6a1a81SJung-uk Kim { 495*2f6a1a81SJung-uk Kim ACPI_STATUS Status; 496*2f6a1a81SJung-uk Kim UINT64 Product; 497*2f6a1a81SJung-uk Kim 498*2f6a1a81SJung-uk Kim 499*2f6a1a81SJung-uk Kim /* Make room in the accumulated value for the incoming digit */ 500*2f6a1a81SJung-uk Kim 501*2f6a1a81SJung-uk Kim Status = AcpiUtStrtoulMultiply64 (*AccumulatedValue, Base, &Product); 502*2f6a1a81SJung-uk Kim if (ACPI_FAILURE (Status)) 503*2f6a1a81SJung-uk Kim { 504*2f6a1a81SJung-uk Kim return (Status); 505*2f6a1a81SJung-uk Kim } 506*2f6a1a81SJung-uk Kim 507*2f6a1a81SJung-uk Kim /* Add in the new digit, and store the sum to the accumulated value */ 508*2f6a1a81SJung-uk Kim 509*2f6a1a81SJung-uk Kim Status = AcpiUtStrtoulAdd64 (Product, AcpiUtAsciiCharToHex (AsciiDigit), 510*2f6a1a81SJung-uk Kim AccumulatedValue); 511*2f6a1a81SJung-uk Kim 512*2f6a1a81SJung-uk Kim return (Status); 513*2f6a1a81SJung-uk Kim } 514*2f6a1a81SJung-uk Kim 515*2f6a1a81SJung-uk Kim 516*2f6a1a81SJung-uk Kim /******************************************************************************* 517*2f6a1a81SJung-uk Kim * 518*2f6a1a81SJung-uk Kim * FUNCTION: AcpiUtStrtoulMultiply64 519*2f6a1a81SJung-uk Kim * 520*2f6a1a81SJung-uk Kim * PARAMETERS: Multiplicand - Current accumulated converted integer 521*2f6a1a81SJung-uk Kim * Multiplier - Base/Radix 522*2f6a1a81SJung-uk Kim * OutProduct - Where the product is returned 523*2f6a1a81SJung-uk Kim * 524*2f6a1a81SJung-uk Kim * RETURN: Status and 64-bit product 525*2f6a1a81SJung-uk Kim * 526*2f6a1a81SJung-uk Kim * DESCRIPTION: Multiply two 64-bit values, with checking for 64-bit overflow as 527*2f6a1a81SJung-uk Kim * well as 32-bit overflow if necessary (if the current global 528*2f6a1a81SJung-uk Kim * integer width is 32). 529*2f6a1a81SJung-uk Kim * 530*2f6a1a81SJung-uk Kim ******************************************************************************/ 531*2f6a1a81SJung-uk Kim 532*2f6a1a81SJung-uk Kim static ACPI_STATUS 533*2f6a1a81SJung-uk Kim AcpiUtStrtoulMultiply64 ( 534*2f6a1a81SJung-uk Kim UINT64 Multiplicand, 535*2f6a1a81SJung-uk Kim UINT64 Multiplier, 536*2f6a1a81SJung-uk Kim UINT64 *OutProduct) 537*2f6a1a81SJung-uk Kim { 538*2f6a1a81SJung-uk Kim UINT64 Product; 539*2f6a1a81SJung-uk Kim 540*2f6a1a81SJung-uk Kim 541*2f6a1a81SJung-uk Kim /* Exit if either operand is zero */ 542*2f6a1a81SJung-uk Kim 543*2f6a1a81SJung-uk Kim *OutProduct = 0; 544*2f6a1a81SJung-uk Kim if (!Multiplicand || !Multiplier) 545*2f6a1a81SJung-uk Kim { 546*2f6a1a81SJung-uk Kim return (AE_OK); 547*2f6a1a81SJung-uk Kim } 548*2f6a1a81SJung-uk Kim 549*2f6a1a81SJung-uk Kim /* Check for 64-bit overflow before the actual multiplication */ 550*2f6a1a81SJung-uk Kim 551*2f6a1a81SJung-uk Kim if (Multiplicand > (ACPI_UINT64_MAX / Multiplier)) 552*2f6a1a81SJung-uk Kim { 553*2f6a1a81SJung-uk Kim return (AE_NUMERIC_OVERFLOW); 554*2f6a1a81SJung-uk Kim } 555*2f6a1a81SJung-uk Kim 556*2f6a1a81SJung-uk Kim Product = Multiplicand * Multiplier; 557*2f6a1a81SJung-uk Kim 558*2f6a1a81SJung-uk Kim /* Check for 32-bit overflow if necessary */ 559*2f6a1a81SJung-uk Kim 560*2f6a1a81SJung-uk Kim if ((AcpiGbl_IntegerBitWidth == 32) && (Product > ACPI_UINT32_MAX)) 561*2f6a1a81SJung-uk Kim { 562*2f6a1a81SJung-uk Kim return (AE_NUMERIC_OVERFLOW); 563*2f6a1a81SJung-uk Kim } 564*2f6a1a81SJung-uk Kim 565*2f6a1a81SJung-uk Kim *OutProduct = Product; 566*2f6a1a81SJung-uk Kim return (AE_OK); 567*2f6a1a81SJung-uk Kim } 568*2f6a1a81SJung-uk Kim 569*2f6a1a81SJung-uk Kim 570*2f6a1a81SJung-uk Kim /******************************************************************************* 571*2f6a1a81SJung-uk Kim * 572*2f6a1a81SJung-uk Kim * FUNCTION: AcpiUtStrtoulAdd64 573*2f6a1a81SJung-uk Kim * 574*2f6a1a81SJung-uk Kim * PARAMETERS: Addend1 - Current accumulated converted integer 575*2f6a1a81SJung-uk Kim * Addend2 - New hex value/char 576*2f6a1a81SJung-uk Kim * OutSum - Where sum is returned (Accumulator) 577*2f6a1a81SJung-uk Kim * 578*2f6a1a81SJung-uk Kim * RETURN: Status and 64-bit sum 579*2f6a1a81SJung-uk Kim * 580*2f6a1a81SJung-uk Kim * DESCRIPTION: Add two 64-bit values, with checking for 64-bit overflow as 581*2f6a1a81SJung-uk Kim * well as 32-bit overflow if necessary (if the current global 582*2f6a1a81SJung-uk Kim * integer width is 32). 583*2f6a1a81SJung-uk Kim * 584*2f6a1a81SJung-uk Kim ******************************************************************************/ 585*2f6a1a81SJung-uk Kim 586*2f6a1a81SJung-uk Kim static ACPI_STATUS 587*2f6a1a81SJung-uk Kim AcpiUtStrtoulAdd64 ( 588*2f6a1a81SJung-uk Kim UINT64 Addend1, 589*2f6a1a81SJung-uk Kim UINT64 Addend2, 590*2f6a1a81SJung-uk Kim UINT64 *OutSum) 591*2f6a1a81SJung-uk Kim { 592*2f6a1a81SJung-uk Kim UINT64 Sum; 593*2f6a1a81SJung-uk Kim 594*2f6a1a81SJung-uk Kim 595*2f6a1a81SJung-uk Kim /* Check for 64-bit overflow before the actual addition */ 596*2f6a1a81SJung-uk Kim 597*2f6a1a81SJung-uk Kim if ((Addend1 > 0) && (Addend2 > (ACPI_UINT64_MAX - Addend1))) 598*2f6a1a81SJung-uk Kim { 599*2f6a1a81SJung-uk Kim return (AE_NUMERIC_OVERFLOW); 600*2f6a1a81SJung-uk Kim } 601*2f6a1a81SJung-uk Kim 602*2f6a1a81SJung-uk Kim Sum = Addend1 + Addend2; 603*2f6a1a81SJung-uk Kim 604*2f6a1a81SJung-uk Kim /* Check for 32-bit overflow if necessary */ 605*2f6a1a81SJung-uk Kim 606*2f6a1a81SJung-uk Kim if ((AcpiGbl_IntegerBitWidth == 32) && (Sum > ACPI_UINT32_MAX)) 607*2f6a1a81SJung-uk Kim { 608*2f6a1a81SJung-uk Kim return (AE_NUMERIC_OVERFLOW); 609*2f6a1a81SJung-uk Kim } 610*2f6a1a81SJung-uk Kim 611*2f6a1a81SJung-uk Kim *OutSum = Sum; 612*2f6a1a81SJung-uk Kim return (AE_OK); 613*2f6a1a81SJung-uk Kim } 614