1eef1b955SJung-uk Kim /****************************************************************************** 2eef1b955SJung-uk Kim * 3eef1b955SJung-uk Kim * Module Name: aslsupport.l - Flex/lex scanner C support routines. 4eef1b955SJung-uk Kim * NOTE: Included into aslcompile.l, not compiled by itself. 5eef1b955SJung-uk Kim * 6eef1b955SJung-uk Kim *****************************************************************************/ 7eef1b955SJung-uk Kim 8*0d84335fSJung-uk Kim /****************************************************************************** 9*0d84335fSJung-uk Kim * 10*0d84335fSJung-uk Kim * 1. Copyright Notice 11*0d84335fSJung-uk Kim * 12*0d84335fSJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2017, Intel Corp. 13eef1b955SJung-uk Kim * All rights reserved. 14eef1b955SJung-uk Kim * 15*0d84335fSJung-uk Kim * 2. License 16*0d84335fSJung-uk Kim * 17*0d84335fSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 18*0d84335fSJung-uk Kim * rights. You may have additional license terms from the party that provided 19*0d84335fSJung-uk Kim * you this software, covering your right to use that party's intellectual 20*0d84335fSJung-uk Kim * property rights. 21*0d84335fSJung-uk Kim * 22*0d84335fSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 23*0d84335fSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 24*0d84335fSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 25*0d84335fSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 26*0d84335fSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 27*0d84335fSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 28*0d84335fSJung-uk Kim * 29*0d84335fSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 30*0d84335fSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 31*0d84335fSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 32*0d84335fSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 33*0d84335fSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 34*0d84335fSJung-uk Kim * license, and in no event shall the patent license extend to any additions 35*0d84335fSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 36*0d84335fSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 37*0d84335fSJung-uk Kim * 38*0d84335fSJung-uk Kim * The above copyright and patent license is granted only if the following 39*0d84335fSJung-uk Kim * conditions are met: 40*0d84335fSJung-uk Kim * 41*0d84335fSJung-uk Kim * 3. Conditions 42*0d84335fSJung-uk Kim * 43*0d84335fSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 44*0d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 45*0d84335fSJung-uk Kim * Code or modification with rights to further distribute source must include 46*0d84335fSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 47*0d84335fSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 48*0d84335fSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 49*0d84335fSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 50*0d84335fSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 51*0d84335fSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 52*0d84335fSJung-uk Kim * must include a prominent statement that the modification is derived, 53*0d84335fSJung-uk Kim * directly or indirectly, from Original Intel Code. 54*0d84335fSJung-uk Kim * 55*0d84335fSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 56*0d84335fSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 57*0d84335fSJung-uk Kim * Code or modification without rights to further distribute source must 58*0d84335fSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 59*0d84335fSJung-uk Kim * documentation and/or other materials provided with distribution. In 60*0d84335fSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 61*0d84335fSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 62*0d84335fSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 63*0d84335fSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 64*0d84335fSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 65*0d84335fSJung-uk Kim * make. 66*0d84335fSJung-uk Kim * 67*0d84335fSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 68*0d84335fSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 69*0d84335fSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 70*0d84335fSJung-uk Kim * provision in the documentation and/or other materials provided with the 71*0d84335fSJung-uk Kim * distribution. 72*0d84335fSJung-uk Kim * 73*0d84335fSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 74*0d84335fSJung-uk Kim * Intel Code. 75*0d84335fSJung-uk Kim * 76*0d84335fSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 77*0d84335fSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 78*0d84335fSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 79*0d84335fSJung-uk Kim * without prior written authorization from Intel. 80*0d84335fSJung-uk Kim * 81*0d84335fSJung-uk Kim * 4. Disclaimer and Export Compliance 82*0d84335fSJung-uk Kim * 83*0d84335fSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 84*0d84335fSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 85*0d84335fSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 86*0d84335fSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 87*0d84335fSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 88*0d84335fSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 89*0d84335fSJung-uk Kim * PARTICULAR PURPOSE. 90*0d84335fSJung-uk Kim * 91*0d84335fSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 92*0d84335fSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 93*0d84335fSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 94*0d84335fSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 95*0d84335fSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 96*0d84335fSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 97*0d84335fSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 98*0d84335fSJung-uk Kim * LIMITED REMEDY. 99*0d84335fSJung-uk Kim * 100*0d84335fSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 101*0d84335fSJung-uk Kim * software or system incorporating such software without first obtaining any 102*0d84335fSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 103*0d84335fSJung-uk Kim * any other agency or department of the United States Government. In the 104*0d84335fSJung-uk Kim * event Licensee exports any such software from the United States or 105*0d84335fSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 106*0d84335fSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 107*0d84335fSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 108*0d84335fSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 109*0d84335fSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 110*0d84335fSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 111*0d84335fSJung-uk Kim * United States government or any agency thereof requires an export license, 112*0d84335fSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 113*0d84335fSJung-uk Kim * such license, approval or letter. 114*0d84335fSJung-uk Kim * 115*0d84335fSJung-uk Kim ***************************************************************************** 116*0d84335fSJung-uk Kim * 117*0d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 118*0d84335fSJung-uk Kim * following license: 119*0d84335fSJung-uk Kim * 120eef1b955SJung-uk Kim * Redistribution and use in source and binary forms, with or without 121eef1b955SJung-uk Kim * modification, are permitted provided that the following conditions 122eef1b955SJung-uk Kim * are met: 123eef1b955SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 124eef1b955SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 125eef1b955SJung-uk Kim * without modification. 126eef1b955SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 127eef1b955SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 128eef1b955SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 129eef1b955SJung-uk Kim * including a substantially similar Disclaimer requirement for further 130eef1b955SJung-uk Kim * binary redistribution. 131eef1b955SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 132eef1b955SJung-uk Kim * of any contributors may be used to endorse or promote products derived 133eef1b955SJung-uk Kim * from this software without specific prior written permission. 134eef1b955SJung-uk Kim * 135*0d84335fSJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 136*0d84335fSJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 137*0d84335fSJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 138*0d84335fSJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 139*0d84335fSJung-uk Kim * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 140*0d84335fSJung-uk Kim * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 141*0d84335fSJung-uk Kim * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 142*0d84335fSJung-uk Kim * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 143*0d84335fSJung-uk Kim * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 144*0d84335fSJung-uk Kim * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 145*0d84335fSJung-uk Kim * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 146*0d84335fSJung-uk Kim * 147*0d84335fSJung-uk Kim * Alternatively, you may choose to be licensed under the terms of the 148eef1b955SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 149eef1b955SJung-uk Kim * Software Foundation. 150eef1b955SJung-uk Kim * 151*0d84335fSJung-uk Kim *****************************************************************************/ 152eef1b955SJung-uk Kim 153eef1b955SJung-uk Kim /* Configuration */ 154eef1b955SJung-uk Kim 155eef1b955SJung-uk Kim #define ASL_SPACES_PER_TAB 4 156eef1b955SJung-uk Kim 157eef1b955SJung-uk Kim #define ASL_NORMAL_CHAR 0 158eef1b955SJung-uk Kim #define ASL_ESCAPE_SEQUENCE 1 159eef1b955SJung-uk Kim #define ASL_OCTAL_CONSTANT 2 160eef1b955SJung-uk Kim #define ASL_HEX_CONSTANT 3 161eef1b955SJung-uk Kim 162eef1b955SJung-uk Kim 163*0d84335fSJung-uk Kim void 164*0d84335fSJung-uk Kim yyerror (char const *s) 165eef1b955SJung-uk Kim { 166eef1b955SJung-uk Kim 167*0d84335fSJung-uk Kim AcpiOsPrintf ("YYERROR: %s\n", s); 168*0d84335fSJung-uk Kim } 169eef1b955SJung-uk Kim 170eef1b955SJung-uk Kim 1711c0e1b6dSJung-uk Kim /******************************************************************************* 1721c0e1b6dSJung-uk Kim * 1731c0e1b6dSJung-uk Kim * FUNCTION: AslParserCleanup 1741c0e1b6dSJung-uk Kim * 1751c0e1b6dSJung-uk Kim * Used to delete the current buffer 1761c0e1b6dSJung-uk Kim * 1771c0e1b6dSJung-uk Kim ******************************************************************************/ 1781c0e1b6dSJung-uk Kim 179313a0c13SJung-uk Kim void 180313a0c13SJung-uk Kim AslParserCleanup ( 181313a0c13SJung-uk Kim void) 182313a0c13SJung-uk Kim { 183313a0c13SJung-uk Kim 184313a0c13SJung-uk Kim yy_delete_buffer (YY_CURRENT_BUFFER); 185313a0c13SJung-uk Kim } 186313a0c13SJung-uk Kim 187313a0c13SJung-uk Kim 188eef1b955SJung-uk Kim /******************************************************************************* 189eef1b955SJung-uk Kim * 190eef1b955SJung-uk Kim * FUNCTION: AslDoLineDirective 191eef1b955SJung-uk Kim * 192eef1b955SJung-uk Kim * PARAMETERS: None. Uses input() to access current source code line 193eef1b955SJung-uk Kim * 194eef1b955SJung-uk Kim * RETURN: Updates global line number and filename 195eef1b955SJung-uk Kim * 196eef1b955SJung-uk Kim * DESCRIPTION: Handle #line directives emitted by the preprocessor. 197eef1b955SJung-uk Kim * 198eef1b955SJung-uk Kim * The #line directive is emitted by the preprocesser, and is used to 199eef1b955SJung-uk Kim * pass through line numbers from the original source code file to the 200eef1b955SJung-uk Kim * preprocessor output file (.i). This allows any compiler-generated 201eef1b955SJung-uk Kim * error messages to be displayed with the correct line number. 202eef1b955SJung-uk Kim * 203eef1b955SJung-uk Kim ******************************************************************************/ 204eef1b955SJung-uk Kim 205eef1b955SJung-uk Kim static void 206eef1b955SJung-uk Kim AslDoLineDirective ( 207eef1b955SJung-uk Kim void) 208eef1b955SJung-uk Kim { 209f38b0f21SJung-uk Kim int c; 210eef1b955SJung-uk Kim char *Token; 211eef1b955SJung-uk Kim UINT32 LineNumber; 212eef1b955SJung-uk Kim char *Filename; 213f38b0f21SJung-uk Kim UINT32 i; 214eef1b955SJung-uk Kim 2155ef50723SJung-uk Kim Gbl_HasIncludeFiles = TRUE; 216eef1b955SJung-uk Kim 217eef1b955SJung-uk Kim /* Eat the entire line that contains the #line directive */ 218eef1b955SJung-uk Kim 219f38b0f21SJung-uk Kim Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 220f38b0f21SJung-uk Kim 221f38b0f21SJung-uk Kim while ((c = input()) != '\n' && c != EOF) 222eef1b955SJung-uk Kim { 223f38b0f21SJung-uk Kim *Gbl_LineBufPtr = c; 224f38b0f21SJung-uk Kim Gbl_LineBufPtr++; 225eef1b955SJung-uk Kim } 226f38b0f21SJung-uk Kim *Gbl_LineBufPtr = 0; 227eef1b955SJung-uk Kim 228eef1b955SJung-uk Kim /* First argument is the actual line number */ 229eef1b955SJung-uk Kim 230eef1b955SJung-uk Kim Token = strtok (Gbl_CurrentLineBuffer, " "); 231eef1b955SJung-uk Kim if (!Token) 232eef1b955SJung-uk Kim { 233eef1b955SJung-uk Kim goto ResetAndExit; 234eef1b955SJung-uk Kim } 235eef1b955SJung-uk Kim 236f38b0f21SJung-uk Kim /* First argument is the line number */ 237eef1b955SJung-uk Kim 238eef1b955SJung-uk Kim LineNumber = (UINT32) UtDoConstant (Token); 239f38b0f21SJung-uk Kim 240f38b0f21SJung-uk Kim /* Emit the appropriate number of newlines */ 241f38b0f21SJung-uk Kim 242f38b0f21SJung-uk Kim Gbl_CurrentColumn = 0; 243f38b0f21SJung-uk Kim if (LineNumber > Gbl_CurrentLineNumber) 244f38b0f21SJung-uk Kim { 245f38b0f21SJung-uk Kim for (i = 0; i < (LineNumber - Gbl_CurrentLineNumber); i++) 246f38b0f21SJung-uk Kim { 247f38b0f21SJung-uk Kim FlWriteFile (ASL_FILE_SOURCE_OUTPUT, "\n", 1); 248f38b0f21SJung-uk Kim Gbl_CurrentColumn++; 249f38b0f21SJung-uk Kim } 250f38b0f21SJung-uk Kim } 251f38b0f21SJung-uk Kim 252f38b0f21SJung-uk Kim FlSetLineNumber (LineNumber); 253eef1b955SJung-uk Kim 254eef1b955SJung-uk Kim /* Second argument is the optional filename (in double quotes) */ 255eef1b955SJung-uk Kim 256eef1b955SJung-uk Kim Token = strtok (NULL, " \""); 257eef1b955SJung-uk Kim if (Token) 258eef1b955SJung-uk Kim { 259eef1b955SJung-uk Kim Filename = ACPI_ALLOCATE_ZEROED (strlen (Token) + 1); 260eef1b955SJung-uk Kim strcpy (Filename, Token); 261eef1b955SJung-uk Kim FlSetFilename (Filename); 262eef1b955SJung-uk Kim } 263eef1b955SJung-uk Kim 264eef1b955SJung-uk Kim /* Third argument is not supported at this time */ 265eef1b955SJung-uk Kim 266eef1b955SJung-uk Kim ResetAndExit: 267f38b0f21SJung-uk Kim 268f38b0f21SJung-uk Kim /* Reset globals for a new line */ 269f38b0f21SJung-uk Kim 270f38b0f21SJung-uk Kim Gbl_CurrentLineOffset += Gbl_CurrentColumn; 271f38b0f21SJung-uk Kim Gbl_CurrentColumn = 0; 272f38b0f21SJung-uk Kim Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 273eef1b955SJung-uk Kim } 274eef1b955SJung-uk Kim 275eef1b955SJung-uk Kim 276eef1b955SJung-uk Kim /******************************************************************************* 277eef1b955SJung-uk Kim * 278eef1b955SJung-uk Kim * FUNCTION: AslPopInputFileStack 279eef1b955SJung-uk Kim * 280eef1b955SJung-uk Kim * PARAMETERS: None 281eef1b955SJung-uk Kim * 282eef1b955SJung-uk Kim * RETURN: 0 if a node was popped, -1 otherwise 283eef1b955SJung-uk Kim * 284eef1b955SJung-uk Kim * DESCRIPTION: Pop the top of the input file stack and point the parser to 285eef1b955SJung-uk Kim * the saved parse buffer contained in the fnode. Also, set the 286eef1b955SJung-uk Kim * global line counters to the saved values. This function is 287eef1b955SJung-uk Kim * called when an include file reaches EOF. 288eef1b955SJung-uk Kim * 289eef1b955SJung-uk Kim ******************************************************************************/ 290eef1b955SJung-uk Kim 291eef1b955SJung-uk Kim int 292eef1b955SJung-uk Kim AslPopInputFileStack ( 293eef1b955SJung-uk Kim void) 294eef1b955SJung-uk Kim { 295eef1b955SJung-uk Kim ASL_FILE_NODE *Fnode; 296eef1b955SJung-uk Kim 297eef1b955SJung-uk Kim 298f8146b88SJung-uk Kim Gbl_PreviousIncludeFilename = Gbl_Files[ASL_FILE_INPUT].Filename; 299eef1b955SJung-uk Kim Fnode = Gbl_IncludeFileStack; 3001c0e1b6dSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 301f8146b88SJung-uk Kim "\nPop InputFile Stack, Fnode %p\n", Fnode); 302f8146b88SJung-uk Kim 303f8146b88SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 304f8146b88SJung-uk Kim "Include: Closing \"%s\"\n\n", Gbl_Files[ASL_FILE_INPUT].Filename); 305eef1b955SJung-uk Kim 306eef1b955SJung-uk Kim if (!Fnode) 307eef1b955SJung-uk Kim { 308eef1b955SJung-uk Kim return (-1); 309eef1b955SJung-uk Kim } 310eef1b955SJung-uk Kim 311eef1b955SJung-uk Kim /* Close the current include file */ 312eef1b955SJung-uk Kim 313eef1b955SJung-uk Kim fclose (yyin); 314eef1b955SJung-uk Kim 315eef1b955SJung-uk Kim /* Update the top-of-stack */ 316eef1b955SJung-uk Kim 317eef1b955SJung-uk Kim Gbl_IncludeFileStack = Fnode->Next; 318eef1b955SJung-uk Kim 319eef1b955SJung-uk Kim /* Reset global line counter and filename */ 320eef1b955SJung-uk Kim 321eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename; 322eef1b955SJung-uk Kim Gbl_CurrentLineNumber = Fnode->CurrentLineNumber; 323eef1b955SJung-uk Kim 324eef1b955SJung-uk Kim /* Point the parser to the popped file */ 325eef1b955SJung-uk Kim 326eef1b955SJung-uk Kim yy_delete_buffer (YY_CURRENT_BUFFER); 327eef1b955SJung-uk Kim yy_switch_to_buffer (Fnode->State); 328eef1b955SJung-uk Kim 329eef1b955SJung-uk Kim /* All done with this node */ 330eef1b955SJung-uk Kim 331eef1b955SJung-uk Kim ACPI_FREE (Fnode); 332eef1b955SJung-uk Kim return (0); 333eef1b955SJung-uk Kim } 334eef1b955SJung-uk Kim 335eef1b955SJung-uk Kim 336eef1b955SJung-uk Kim /******************************************************************************* 337eef1b955SJung-uk Kim * 338eef1b955SJung-uk Kim * FUNCTION: AslPushInputFileStack 339eef1b955SJung-uk Kim * 340eef1b955SJung-uk Kim * PARAMETERS: InputFile - Open file pointer 341eef1b955SJung-uk Kim * Filename - Name of the file 342eef1b955SJung-uk Kim * 343eef1b955SJung-uk Kim * RETURN: None 344eef1b955SJung-uk Kim * 345eef1b955SJung-uk Kim * DESCRIPTION: Push the InputFile onto the file stack, and point the parser 346eef1b955SJung-uk Kim * to this file. Called when an include file is successfully 347eef1b955SJung-uk Kim * opened. 348eef1b955SJung-uk Kim * 349eef1b955SJung-uk Kim ******************************************************************************/ 350eef1b955SJung-uk Kim 351eef1b955SJung-uk Kim void 352eef1b955SJung-uk Kim AslPushInputFileStack ( 353eef1b955SJung-uk Kim FILE *InputFile, 354eef1b955SJung-uk Kim char *Filename) 355eef1b955SJung-uk Kim { 356eef1b955SJung-uk Kim ASL_FILE_NODE *Fnode; 357eef1b955SJung-uk Kim YY_BUFFER_STATE State; 358eef1b955SJung-uk Kim 359eef1b955SJung-uk Kim 360eef1b955SJung-uk Kim /* Save the current state in an Fnode */ 361eef1b955SJung-uk Kim 362eef1b955SJung-uk Kim Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE)); 363eef1b955SJung-uk Kim 364eef1b955SJung-uk Kim Fnode->File = yyin; 365eef1b955SJung-uk Kim Fnode->Next = Gbl_IncludeFileStack; 366eef1b955SJung-uk Kim Fnode->State = YY_CURRENT_BUFFER; 367eef1b955SJung-uk Kim Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename; 3681c0e1b6dSJung-uk Kim Fnode->CurrentLineNumber = Gbl_CurrentLineNumber; 369eef1b955SJung-uk Kim 370eef1b955SJung-uk Kim /* Push it on the stack */ 371eef1b955SJung-uk Kim 372eef1b955SJung-uk Kim Gbl_IncludeFileStack = Fnode; 373eef1b955SJung-uk Kim 374eef1b955SJung-uk Kim /* Point the parser to this file */ 375eef1b955SJung-uk Kim 376eef1b955SJung-uk Kim State = yy_create_buffer (InputFile, YY_BUF_SIZE); 377eef1b955SJung-uk Kim yy_switch_to_buffer (State); 378eef1b955SJung-uk Kim 3791c0e1b6dSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 3801c0e1b6dSJung-uk Kim "\nPush InputFile Stack, returning %p\n\n", InputFile); 381eef1b955SJung-uk Kim 382eef1b955SJung-uk Kim /* Reset the global line count and filename */ 383eef1b955SJung-uk Kim 384313a0c13SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename = 385313a0c13SJung-uk Kim UtStringCacheCalloc (strlen (Filename) + 1); 386313a0c13SJung-uk Kim 387313a0c13SJung-uk Kim strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename); 388313a0c13SJung-uk Kim 389eef1b955SJung-uk Kim Gbl_CurrentLineNumber = 1; 390eef1b955SJung-uk Kim yyin = InputFile; 391*0d84335fSJung-uk Kim 392*0d84335fSJung-uk Kim /* converter: reset the comment state to STANDARD_COMMENT */ 393*0d84335fSJung-uk Kim 394*0d84335fSJung-uk Kim Gbl_CommentState.CommentType = STANDARD_COMMENT; 395eef1b955SJung-uk Kim } 396eef1b955SJung-uk Kim 397eef1b955SJung-uk Kim 398eef1b955SJung-uk Kim /******************************************************************************* 399eef1b955SJung-uk Kim * 400eef1b955SJung-uk Kim * FUNCTION: AslResetCurrentLineBuffer 401eef1b955SJung-uk Kim * 402eef1b955SJung-uk Kim * PARAMETERS: None 403eef1b955SJung-uk Kim * 404eef1b955SJung-uk Kim * RETURN: None 405eef1b955SJung-uk Kim * 406eef1b955SJung-uk Kim * DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers. 407eef1b955SJung-uk Kim * 408eef1b955SJung-uk Kim ******************************************************************************/ 409eef1b955SJung-uk Kim 410eef1b955SJung-uk Kim void 411eef1b955SJung-uk Kim AslResetCurrentLineBuffer ( 412eef1b955SJung-uk Kim void) 413eef1b955SJung-uk Kim { 414eef1b955SJung-uk Kim 415eef1b955SJung-uk Kim if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle) 416eef1b955SJung-uk Kim { 417eef1b955SJung-uk Kim FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer, 418eef1b955SJung-uk Kim Gbl_LineBufPtr - Gbl_CurrentLineBuffer); 419eef1b955SJung-uk Kim } 420eef1b955SJung-uk Kim 421eef1b955SJung-uk Kim Gbl_CurrentLineOffset += Gbl_CurrentColumn; 422eef1b955SJung-uk Kim Gbl_CurrentColumn = 0; 423eef1b955SJung-uk Kim 424eef1b955SJung-uk Kim Gbl_CurrentLineNumber++; 425eef1b955SJung-uk Kim Gbl_LogicalLineNumber++; 426eef1b955SJung-uk Kim Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 427eef1b955SJung-uk Kim } 428eef1b955SJung-uk Kim 429eef1b955SJung-uk Kim 430eef1b955SJung-uk Kim /******************************************************************************* 431eef1b955SJung-uk Kim * 432eef1b955SJung-uk Kim * FUNCTION: AslInsertLineBuffer 433eef1b955SJung-uk Kim * 434eef1b955SJung-uk Kim * PARAMETERS: SourceChar - One char from the input ASL source file 435eef1b955SJung-uk Kim * 436eef1b955SJung-uk Kim * RETURN: None 437eef1b955SJung-uk Kim * 438eef1b955SJung-uk Kim * DESCRIPTION: Put one character of the source file into the temp line buffer 439eef1b955SJung-uk Kim * 440eef1b955SJung-uk Kim ******************************************************************************/ 441eef1b955SJung-uk Kim 442eef1b955SJung-uk Kim void 443eef1b955SJung-uk Kim AslInsertLineBuffer ( 444eef1b955SJung-uk Kim int SourceChar) 445eef1b955SJung-uk Kim { 446eef1b955SJung-uk Kim UINT32 i; 447eef1b955SJung-uk Kim UINT32 Count = 1; 448eef1b955SJung-uk Kim 449eef1b955SJung-uk Kim 450eef1b955SJung-uk Kim if (SourceChar == EOF) 451eef1b955SJung-uk Kim { 452eef1b955SJung-uk Kim return; 453eef1b955SJung-uk Kim } 454eef1b955SJung-uk Kim 455eef1b955SJung-uk Kim Gbl_InputByteCount++; 456eef1b955SJung-uk Kim 457eef1b955SJung-uk Kim /* Handle tabs. Convert to spaces */ 458eef1b955SJung-uk Kim 459eef1b955SJung-uk Kim if (SourceChar == '\t') 460eef1b955SJung-uk Kim { 461eef1b955SJung-uk Kim SourceChar = ' '; 462eef1b955SJung-uk Kim Count = ASL_SPACES_PER_TAB - 463eef1b955SJung-uk Kim (Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1)); 464eef1b955SJung-uk Kim } 465eef1b955SJung-uk Kim 466eef1b955SJung-uk Kim for (i = 0; i < Count; i++) 467eef1b955SJung-uk Kim { 468eef1b955SJung-uk Kim Gbl_CurrentColumn++; 469eef1b955SJung-uk Kim 470eef1b955SJung-uk Kim /* Insert the character into the line buffer */ 471eef1b955SJung-uk Kim 472eef1b955SJung-uk Kim *Gbl_LineBufPtr = (UINT8) SourceChar; 473eef1b955SJung-uk Kim Gbl_LineBufPtr++; 474eef1b955SJung-uk Kim 4751c0e1b6dSJung-uk Kim if (Gbl_LineBufPtr > 4761c0e1b6dSJung-uk Kim (Gbl_CurrentLineBuffer + (Gbl_LineBufferSize - 1))) 477eef1b955SJung-uk Kim { 478eef1b955SJung-uk Kim #if 0 479eef1b955SJung-uk Kim /* 480eef1b955SJung-uk Kim * Warning if we have split a long source line. 481eef1b955SJung-uk Kim * <Probably overkill> 482eef1b955SJung-uk Kim */ 483042ff955SJung-uk Kim sprintf (MsgBuffer, "Max %u", Gbl_LineBufferSize); 484eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE, 485eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 486eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 487eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer); 488eef1b955SJung-uk Kim #endif 489eef1b955SJung-uk Kim 490eef1b955SJung-uk Kim AslResetCurrentLineBuffer (); 491eef1b955SJung-uk Kim } 492eef1b955SJung-uk Kim else if (SourceChar == '\n') 493eef1b955SJung-uk Kim { 494eef1b955SJung-uk Kim /* End of line */ 495eef1b955SJung-uk Kim 496eef1b955SJung-uk Kim AslResetCurrentLineBuffer (); 497eef1b955SJung-uk Kim } 498*0d84335fSJung-uk Kim 499*0d84335fSJung-uk Kim if (Gbl_CaptureComments) 500*0d84335fSJung-uk Kim { 501*0d84335fSJung-uk Kim CvProcessCommentState (SourceChar); 502*0d84335fSJung-uk Kim } 503eef1b955SJung-uk Kim } 504eef1b955SJung-uk Kim } 505eef1b955SJung-uk Kim 506eef1b955SJung-uk Kim 507eef1b955SJung-uk Kim /******************************************************************************* 508eef1b955SJung-uk Kim * 509eef1b955SJung-uk Kim * FUNCTION: count 510eef1b955SJung-uk Kim * 511eef1b955SJung-uk Kim * PARAMETERS: yytext - Contains the matched keyword. 512eef1b955SJung-uk Kim * Type - Keyword/Character type: 513eef1b955SJung-uk Kim * 0 = anything except a keyword 514eef1b955SJung-uk Kim * 1 = pseudo-keywords 515eef1b955SJung-uk Kim * 2 = non-executable ASL keywords 516eef1b955SJung-uk Kim * 3 = executable ASL keywords 517eef1b955SJung-uk Kim * 518eef1b955SJung-uk Kim * RETURN: None 519eef1b955SJung-uk Kim * 520eef1b955SJung-uk Kim * DESCRIPTION: Count keywords and put them into the line buffer 521eef1b955SJung-uk Kim * 522eef1b955SJung-uk Kim ******************************************************************************/ 523eef1b955SJung-uk Kim 524eef1b955SJung-uk Kim static void 525eef1b955SJung-uk Kim count ( 526eef1b955SJung-uk Kim int Type) 527eef1b955SJung-uk Kim { 528eef1b955SJung-uk Kim int i; 529eef1b955SJung-uk Kim 530eef1b955SJung-uk Kim 531eef1b955SJung-uk Kim switch (Type) 532eef1b955SJung-uk Kim { 533eef1b955SJung-uk Kim case 2: 534a9d8d09cSJung-uk Kim 535eef1b955SJung-uk Kim TotalKeywords++; 536eef1b955SJung-uk Kim TotalNamedObjects++; 537eef1b955SJung-uk Kim break; 538eef1b955SJung-uk Kim 539eef1b955SJung-uk Kim case 3: 540a9d8d09cSJung-uk Kim 541eef1b955SJung-uk Kim TotalKeywords++; 542eef1b955SJung-uk Kim TotalExecutableOpcodes++; 543eef1b955SJung-uk Kim break; 5449c48c75eSJung-uk Kim 5459c48c75eSJung-uk Kim default: 546a9d8d09cSJung-uk Kim 5479c48c75eSJung-uk Kim break; 548eef1b955SJung-uk Kim } 549eef1b955SJung-uk Kim 550eef1b955SJung-uk Kim for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++) 551eef1b955SJung-uk Kim { 552eef1b955SJung-uk Kim AslInsertLineBuffer (yytext[i]); 553eef1b955SJung-uk Kim *Gbl_LineBufPtr = 0; 554eef1b955SJung-uk Kim } 555eef1b955SJung-uk Kim } 556eef1b955SJung-uk Kim 557eef1b955SJung-uk Kim 558eef1b955SJung-uk Kim /******************************************************************************* 559eef1b955SJung-uk Kim * 560eef1b955SJung-uk Kim * FUNCTION: AslDoComment 561eef1b955SJung-uk Kim * 562eef1b955SJung-uk Kim * PARAMETERS: none 563eef1b955SJung-uk Kim * 564eef1b955SJung-uk Kim * RETURN: none 565eef1b955SJung-uk Kim * 566eef1b955SJung-uk Kim * DESCRIPTION: Process a standard comment. 567eef1b955SJung-uk Kim * 568eef1b955SJung-uk Kim ******************************************************************************/ 569eef1b955SJung-uk Kim 570*0d84335fSJung-uk Kim static BOOLEAN 571eef1b955SJung-uk Kim AslDoComment ( 572eef1b955SJung-uk Kim void) 573eef1b955SJung-uk Kim { 574f38b0f21SJung-uk Kim int c; 575f38b0f21SJung-uk Kim int c1 = 0; 576*0d84335fSJung-uk Kim char *StringBuffer = MsgBuffer; 577*0d84335fSJung-uk Kim char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE; 578*0d84335fSJung-uk Kim ASL_COMMENT_STATE CurrentState = Gbl_CommentState; /* to reference later on */ 579eef1b955SJung-uk Kim 580eef1b955SJung-uk Kim 581eef1b955SJung-uk Kim AslInsertLineBuffer ('/'); 582eef1b955SJung-uk Kim AslInsertLineBuffer ('*'); 583*0d84335fSJung-uk Kim if (Gbl_CaptureComments && CurrentState.CaptureComments) 584*0d84335fSJung-uk Kim { 585*0d84335fSJung-uk Kim *StringBuffer = '/'; 586*0d84335fSJung-uk Kim ++StringBuffer; 587*0d84335fSJung-uk Kim *StringBuffer = '*'; 588*0d84335fSJung-uk Kim ++StringBuffer; 589*0d84335fSJung-uk Kim } 590eef1b955SJung-uk Kim 591eef1b955SJung-uk Kim loop: 592eef1b955SJung-uk Kim 593eef1b955SJung-uk Kim /* Eat chars until end-of-comment */ 594eef1b955SJung-uk Kim 5951c0e1b6dSJung-uk Kim while (((c = input ()) != '*') && (c != EOF)) 596eef1b955SJung-uk Kim { 597eef1b955SJung-uk Kim AslInsertLineBuffer (c); 598*0d84335fSJung-uk Kim if (Gbl_CaptureComments && CurrentState.CaptureComments) 599*0d84335fSJung-uk Kim { 600*0d84335fSJung-uk Kim *StringBuffer = c; 601*0d84335fSJung-uk Kim ++StringBuffer; 602*0d84335fSJung-uk Kim } 603eef1b955SJung-uk Kim c1 = c; 604eef1b955SJung-uk Kim } 605eef1b955SJung-uk Kim 606eef1b955SJung-uk Kim if (c == EOF) 607eef1b955SJung-uk Kim { 608eef1b955SJung-uk Kim goto EarlyEOF; 609eef1b955SJung-uk Kim } 610eef1b955SJung-uk Kim 611eef1b955SJung-uk Kim /* 612eef1b955SJung-uk Kim * Check for nested comment -- can help catch cases where a previous 613eef1b955SJung-uk Kim * comment was accidently left unterminated 614eef1b955SJung-uk Kim */ 615eef1b955SJung-uk Kim if ((c1 == '/') && (c == '*')) 616eef1b955SJung-uk Kim { 617eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT, 618eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 619eef1b955SJung-uk Kim Gbl_InputByteCount, Gbl_CurrentColumn, 620eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 621eef1b955SJung-uk Kim } 622eef1b955SJung-uk Kim 623eef1b955SJung-uk Kim /* Comment is closed only if the NEXT character is a slash */ 624eef1b955SJung-uk Kim 625eef1b955SJung-uk Kim AslInsertLineBuffer (c); 626*0d84335fSJung-uk Kim if (Gbl_CaptureComments && CurrentState.CaptureComments) 627*0d84335fSJung-uk Kim { 628*0d84335fSJung-uk Kim *StringBuffer = c; 629*0d84335fSJung-uk Kim ++StringBuffer; 630*0d84335fSJung-uk Kim } 631eef1b955SJung-uk Kim 6321c0e1b6dSJung-uk Kim if (((c1 = input ()) != '/') && (c1 != EOF)) 633eef1b955SJung-uk Kim { 634eef1b955SJung-uk Kim unput (c1); 635eef1b955SJung-uk Kim goto loop; 636eef1b955SJung-uk Kim } 637eef1b955SJung-uk Kim 638eef1b955SJung-uk Kim if (c1 == EOF) 639eef1b955SJung-uk Kim { 640eef1b955SJung-uk Kim goto EarlyEOF; 641eef1b955SJung-uk Kim } 642*0d84335fSJung-uk Kim if (StringBuffer > EndBuffer) 643*0d84335fSJung-uk Kim { 644*0d84335fSJung-uk Kim goto BufferOverflow; 645*0d84335fSJung-uk Kim } 646eef1b955SJung-uk Kim 647eef1b955SJung-uk Kim AslInsertLineBuffer (c1); 648*0d84335fSJung-uk Kim CvProcessComment (CurrentState, StringBuffer, c1); 649eef1b955SJung-uk Kim return (TRUE); 650eef1b955SJung-uk Kim 651eef1b955SJung-uk Kim 652eef1b955SJung-uk Kim EarlyEOF: 653eef1b955SJung-uk Kim /* 654eef1b955SJung-uk Kim * Premature End-Of-File 655eef1b955SJung-uk Kim */ 656eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF, 657eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 658eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 659eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 660eef1b955SJung-uk Kim return (FALSE); 661*0d84335fSJung-uk Kim 662*0d84335fSJung-uk Kim 663*0d84335fSJung-uk Kim BufferOverflow: 664*0d84335fSJung-uk Kim 665*0d84335fSJung-uk Kim /* Comment was too long */ 666*0d84335fSJung-uk Kim 667*0d84335fSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH, 668*0d84335fSJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 669*0d84335fSJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 670*0d84335fSJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096"); 671*0d84335fSJung-uk Kim return (FALSE); 672*0d84335fSJung-uk Kim 673eef1b955SJung-uk Kim } 674eef1b955SJung-uk Kim 675eef1b955SJung-uk Kim 676eef1b955SJung-uk Kim /******************************************************************************* 677eef1b955SJung-uk Kim * 678eef1b955SJung-uk Kim * FUNCTION: AslDoCommentType2 679eef1b955SJung-uk Kim * 680eef1b955SJung-uk Kim * PARAMETERS: none 681eef1b955SJung-uk Kim * 682eef1b955SJung-uk Kim * RETURN: none 683eef1b955SJung-uk Kim * 684*0d84335fSJung-uk Kim * DESCRIPTION: Process a new "//" comment. Inline comments will be converted 685*0d84335fSJung-uk Kim * to "/ *" standard comments. 686eef1b955SJung-uk Kim * 687eef1b955SJung-uk Kim ******************************************************************************/ 688eef1b955SJung-uk Kim 689*0d84335fSJung-uk Kim static BOOLEAN 690eef1b955SJung-uk Kim AslDoCommentType2 ( 691eef1b955SJung-uk Kim void) 692eef1b955SJung-uk Kim { 693f38b0f21SJung-uk Kim int c; 694*0d84335fSJung-uk Kim char *StringBuffer = MsgBuffer; 695*0d84335fSJung-uk Kim char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE; 696*0d84335fSJung-uk Kim ASL_COMMENT_STATE CurrentState = Gbl_CommentState; 697eef1b955SJung-uk Kim 698eef1b955SJung-uk Kim 699eef1b955SJung-uk Kim AslInsertLineBuffer ('/'); 700*0d84335fSJung-uk Kim AslInsertLineBuffer ('*'); 701*0d84335fSJung-uk Kim 702*0d84335fSJung-uk Kim if (Gbl_CaptureComments && CurrentState.CaptureComments) 703*0d84335fSJung-uk Kim { 704*0d84335fSJung-uk Kim *StringBuffer = '/'; 705*0d84335fSJung-uk Kim ++StringBuffer; 706*0d84335fSJung-uk Kim *StringBuffer = '*'; 707*0d84335fSJung-uk Kim ++StringBuffer; 708*0d84335fSJung-uk Kim } 709eef1b955SJung-uk Kim 7101c0e1b6dSJung-uk Kim while (((c = input ()) != '\n') && (c != EOF)) 711eef1b955SJung-uk Kim { 712eef1b955SJung-uk Kim AslInsertLineBuffer (c); 713*0d84335fSJung-uk Kim if (Gbl_CaptureComments && CurrentState.CaptureComments) 714*0d84335fSJung-uk Kim { 715*0d84335fSJung-uk Kim *StringBuffer = c; 716*0d84335fSJung-uk Kim ++StringBuffer; 717*0d84335fSJung-uk Kim } 718eef1b955SJung-uk Kim } 719eef1b955SJung-uk Kim 720eef1b955SJung-uk Kim if (c == EOF) 721eef1b955SJung-uk Kim { 722eef1b955SJung-uk Kim /* End of file is OK, change to newline. Let parser detect EOF later */ 723eef1b955SJung-uk Kim 724eef1b955SJung-uk Kim c = '\n'; 725eef1b955SJung-uk Kim } 726eef1b955SJung-uk Kim 727*0d84335fSJung-uk Kim if (StringBuffer > EndBuffer) 728*0d84335fSJung-uk Kim { 729*0d84335fSJung-uk Kim goto BufferOverflow; 730*0d84335fSJung-uk Kim } 731eef1b955SJung-uk Kim AslInsertLineBuffer (c); 732*0d84335fSJung-uk Kim 733*0d84335fSJung-uk Kim CvProcessCommentType2 (CurrentState, StringBuffer); 734eef1b955SJung-uk Kim return (TRUE); 735*0d84335fSJung-uk Kim 736*0d84335fSJung-uk Kim 737*0d84335fSJung-uk Kim BufferOverflow: 738*0d84335fSJung-uk Kim 739*0d84335fSJung-uk Kim /* Comment was too long */ 740*0d84335fSJung-uk Kim 741*0d84335fSJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH, 742*0d84335fSJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 743*0d84335fSJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 744*0d84335fSJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096"); 745*0d84335fSJung-uk Kim return (FALSE); 746*0d84335fSJung-uk Kim 747eef1b955SJung-uk Kim } 748eef1b955SJung-uk Kim 749eef1b955SJung-uk Kim 750eef1b955SJung-uk Kim /******************************************************************************* 751eef1b955SJung-uk Kim * 752eef1b955SJung-uk Kim * FUNCTION: AslDoStringLiteral 753eef1b955SJung-uk Kim * 754eef1b955SJung-uk Kim * PARAMETERS: none 755eef1b955SJung-uk Kim * 756eef1b955SJung-uk Kim * RETURN: none 757eef1b955SJung-uk Kim * 758eef1b955SJung-uk Kim * DESCRIPTION: Process a string literal (surrounded by quotes) 759eef1b955SJung-uk Kim * 760eef1b955SJung-uk Kim ******************************************************************************/ 761eef1b955SJung-uk Kim 762eef1b955SJung-uk Kim static char 763eef1b955SJung-uk Kim AslDoStringLiteral ( 764eef1b955SJung-uk Kim void) 765eef1b955SJung-uk Kim { 766eef1b955SJung-uk Kim char *StringBuffer = MsgBuffer; 767eef1b955SJung-uk Kim char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE; 768eef1b955SJung-uk Kim char *CleanString; 769f38b0f21SJung-uk Kim int StringChar; 770eef1b955SJung-uk Kim UINT32 State = ASL_NORMAL_CHAR; 771eef1b955SJung-uk Kim UINT32 i = 0; 772eef1b955SJung-uk Kim UINT8 Digit; 773eef1b955SJung-uk Kim char ConvertBuffer[4]; 774eef1b955SJung-uk Kim 775eef1b955SJung-uk Kim 776eef1b955SJung-uk Kim /* 777eef1b955SJung-uk Kim * Eat chars until end-of-literal. 778eef1b955SJung-uk Kim * NOTE: Put back the original surrounding quotes into the 779eef1b955SJung-uk Kim * source line buffer. 780eef1b955SJung-uk Kim */ 781eef1b955SJung-uk Kim AslInsertLineBuffer ('\"'); 782f38b0f21SJung-uk Kim while ((StringChar = input()) != EOF) 783eef1b955SJung-uk Kim { 784eef1b955SJung-uk Kim AslInsertLineBuffer (StringChar); 785eef1b955SJung-uk Kim 786eef1b955SJung-uk Kim DoCharacter: 787eef1b955SJung-uk Kim switch (State) 788eef1b955SJung-uk Kim { 789eef1b955SJung-uk Kim case ASL_NORMAL_CHAR: 790eef1b955SJung-uk Kim 791eef1b955SJung-uk Kim switch (StringChar) 792eef1b955SJung-uk Kim { 793eef1b955SJung-uk Kim case '\\': 794eef1b955SJung-uk Kim /* 795eef1b955SJung-uk Kim * Special handling for backslash-escape sequence. We will 796eef1b955SJung-uk Kim * toss the backslash and translate the escape char(s). 797eef1b955SJung-uk Kim */ 798eef1b955SJung-uk Kim State = ASL_ESCAPE_SEQUENCE; 799eef1b955SJung-uk Kim continue; 800eef1b955SJung-uk Kim 801eef1b955SJung-uk Kim case '\"': 802eef1b955SJung-uk Kim 803eef1b955SJung-uk Kim /* String terminator */ 804eef1b955SJung-uk Kim 805eef1b955SJung-uk Kim goto CompletedString; 8069c48c75eSJung-uk Kim 8079c48c75eSJung-uk Kim default: 808a9d8d09cSJung-uk Kim 8099c48c75eSJung-uk Kim break; 810eef1b955SJung-uk Kim } 811eef1b955SJung-uk Kim break; 812eef1b955SJung-uk Kim 813eef1b955SJung-uk Kim 814eef1b955SJung-uk Kim case ASL_ESCAPE_SEQUENCE: 815eef1b955SJung-uk Kim 816eef1b955SJung-uk Kim State = ASL_NORMAL_CHAR; 817eef1b955SJung-uk Kim switch (StringChar) 818eef1b955SJung-uk Kim { 819eef1b955SJung-uk Kim case 'a': 820a9d8d09cSJung-uk Kim 821eef1b955SJung-uk Kim StringChar = 0x07; /* BELL */ 822eef1b955SJung-uk Kim break; 823eef1b955SJung-uk Kim 824eef1b955SJung-uk Kim case 'b': 825a9d8d09cSJung-uk Kim 826eef1b955SJung-uk Kim StringChar = 0x08; /* BACKSPACE */ 827eef1b955SJung-uk Kim break; 828eef1b955SJung-uk Kim 829eef1b955SJung-uk Kim case 'f': 830a9d8d09cSJung-uk Kim 831eef1b955SJung-uk Kim StringChar = 0x0C; /* FORMFEED */ 832eef1b955SJung-uk Kim break; 833eef1b955SJung-uk Kim 834eef1b955SJung-uk Kim case 'n': 835a9d8d09cSJung-uk Kim 836eef1b955SJung-uk Kim StringChar = 0x0A; /* LINEFEED */ 837eef1b955SJung-uk Kim break; 838eef1b955SJung-uk Kim 839eef1b955SJung-uk Kim case 'r': 840a9d8d09cSJung-uk Kim 841eef1b955SJung-uk Kim StringChar = 0x0D; /* CARRIAGE RETURN*/ 842eef1b955SJung-uk Kim break; 843eef1b955SJung-uk Kim 844eef1b955SJung-uk Kim case 't': 845a9d8d09cSJung-uk Kim 846eef1b955SJung-uk Kim StringChar = 0x09; /* HORIZONTAL TAB */ 847eef1b955SJung-uk Kim break; 848eef1b955SJung-uk Kim 849eef1b955SJung-uk Kim case 'v': 850a9d8d09cSJung-uk Kim 851eef1b955SJung-uk Kim StringChar = 0x0B; /* VERTICAL TAB */ 852eef1b955SJung-uk Kim break; 853eef1b955SJung-uk Kim 854eef1b955SJung-uk Kim case 'x': 855a9d8d09cSJung-uk Kim 856eef1b955SJung-uk Kim State = ASL_HEX_CONSTANT; 857eef1b955SJung-uk Kim i = 0; 858eef1b955SJung-uk Kim continue; 859eef1b955SJung-uk Kim 860eef1b955SJung-uk Kim case '\'': /* Single Quote */ 861eef1b955SJung-uk Kim case '\"': /* Double Quote */ 862eef1b955SJung-uk Kim case '\\': /* Backslash */ 863a9d8d09cSJung-uk Kim 864eef1b955SJung-uk Kim break; 865eef1b955SJung-uk Kim 866eef1b955SJung-uk Kim default: 867eef1b955SJung-uk Kim 868eef1b955SJung-uk Kim /* Check for an octal digit (0-7) */ 869eef1b955SJung-uk Kim 870eef1b955SJung-uk Kim if (ACPI_IS_OCTAL_DIGIT (StringChar)) 871eef1b955SJung-uk Kim { 872eef1b955SJung-uk Kim State = ASL_OCTAL_CONSTANT; 873eef1b955SJung-uk Kim ConvertBuffer[0] = StringChar; 874eef1b955SJung-uk Kim i = 1; 875eef1b955SJung-uk Kim continue; 876eef1b955SJung-uk Kim } 877eef1b955SJung-uk Kim 878eef1b955SJung-uk Kim /* Unknown escape sequence issue warning, but use the character */ 879eef1b955SJung-uk Kim 880eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE, 881eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 882eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 883eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 884eef1b955SJung-uk Kim break; 885eef1b955SJung-uk Kim } 886eef1b955SJung-uk Kim break; 887eef1b955SJung-uk Kim 888eef1b955SJung-uk Kim 889eef1b955SJung-uk Kim case ASL_OCTAL_CONSTANT: 890eef1b955SJung-uk Kim 891eef1b955SJung-uk Kim /* Up to three octal digits allowed */ 892eef1b955SJung-uk Kim 893eef1b955SJung-uk Kim if (!ACPI_IS_OCTAL_DIGIT (StringChar) || 894eef1b955SJung-uk Kim (i > 2)) 895eef1b955SJung-uk Kim { 896eef1b955SJung-uk Kim /* 897eef1b955SJung-uk Kim * Reached end of the constant. Convert the assembled ASCII 898eef1b955SJung-uk Kim * string and resume processing of the next character 899eef1b955SJung-uk Kim */ 900eef1b955SJung-uk Kim ConvertBuffer[i] = 0; 9015ef50723SJung-uk Kim Digit = (UINT8) strtoul (ConvertBuffer, NULL, 8); 902eef1b955SJung-uk Kim 903eef1b955SJung-uk Kim /* Check for NULL or non-ascii character (ignore if so) */ 904eef1b955SJung-uk Kim 905eef1b955SJung-uk Kim if ((Digit == 0) || (Digit > ACPI_ASCII_MAX)) 906eef1b955SJung-uk Kim { 907eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING, 908eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 909eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 910eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 911eef1b955SJung-uk Kim } 912eef1b955SJung-uk Kim else 913eef1b955SJung-uk Kim { 914eef1b955SJung-uk Kim *StringBuffer = (char) Digit; 915eef1b955SJung-uk Kim StringBuffer++; 916eef1b955SJung-uk Kim if (StringBuffer >= EndBuffer) 917eef1b955SJung-uk Kim { 918eef1b955SJung-uk Kim goto BufferOverflow; 919eef1b955SJung-uk Kim } 920eef1b955SJung-uk Kim } 921eef1b955SJung-uk Kim 922eef1b955SJung-uk Kim State = ASL_NORMAL_CHAR; 923eef1b955SJung-uk Kim goto DoCharacter; 924eef1b955SJung-uk Kim break; 925eef1b955SJung-uk Kim } 926eef1b955SJung-uk Kim 927eef1b955SJung-uk Kim /* Append another digit of the constant */ 928eef1b955SJung-uk Kim 929eef1b955SJung-uk Kim ConvertBuffer[i] = StringChar; 930eef1b955SJung-uk Kim i++; 931eef1b955SJung-uk Kim continue; 932eef1b955SJung-uk Kim 933eef1b955SJung-uk Kim case ASL_HEX_CONSTANT: 934eef1b955SJung-uk Kim 935eef1b955SJung-uk Kim /* Up to two hex digits allowed */ 936eef1b955SJung-uk Kim 9375ef50723SJung-uk Kim if (!isxdigit (StringChar) || 938eef1b955SJung-uk Kim (i > 1)) 939eef1b955SJung-uk Kim { 940eef1b955SJung-uk Kim /* 941eef1b955SJung-uk Kim * Reached end of the constant. Convert the assembled ASCII 942eef1b955SJung-uk Kim * string and resume processing of the next character 943eef1b955SJung-uk Kim */ 944eef1b955SJung-uk Kim ConvertBuffer[i] = 0; 9455ef50723SJung-uk Kim Digit = (UINT8) strtoul (ConvertBuffer, NULL, 16); 946eef1b955SJung-uk Kim 947eef1b955SJung-uk Kim /* Check for NULL or non-ascii character (ignore if so) */ 948eef1b955SJung-uk Kim 949eef1b955SJung-uk Kim if ((Digit == 0) || (Digit > ACPI_ASCII_MAX)) 950eef1b955SJung-uk Kim { 951eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING, 952eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 953eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 954eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 955eef1b955SJung-uk Kim } 956eef1b955SJung-uk Kim else 957eef1b955SJung-uk Kim { 958eef1b955SJung-uk Kim *StringBuffer = (char) Digit; 959eef1b955SJung-uk Kim StringBuffer++; 960eef1b955SJung-uk Kim if (StringBuffer >= EndBuffer) 961eef1b955SJung-uk Kim { 962eef1b955SJung-uk Kim goto BufferOverflow; 963eef1b955SJung-uk Kim } 964eef1b955SJung-uk Kim } 965eef1b955SJung-uk Kim 966eef1b955SJung-uk Kim State = ASL_NORMAL_CHAR; 967eef1b955SJung-uk Kim goto DoCharacter; 968eef1b955SJung-uk Kim break; 969eef1b955SJung-uk Kim } 970eef1b955SJung-uk Kim 971eef1b955SJung-uk Kim /* Append another digit of the constant */ 972eef1b955SJung-uk Kim 973eef1b955SJung-uk Kim ConvertBuffer[i] = StringChar; 974eef1b955SJung-uk Kim i++; 975eef1b955SJung-uk Kim continue; 9769c48c75eSJung-uk Kim 9779c48c75eSJung-uk Kim default: 978a9d8d09cSJung-uk Kim 9799c48c75eSJung-uk Kim break; 980eef1b955SJung-uk Kim } 981eef1b955SJung-uk Kim 982eef1b955SJung-uk Kim /* Save the finished character */ 983eef1b955SJung-uk Kim 984eef1b955SJung-uk Kim *StringBuffer = StringChar; 985eef1b955SJung-uk Kim StringBuffer++; 986eef1b955SJung-uk Kim if (StringBuffer >= EndBuffer) 987eef1b955SJung-uk Kim { 988eef1b955SJung-uk Kim goto BufferOverflow; 989eef1b955SJung-uk Kim } 990eef1b955SJung-uk Kim } 991eef1b955SJung-uk Kim 992eef1b955SJung-uk Kim /* 993eef1b955SJung-uk Kim * Premature End-Of-File 994eef1b955SJung-uk Kim */ 995eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF, 996eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 997eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 998eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 999eef1b955SJung-uk Kim return (FALSE); 1000eef1b955SJung-uk Kim 1001eef1b955SJung-uk Kim 1002eef1b955SJung-uk Kim CompletedString: 1003eef1b955SJung-uk Kim /* 1004eef1b955SJung-uk Kim * Null terminate the input string and copy string to a new buffer 1005eef1b955SJung-uk Kim */ 1006eef1b955SJung-uk Kim *StringBuffer = 0; 1007eef1b955SJung-uk Kim 1008313a0c13SJung-uk Kim CleanString = UtStringCacheCalloc (strlen (MsgBuffer) + 1); 1009eef1b955SJung-uk Kim if (!CleanString) 1010eef1b955SJung-uk Kim { 1011eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, 1012eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 1013eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 1014eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 1015eef1b955SJung-uk Kim return (FALSE); 1016eef1b955SJung-uk Kim } 1017eef1b955SJung-uk Kim 10185ef50723SJung-uk Kim strcpy (CleanString, MsgBuffer); 1019eef1b955SJung-uk Kim AslCompilerlval.s = CleanString; 1020eef1b955SJung-uk Kim return (TRUE); 1021eef1b955SJung-uk Kim 1022eef1b955SJung-uk Kim 1023eef1b955SJung-uk Kim BufferOverflow: 1024eef1b955SJung-uk Kim 1025eef1b955SJung-uk Kim /* Literal was too long */ 1026eef1b955SJung-uk Kim 1027eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH, 1028eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 1029eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 1030eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096"); 1031eef1b955SJung-uk Kim return (FALSE); 1032eef1b955SJung-uk Kim } 1033