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 8eef1b955SJung-uk Kim /* 9*f8146b88SJung-uk Kim * Copyright (C) 2000 - 2016, Intel Corp. 10eef1b955SJung-uk Kim * All rights reserved. 11eef1b955SJung-uk Kim * 12eef1b955SJung-uk Kim * Redistribution and use in source and binary forms, with or without 13eef1b955SJung-uk Kim * modification, are permitted provided that the following conditions 14eef1b955SJung-uk Kim * are met: 15eef1b955SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 16eef1b955SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 17eef1b955SJung-uk Kim * without modification. 18eef1b955SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 19eef1b955SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 20eef1b955SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 21eef1b955SJung-uk Kim * including a substantially similar Disclaimer requirement for further 22eef1b955SJung-uk Kim * binary redistribution. 23eef1b955SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 24eef1b955SJung-uk Kim * of any contributors may be used to endorse or promote products derived 25eef1b955SJung-uk Kim * from this software without specific prior written permission. 26eef1b955SJung-uk Kim * 27eef1b955SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 28eef1b955SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 29eef1b955SJung-uk Kim * Software Foundation. 30eef1b955SJung-uk Kim * 31eef1b955SJung-uk Kim * NO WARRANTY 32eef1b955SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33eef1b955SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34eef1b955SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 35eef1b955SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 36eef1b955SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 37eef1b955SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 38eef1b955SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 39eef1b955SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 40eef1b955SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 41eef1b955SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 42eef1b955SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 43eef1b955SJung-uk Kim */ 44eef1b955SJung-uk Kim 45eef1b955SJung-uk Kim /* Configuration */ 46eef1b955SJung-uk Kim 47eef1b955SJung-uk Kim #define ASL_SPACES_PER_TAB 4 48eef1b955SJung-uk Kim 49eef1b955SJung-uk Kim #define ASL_NORMAL_CHAR 0 50eef1b955SJung-uk Kim #define ASL_ESCAPE_SEQUENCE 1 51eef1b955SJung-uk Kim #define ASL_OCTAL_CONSTANT 2 52eef1b955SJung-uk Kim #define ASL_HEX_CONSTANT 3 53eef1b955SJung-uk Kim 54eef1b955SJung-uk Kim 55eef1b955SJung-uk Kim /* File node - used for "Include" operator file stack */ 56eef1b955SJung-uk Kim 57eef1b955SJung-uk Kim typedef struct asl_file_node 58eef1b955SJung-uk Kim { 59eef1b955SJung-uk Kim FILE *File; 60eef1b955SJung-uk Kim UINT32 CurrentLineNumber; 61eef1b955SJung-uk Kim YY_BUFFER_STATE State; 62eef1b955SJung-uk Kim char *Filename; 63eef1b955SJung-uk Kim struct asl_file_node *Next; 64eef1b955SJung-uk Kim 65eef1b955SJung-uk Kim } ASL_FILE_NODE; 66eef1b955SJung-uk Kim 67eef1b955SJung-uk Kim /* File stack for the "Include" operator (NOT #include operator) */ 68eef1b955SJung-uk Kim 69eef1b955SJung-uk Kim ASL_FILE_NODE *Gbl_IncludeFileStack = NULL; 70eef1b955SJung-uk Kim 71eef1b955SJung-uk Kim 721c0e1b6dSJung-uk Kim /******************************************************************************* 731c0e1b6dSJung-uk Kim * 741c0e1b6dSJung-uk Kim * FUNCTION: AslParserCleanup 751c0e1b6dSJung-uk Kim * 761c0e1b6dSJung-uk Kim * Used to delete the current buffer 771c0e1b6dSJung-uk Kim * 781c0e1b6dSJung-uk Kim ******************************************************************************/ 791c0e1b6dSJung-uk Kim 80313a0c13SJung-uk Kim void 81313a0c13SJung-uk Kim AslParserCleanup ( 82313a0c13SJung-uk Kim void) 83313a0c13SJung-uk Kim { 84313a0c13SJung-uk Kim 85313a0c13SJung-uk Kim yy_delete_buffer (YY_CURRENT_BUFFER); 86313a0c13SJung-uk Kim } 87313a0c13SJung-uk Kim 88313a0c13SJung-uk Kim 89eef1b955SJung-uk Kim /******************************************************************************* 90eef1b955SJung-uk Kim * 91eef1b955SJung-uk Kim * FUNCTION: AslDoLineDirective 92eef1b955SJung-uk Kim * 93eef1b955SJung-uk Kim * PARAMETERS: None. Uses input() to access current source code line 94eef1b955SJung-uk Kim * 95eef1b955SJung-uk Kim * RETURN: Updates global line number and filename 96eef1b955SJung-uk Kim * 97eef1b955SJung-uk Kim * DESCRIPTION: Handle #line directives emitted by the preprocessor. 98eef1b955SJung-uk Kim * 99eef1b955SJung-uk Kim * The #line directive is emitted by the preprocesser, and is used to 100eef1b955SJung-uk Kim * pass through line numbers from the original source code file to the 101eef1b955SJung-uk Kim * preprocessor output file (.i). This allows any compiler-generated 102eef1b955SJung-uk Kim * error messages to be displayed with the correct line number. 103eef1b955SJung-uk Kim * 104eef1b955SJung-uk Kim ******************************************************************************/ 105eef1b955SJung-uk Kim 106eef1b955SJung-uk Kim static void 107eef1b955SJung-uk Kim AslDoLineDirective ( 108eef1b955SJung-uk Kim void) 109eef1b955SJung-uk Kim { 110f38b0f21SJung-uk Kim int c; 111eef1b955SJung-uk Kim char *Token; 112eef1b955SJung-uk Kim UINT32 LineNumber; 113eef1b955SJung-uk Kim char *Filename; 114f38b0f21SJung-uk Kim UINT32 i; 115eef1b955SJung-uk Kim 1165ef50723SJung-uk Kim Gbl_HasIncludeFiles = TRUE; 117eef1b955SJung-uk Kim 118eef1b955SJung-uk Kim /* Eat the entire line that contains the #line directive */ 119eef1b955SJung-uk Kim 120f38b0f21SJung-uk Kim Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 121f38b0f21SJung-uk Kim 122f38b0f21SJung-uk Kim while ((c = input()) != '\n' && c != EOF) 123eef1b955SJung-uk Kim { 124f38b0f21SJung-uk Kim *Gbl_LineBufPtr = c; 125f38b0f21SJung-uk Kim Gbl_LineBufPtr++; 126eef1b955SJung-uk Kim } 127f38b0f21SJung-uk Kim *Gbl_LineBufPtr = 0; 128eef1b955SJung-uk Kim 129eef1b955SJung-uk Kim /* First argument is the actual line number */ 130eef1b955SJung-uk Kim 131eef1b955SJung-uk Kim Token = strtok (Gbl_CurrentLineBuffer, " "); 132eef1b955SJung-uk Kim if (!Token) 133eef1b955SJung-uk Kim { 134eef1b955SJung-uk Kim goto ResetAndExit; 135eef1b955SJung-uk Kim } 136eef1b955SJung-uk Kim 137f38b0f21SJung-uk Kim /* First argument is the line number */ 138eef1b955SJung-uk Kim 139eef1b955SJung-uk Kim LineNumber = (UINT32) UtDoConstant (Token); 140f38b0f21SJung-uk Kim 141f38b0f21SJung-uk Kim /* Emit the appropriate number of newlines */ 142f38b0f21SJung-uk Kim 143f38b0f21SJung-uk Kim Gbl_CurrentColumn = 0; 144f38b0f21SJung-uk Kim if (LineNumber > Gbl_CurrentLineNumber) 145f38b0f21SJung-uk Kim { 146f38b0f21SJung-uk Kim for (i = 0; i < (LineNumber - Gbl_CurrentLineNumber); i++) 147f38b0f21SJung-uk Kim { 148f38b0f21SJung-uk Kim FlWriteFile (ASL_FILE_SOURCE_OUTPUT, "\n", 1); 149f38b0f21SJung-uk Kim Gbl_CurrentColumn++; 150f38b0f21SJung-uk Kim } 151f38b0f21SJung-uk Kim } 152f38b0f21SJung-uk Kim 153f38b0f21SJung-uk Kim FlSetLineNumber (LineNumber); 154eef1b955SJung-uk Kim 155eef1b955SJung-uk Kim /* Second argument is the optional filename (in double quotes) */ 156eef1b955SJung-uk Kim 157eef1b955SJung-uk Kim Token = strtok (NULL, " \""); 158eef1b955SJung-uk Kim if (Token) 159eef1b955SJung-uk Kim { 160eef1b955SJung-uk Kim Filename = ACPI_ALLOCATE_ZEROED (strlen (Token) + 1); 161eef1b955SJung-uk Kim strcpy (Filename, Token); 162eef1b955SJung-uk Kim FlSetFilename (Filename); 163eef1b955SJung-uk Kim } 164eef1b955SJung-uk Kim 165eef1b955SJung-uk Kim /* Third argument is not supported at this time */ 166eef1b955SJung-uk Kim 167eef1b955SJung-uk Kim ResetAndExit: 168f38b0f21SJung-uk Kim 169f38b0f21SJung-uk Kim /* Reset globals for a new line */ 170f38b0f21SJung-uk Kim 171f38b0f21SJung-uk Kim Gbl_CurrentLineOffset += Gbl_CurrentColumn; 172f38b0f21SJung-uk Kim Gbl_CurrentColumn = 0; 173f38b0f21SJung-uk Kim Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 174eef1b955SJung-uk Kim } 175eef1b955SJung-uk Kim 176eef1b955SJung-uk Kim 177eef1b955SJung-uk Kim /******************************************************************************* 178eef1b955SJung-uk Kim * 179eef1b955SJung-uk Kim * FUNCTION: AslPopInputFileStack 180eef1b955SJung-uk Kim * 181eef1b955SJung-uk Kim * PARAMETERS: None 182eef1b955SJung-uk Kim * 183eef1b955SJung-uk Kim * RETURN: 0 if a node was popped, -1 otherwise 184eef1b955SJung-uk Kim * 185eef1b955SJung-uk Kim * DESCRIPTION: Pop the top of the input file stack and point the parser to 186eef1b955SJung-uk Kim * the saved parse buffer contained in the fnode. Also, set the 187eef1b955SJung-uk Kim * global line counters to the saved values. This function is 188eef1b955SJung-uk Kim * called when an include file reaches EOF. 189eef1b955SJung-uk Kim * 190eef1b955SJung-uk Kim ******************************************************************************/ 191eef1b955SJung-uk Kim 192eef1b955SJung-uk Kim int 193eef1b955SJung-uk Kim AslPopInputFileStack ( 194eef1b955SJung-uk Kim void) 195eef1b955SJung-uk Kim { 196eef1b955SJung-uk Kim ASL_FILE_NODE *Fnode; 197eef1b955SJung-uk Kim 198eef1b955SJung-uk Kim 199*f8146b88SJung-uk Kim Gbl_PreviousIncludeFilename = Gbl_Files[ASL_FILE_INPUT].Filename; 200eef1b955SJung-uk Kim Fnode = Gbl_IncludeFileStack; 2011c0e1b6dSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 202*f8146b88SJung-uk Kim "\nPop InputFile Stack, Fnode %p\n", Fnode); 203*f8146b88SJung-uk Kim 204*f8146b88SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 205*f8146b88SJung-uk Kim "Include: Closing \"%s\"\n\n", Gbl_Files[ASL_FILE_INPUT].Filename); 206eef1b955SJung-uk Kim 207eef1b955SJung-uk Kim if (!Fnode) 208eef1b955SJung-uk Kim { 209eef1b955SJung-uk Kim return (-1); 210eef1b955SJung-uk Kim } 211eef1b955SJung-uk Kim 212eef1b955SJung-uk Kim /* Close the current include file */ 213eef1b955SJung-uk Kim 214eef1b955SJung-uk Kim fclose (yyin); 215eef1b955SJung-uk Kim 216eef1b955SJung-uk Kim /* Update the top-of-stack */ 217eef1b955SJung-uk Kim 218eef1b955SJung-uk Kim Gbl_IncludeFileStack = Fnode->Next; 219eef1b955SJung-uk Kim 220eef1b955SJung-uk Kim /* Reset global line counter and filename */ 221eef1b955SJung-uk Kim 222eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename; 223eef1b955SJung-uk Kim Gbl_CurrentLineNumber = Fnode->CurrentLineNumber; 224eef1b955SJung-uk Kim 225eef1b955SJung-uk Kim /* Point the parser to the popped file */ 226eef1b955SJung-uk Kim 227eef1b955SJung-uk Kim yy_delete_buffer (YY_CURRENT_BUFFER); 228eef1b955SJung-uk Kim yy_switch_to_buffer (Fnode->State); 229eef1b955SJung-uk Kim 230eef1b955SJung-uk Kim /* All done with this node */ 231eef1b955SJung-uk Kim 232eef1b955SJung-uk Kim ACPI_FREE (Fnode); 233eef1b955SJung-uk Kim return (0); 234eef1b955SJung-uk Kim } 235eef1b955SJung-uk Kim 236eef1b955SJung-uk Kim 237eef1b955SJung-uk Kim /******************************************************************************* 238eef1b955SJung-uk Kim * 239eef1b955SJung-uk Kim * FUNCTION: AslPushInputFileStack 240eef1b955SJung-uk Kim * 241eef1b955SJung-uk Kim * PARAMETERS: InputFile - Open file pointer 242eef1b955SJung-uk Kim * Filename - Name of the file 243eef1b955SJung-uk Kim * 244eef1b955SJung-uk Kim * RETURN: None 245eef1b955SJung-uk Kim * 246eef1b955SJung-uk Kim * DESCRIPTION: Push the InputFile onto the file stack, and point the parser 247eef1b955SJung-uk Kim * to this file. Called when an include file is successfully 248eef1b955SJung-uk Kim * opened. 249eef1b955SJung-uk Kim * 250eef1b955SJung-uk Kim ******************************************************************************/ 251eef1b955SJung-uk Kim 252eef1b955SJung-uk Kim void 253eef1b955SJung-uk Kim AslPushInputFileStack ( 254eef1b955SJung-uk Kim FILE *InputFile, 255eef1b955SJung-uk Kim char *Filename) 256eef1b955SJung-uk Kim { 257eef1b955SJung-uk Kim ASL_FILE_NODE *Fnode; 258eef1b955SJung-uk Kim YY_BUFFER_STATE State; 259eef1b955SJung-uk Kim 260eef1b955SJung-uk Kim 261eef1b955SJung-uk Kim /* Save the current state in an Fnode */ 262eef1b955SJung-uk Kim 263eef1b955SJung-uk Kim Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE)); 264eef1b955SJung-uk Kim 265eef1b955SJung-uk Kim Fnode->File = yyin; 266eef1b955SJung-uk Kim Fnode->Next = Gbl_IncludeFileStack; 267eef1b955SJung-uk Kim Fnode->State = YY_CURRENT_BUFFER; 268eef1b955SJung-uk Kim Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename; 2691c0e1b6dSJung-uk Kim Fnode->CurrentLineNumber = Gbl_CurrentLineNumber; 270eef1b955SJung-uk Kim 271eef1b955SJung-uk Kim /* Push it on the stack */ 272eef1b955SJung-uk Kim 273eef1b955SJung-uk Kim Gbl_IncludeFileStack = Fnode; 274eef1b955SJung-uk Kim 275eef1b955SJung-uk Kim /* Point the parser to this file */ 276eef1b955SJung-uk Kim 277eef1b955SJung-uk Kim State = yy_create_buffer (InputFile, YY_BUF_SIZE); 278eef1b955SJung-uk Kim yy_switch_to_buffer (State); 279eef1b955SJung-uk Kim 2801c0e1b6dSJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, 2811c0e1b6dSJung-uk Kim "\nPush InputFile Stack, returning %p\n\n", InputFile); 282eef1b955SJung-uk Kim 283eef1b955SJung-uk Kim /* Reset the global line count and filename */ 284eef1b955SJung-uk Kim 285313a0c13SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename = 286313a0c13SJung-uk Kim UtStringCacheCalloc (strlen (Filename) + 1); 287313a0c13SJung-uk Kim 288313a0c13SJung-uk Kim strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename); 289313a0c13SJung-uk Kim 290eef1b955SJung-uk Kim Gbl_CurrentLineNumber = 1; 291eef1b955SJung-uk Kim yyin = InputFile; 292eef1b955SJung-uk Kim } 293eef1b955SJung-uk Kim 294eef1b955SJung-uk Kim 295eef1b955SJung-uk Kim /******************************************************************************* 296eef1b955SJung-uk Kim * 297eef1b955SJung-uk Kim * FUNCTION: AslResetCurrentLineBuffer 298eef1b955SJung-uk Kim * 299eef1b955SJung-uk Kim * PARAMETERS: None 300eef1b955SJung-uk Kim * 301eef1b955SJung-uk Kim * RETURN: None 302eef1b955SJung-uk Kim * 303eef1b955SJung-uk Kim * DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers. 304eef1b955SJung-uk Kim * 305eef1b955SJung-uk Kim ******************************************************************************/ 306eef1b955SJung-uk Kim 307eef1b955SJung-uk Kim void 308eef1b955SJung-uk Kim AslResetCurrentLineBuffer ( 309eef1b955SJung-uk Kim void) 310eef1b955SJung-uk Kim { 311eef1b955SJung-uk Kim 312eef1b955SJung-uk Kim if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle) 313eef1b955SJung-uk Kim { 314eef1b955SJung-uk Kim FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer, 315eef1b955SJung-uk Kim Gbl_LineBufPtr - Gbl_CurrentLineBuffer); 316eef1b955SJung-uk Kim } 317eef1b955SJung-uk Kim 318eef1b955SJung-uk Kim Gbl_CurrentLineOffset += Gbl_CurrentColumn; 319eef1b955SJung-uk Kim Gbl_CurrentColumn = 0; 320eef1b955SJung-uk Kim 321eef1b955SJung-uk Kim Gbl_CurrentLineNumber++; 322eef1b955SJung-uk Kim Gbl_LogicalLineNumber++; 323eef1b955SJung-uk Kim Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 324eef1b955SJung-uk Kim } 325eef1b955SJung-uk Kim 326eef1b955SJung-uk Kim 327eef1b955SJung-uk Kim /******************************************************************************* 328eef1b955SJung-uk Kim * 329eef1b955SJung-uk Kim * FUNCTION: AslInsertLineBuffer 330eef1b955SJung-uk Kim * 331eef1b955SJung-uk Kim * PARAMETERS: SourceChar - One char from the input ASL source file 332eef1b955SJung-uk Kim * 333eef1b955SJung-uk Kim * RETURN: None 334eef1b955SJung-uk Kim * 335eef1b955SJung-uk Kim * DESCRIPTION: Put one character of the source file into the temp line buffer 336eef1b955SJung-uk Kim * 337eef1b955SJung-uk Kim ******************************************************************************/ 338eef1b955SJung-uk Kim 339eef1b955SJung-uk Kim void 340eef1b955SJung-uk Kim AslInsertLineBuffer ( 341eef1b955SJung-uk Kim int SourceChar) 342eef1b955SJung-uk Kim { 343eef1b955SJung-uk Kim UINT32 i; 344eef1b955SJung-uk Kim UINT32 Count = 1; 345eef1b955SJung-uk Kim 346eef1b955SJung-uk Kim 347eef1b955SJung-uk Kim if (SourceChar == EOF) 348eef1b955SJung-uk Kim { 349eef1b955SJung-uk Kim return; 350eef1b955SJung-uk Kim } 351eef1b955SJung-uk Kim 352eef1b955SJung-uk Kim Gbl_InputByteCount++; 353eef1b955SJung-uk Kim 354eef1b955SJung-uk Kim /* Handle tabs. Convert to spaces */ 355eef1b955SJung-uk Kim 356eef1b955SJung-uk Kim if (SourceChar == '\t') 357eef1b955SJung-uk Kim { 358eef1b955SJung-uk Kim SourceChar = ' '; 359eef1b955SJung-uk Kim Count = ASL_SPACES_PER_TAB - 360eef1b955SJung-uk Kim (Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1)); 361eef1b955SJung-uk Kim } 362eef1b955SJung-uk Kim 363eef1b955SJung-uk Kim for (i = 0; i < Count; i++) 364eef1b955SJung-uk Kim { 365eef1b955SJung-uk Kim Gbl_CurrentColumn++; 366eef1b955SJung-uk Kim 367eef1b955SJung-uk Kim /* Insert the character into the line buffer */ 368eef1b955SJung-uk Kim 369eef1b955SJung-uk Kim *Gbl_LineBufPtr = (UINT8) SourceChar; 370eef1b955SJung-uk Kim Gbl_LineBufPtr++; 371eef1b955SJung-uk Kim 3721c0e1b6dSJung-uk Kim if (Gbl_LineBufPtr > 3731c0e1b6dSJung-uk Kim (Gbl_CurrentLineBuffer + (Gbl_LineBufferSize - 1))) 374eef1b955SJung-uk Kim { 375eef1b955SJung-uk Kim #if 0 376eef1b955SJung-uk Kim /* 377eef1b955SJung-uk Kim * Warning if we have split a long source line. 378eef1b955SJung-uk Kim * <Probably overkill> 379eef1b955SJung-uk Kim */ 380042ff955SJung-uk Kim sprintf (MsgBuffer, "Max %u", Gbl_LineBufferSize); 381eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE, 382eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 383eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 384eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer); 385eef1b955SJung-uk Kim #endif 386eef1b955SJung-uk Kim 387eef1b955SJung-uk Kim AslResetCurrentLineBuffer (); 388eef1b955SJung-uk Kim } 389eef1b955SJung-uk Kim else if (SourceChar == '\n') 390eef1b955SJung-uk Kim { 391eef1b955SJung-uk Kim /* End of line */ 392eef1b955SJung-uk Kim 393eef1b955SJung-uk Kim AslResetCurrentLineBuffer (); 394eef1b955SJung-uk Kim } 395eef1b955SJung-uk Kim } 396eef1b955SJung-uk Kim } 397eef1b955SJung-uk Kim 398eef1b955SJung-uk Kim 399eef1b955SJung-uk Kim /******************************************************************************* 400eef1b955SJung-uk Kim * 401eef1b955SJung-uk Kim * FUNCTION: count 402eef1b955SJung-uk Kim * 403eef1b955SJung-uk Kim * PARAMETERS: yytext - Contains the matched keyword. 404eef1b955SJung-uk Kim * Type - Keyword/Character type: 405eef1b955SJung-uk Kim * 0 = anything except a keyword 406eef1b955SJung-uk Kim * 1 = pseudo-keywords 407eef1b955SJung-uk Kim * 2 = non-executable ASL keywords 408eef1b955SJung-uk Kim * 3 = executable ASL keywords 409eef1b955SJung-uk Kim * 410eef1b955SJung-uk Kim * RETURN: None 411eef1b955SJung-uk Kim * 412eef1b955SJung-uk Kim * DESCRIPTION: Count keywords and put them into the line buffer 413eef1b955SJung-uk Kim * 414eef1b955SJung-uk Kim ******************************************************************************/ 415eef1b955SJung-uk Kim 416eef1b955SJung-uk Kim static void 417eef1b955SJung-uk Kim count ( 418eef1b955SJung-uk Kim int Type) 419eef1b955SJung-uk Kim { 420eef1b955SJung-uk Kim int i; 421eef1b955SJung-uk Kim 422eef1b955SJung-uk Kim 423eef1b955SJung-uk Kim switch (Type) 424eef1b955SJung-uk Kim { 425eef1b955SJung-uk Kim case 2: 426a9d8d09cSJung-uk Kim 427eef1b955SJung-uk Kim TotalKeywords++; 428eef1b955SJung-uk Kim TotalNamedObjects++; 429eef1b955SJung-uk Kim break; 430eef1b955SJung-uk Kim 431eef1b955SJung-uk Kim case 3: 432a9d8d09cSJung-uk Kim 433eef1b955SJung-uk Kim TotalKeywords++; 434eef1b955SJung-uk Kim TotalExecutableOpcodes++; 435eef1b955SJung-uk Kim break; 4369c48c75eSJung-uk Kim 4379c48c75eSJung-uk Kim default: 438a9d8d09cSJung-uk Kim 4399c48c75eSJung-uk Kim break; 440eef1b955SJung-uk Kim } 441eef1b955SJung-uk Kim 442eef1b955SJung-uk Kim for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++) 443eef1b955SJung-uk Kim { 444eef1b955SJung-uk Kim AslInsertLineBuffer (yytext[i]); 445eef1b955SJung-uk Kim *Gbl_LineBufPtr = 0; 446eef1b955SJung-uk Kim } 447eef1b955SJung-uk Kim } 448eef1b955SJung-uk Kim 449eef1b955SJung-uk Kim 450eef1b955SJung-uk Kim /******************************************************************************* 451eef1b955SJung-uk Kim * 452eef1b955SJung-uk Kim * FUNCTION: AslDoComment 453eef1b955SJung-uk Kim * 454eef1b955SJung-uk Kim * PARAMETERS: none 455eef1b955SJung-uk Kim * 456eef1b955SJung-uk Kim * RETURN: none 457eef1b955SJung-uk Kim * 458eef1b955SJung-uk Kim * DESCRIPTION: Process a standard comment. 459eef1b955SJung-uk Kim * 460eef1b955SJung-uk Kim ******************************************************************************/ 461eef1b955SJung-uk Kim 462eef1b955SJung-uk Kim static char 463eef1b955SJung-uk Kim AslDoComment ( 464eef1b955SJung-uk Kim void) 465eef1b955SJung-uk Kim { 466f38b0f21SJung-uk Kim int c; 467f38b0f21SJung-uk Kim int c1 = 0; 468eef1b955SJung-uk Kim 469eef1b955SJung-uk Kim 470eef1b955SJung-uk Kim AslInsertLineBuffer ('/'); 471eef1b955SJung-uk Kim AslInsertLineBuffer ('*'); 472eef1b955SJung-uk Kim 473eef1b955SJung-uk Kim loop: 474eef1b955SJung-uk Kim 475eef1b955SJung-uk Kim /* Eat chars until end-of-comment */ 476eef1b955SJung-uk Kim 4771c0e1b6dSJung-uk Kim while (((c = input ()) != '*') && (c != EOF)) 478eef1b955SJung-uk Kim { 479eef1b955SJung-uk Kim AslInsertLineBuffer (c); 480eef1b955SJung-uk Kim c1 = c; 481eef1b955SJung-uk Kim } 482eef1b955SJung-uk Kim 483eef1b955SJung-uk Kim if (c == EOF) 484eef1b955SJung-uk Kim { 485eef1b955SJung-uk Kim goto EarlyEOF; 486eef1b955SJung-uk Kim } 487eef1b955SJung-uk Kim 488eef1b955SJung-uk Kim /* 489eef1b955SJung-uk Kim * Check for nested comment -- can help catch cases where a previous 490eef1b955SJung-uk Kim * comment was accidently left unterminated 491eef1b955SJung-uk Kim */ 492eef1b955SJung-uk Kim if ((c1 == '/') && (c == '*')) 493eef1b955SJung-uk Kim { 494eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT, 495eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 496eef1b955SJung-uk Kim Gbl_InputByteCount, Gbl_CurrentColumn, 497eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 498eef1b955SJung-uk Kim } 499eef1b955SJung-uk Kim 500eef1b955SJung-uk Kim /* Comment is closed only if the NEXT character is a slash */ 501eef1b955SJung-uk Kim 502eef1b955SJung-uk Kim AslInsertLineBuffer (c); 503eef1b955SJung-uk Kim 5041c0e1b6dSJung-uk Kim if (((c1 = input ()) != '/') && (c1 != EOF)) 505eef1b955SJung-uk Kim { 506eef1b955SJung-uk Kim unput(c1); 507eef1b955SJung-uk Kim goto loop; 508eef1b955SJung-uk Kim } 509eef1b955SJung-uk Kim 510eef1b955SJung-uk Kim if (c1 == EOF) 511eef1b955SJung-uk Kim { 512eef1b955SJung-uk Kim goto EarlyEOF; 513eef1b955SJung-uk Kim } 514eef1b955SJung-uk Kim 515eef1b955SJung-uk Kim AslInsertLineBuffer (c1); 516eef1b955SJung-uk Kim return (TRUE); 517eef1b955SJung-uk Kim 518eef1b955SJung-uk Kim 519eef1b955SJung-uk Kim EarlyEOF: 520eef1b955SJung-uk Kim /* 521eef1b955SJung-uk Kim * Premature End-Of-File 522eef1b955SJung-uk Kim */ 523eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF, 524eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 525eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 526eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 527eef1b955SJung-uk Kim return (FALSE); 528eef1b955SJung-uk Kim } 529eef1b955SJung-uk Kim 530eef1b955SJung-uk Kim 531eef1b955SJung-uk Kim /******************************************************************************* 532eef1b955SJung-uk Kim * 533eef1b955SJung-uk Kim * FUNCTION: AslDoCommentType2 534eef1b955SJung-uk Kim * 535eef1b955SJung-uk Kim * PARAMETERS: none 536eef1b955SJung-uk Kim * 537eef1b955SJung-uk Kim * RETURN: none 538eef1b955SJung-uk Kim * 539eef1b955SJung-uk Kim * DESCRIPTION: Process a new "//" comment. 540eef1b955SJung-uk Kim * 541eef1b955SJung-uk Kim ******************************************************************************/ 542eef1b955SJung-uk Kim 543eef1b955SJung-uk Kim static char 544eef1b955SJung-uk Kim AslDoCommentType2 ( 545eef1b955SJung-uk Kim void) 546eef1b955SJung-uk Kim { 547f38b0f21SJung-uk Kim int c; 548eef1b955SJung-uk Kim 549eef1b955SJung-uk Kim 550eef1b955SJung-uk Kim AslInsertLineBuffer ('/'); 551eef1b955SJung-uk Kim AslInsertLineBuffer ('/'); 552eef1b955SJung-uk Kim 5531c0e1b6dSJung-uk Kim while (((c = input ()) != '\n') && (c != EOF)) 554eef1b955SJung-uk Kim { 555eef1b955SJung-uk Kim AslInsertLineBuffer (c); 556eef1b955SJung-uk Kim } 557eef1b955SJung-uk Kim 558eef1b955SJung-uk Kim if (c == EOF) 559eef1b955SJung-uk Kim { 560eef1b955SJung-uk Kim /* End of file is OK, change to newline. Let parser detect EOF later */ 561eef1b955SJung-uk Kim 562eef1b955SJung-uk Kim c = '\n'; 563eef1b955SJung-uk Kim } 564eef1b955SJung-uk Kim 565eef1b955SJung-uk Kim AslInsertLineBuffer (c); 566eef1b955SJung-uk Kim return (TRUE); 567eef1b955SJung-uk Kim } 568eef1b955SJung-uk Kim 569eef1b955SJung-uk Kim 570eef1b955SJung-uk Kim /******************************************************************************* 571eef1b955SJung-uk Kim * 572eef1b955SJung-uk Kim * FUNCTION: AslDoStringLiteral 573eef1b955SJung-uk Kim * 574eef1b955SJung-uk Kim * PARAMETERS: none 575eef1b955SJung-uk Kim * 576eef1b955SJung-uk Kim * RETURN: none 577eef1b955SJung-uk Kim * 578eef1b955SJung-uk Kim * DESCRIPTION: Process a string literal (surrounded by quotes) 579eef1b955SJung-uk Kim * 580eef1b955SJung-uk Kim ******************************************************************************/ 581eef1b955SJung-uk Kim 582eef1b955SJung-uk Kim static char 583eef1b955SJung-uk Kim AslDoStringLiteral ( 584eef1b955SJung-uk Kim void) 585eef1b955SJung-uk Kim { 586eef1b955SJung-uk Kim char *StringBuffer = MsgBuffer; 587eef1b955SJung-uk Kim char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE; 588eef1b955SJung-uk Kim char *CleanString; 589f38b0f21SJung-uk Kim int StringChar; 590eef1b955SJung-uk Kim UINT32 State = ASL_NORMAL_CHAR; 591eef1b955SJung-uk Kim UINT32 i = 0; 592eef1b955SJung-uk Kim UINT8 Digit; 593eef1b955SJung-uk Kim char ConvertBuffer[4]; 594eef1b955SJung-uk Kim 595eef1b955SJung-uk Kim 596eef1b955SJung-uk Kim /* 597eef1b955SJung-uk Kim * Eat chars until end-of-literal. 598eef1b955SJung-uk Kim * NOTE: Put back the original surrounding quotes into the 599eef1b955SJung-uk Kim * source line buffer. 600eef1b955SJung-uk Kim */ 601eef1b955SJung-uk Kim AslInsertLineBuffer ('\"'); 602f38b0f21SJung-uk Kim while ((StringChar = input()) != EOF) 603eef1b955SJung-uk Kim { 604eef1b955SJung-uk Kim AslInsertLineBuffer (StringChar); 605eef1b955SJung-uk Kim 606eef1b955SJung-uk Kim DoCharacter: 607eef1b955SJung-uk Kim switch (State) 608eef1b955SJung-uk Kim { 609eef1b955SJung-uk Kim case ASL_NORMAL_CHAR: 610eef1b955SJung-uk Kim 611eef1b955SJung-uk Kim switch (StringChar) 612eef1b955SJung-uk Kim { 613eef1b955SJung-uk Kim case '\\': 614eef1b955SJung-uk Kim /* 615eef1b955SJung-uk Kim * Special handling for backslash-escape sequence. We will 616eef1b955SJung-uk Kim * toss the backslash and translate the escape char(s). 617eef1b955SJung-uk Kim */ 618eef1b955SJung-uk Kim State = ASL_ESCAPE_SEQUENCE; 619eef1b955SJung-uk Kim continue; 620eef1b955SJung-uk Kim 621eef1b955SJung-uk Kim case '\"': 622eef1b955SJung-uk Kim 623eef1b955SJung-uk Kim /* String terminator */ 624eef1b955SJung-uk Kim 625eef1b955SJung-uk Kim goto CompletedString; 6269c48c75eSJung-uk Kim 6279c48c75eSJung-uk Kim default: 628a9d8d09cSJung-uk Kim 6299c48c75eSJung-uk Kim break; 630eef1b955SJung-uk Kim } 631eef1b955SJung-uk Kim break; 632eef1b955SJung-uk Kim 633eef1b955SJung-uk Kim 634eef1b955SJung-uk Kim case ASL_ESCAPE_SEQUENCE: 635eef1b955SJung-uk Kim 636eef1b955SJung-uk Kim State = ASL_NORMAL_CHAR; 637eef1b955SJung-uk Kim switch (StringChar) 638eef1b955SJung-uk Kim { 639eef1b955SJung-uk Kim case 'a': 640a9d8d09cSJung-uk Kim 641eef1b955SJung-uk Kim StringChar = 0x07; /* BELL */ 642eef1b955SJung-uk Kim break; 643eef1b955SJung-uk Kim 644eef1b955SJung-uk Kim case 'b': 645a9d8d09cSJung-uk Kim 646eef1b955SJung-uk Kim StringChar = 0x08; /* BACKSPACE */ 647eef1b955SJung-uk Kim break; 648eef1b955SJung-uk Kim 649eef1b955SJung-uk Kim case 'f': 650a9d8d09cSJung-uk Kim 651eef1b955SJung-uk Kim StringChar = 0x0C; /* FORMFEED */ 652eef1b955SJung-uk Kim break; 653eef1b955SJung-uk Kim 654eef1b955SJung-uk Kim case 'n': 655a9d8d09cSJung-uk Kim 656eef1b955SJung-uk Kim StringChar = 0x0A; /* LINEFEED */ 657eef1b955SJung-uk Kim break; 658eef1b955SJung-uk Kim 659eef1b955SJung-uk Kim case 'r': 660a9d8d09cSJung-uk Kim 661eef1b955SJung-uk Kim StringChar = 0x0D; /* CARRIAGE RETURN*/ 662eef1b955SJung-uk Kim break; 663eef1b955SJung-uk Kim 664eef1b955SJung-uk Kim case 't': 665a9d8d09cSJung-uk Kim 666eef1b955SJung-uk Kim StringChar = 0x09; /* HORIZONTAL TAB */ 667eef1b955SJung-uk Kim break; 668eef1b955SJung-uk Kim 669eef1b955SJung-uk Kim case 'v': 670a9d8d09cSJung-uk Kim 671eef1b955SJung-uk Kim StringChar = 0x0B; /* VERTICAL TAB */ 672eef1b955SJung-uk Kim break; 673eef1b955SJung-uk Kim 674eef1b955SJung-uk Kim case 'x': 675a9d8d09cSJung-uk Kim 676eef1b955SJung-uk Kim State = ASL_HEX_CONSTANT; 677eef1b955SJung-uk Kim i = 0; 678eef1b955SJung-uk Kim continue; 679eef1b955SJung-uk Kim 680eef1b955SJung-uk Kim case '\'': /* Single Quote */ 681eef1b955SJung-uk Kim case '\"': /* Double Quote */ 682eef1b955SJung-uk Kim case '\\': /* Backslash */ 683a9d8d09cSJung-uk Kim 684eef1b955SJung-uk Kim break; 685eef1b955SJung-uk Kim 686eef1b955SJung-uk Kim default: 687eef1b955SJung-uk Kim 688eef1b955SJung-uk Kim /* Check for an octal digit (0-7) */ 689eef1b955SJung-uk Kim 690eef1b955SJung-uk Kim if (ACPI_IS_OCTAL_DIGIT (StringChar)) 691eef1b955SJung-uk Kim { 692eef1b955SJung-uk Kim State = ASL_OCTAL_CONSTANT; 693eef1b955SJung-uk Kim ConvertBuffer[0] = StringChar; 694eef1b955SJung-uk Kim i = 1; 695eef1b955SJung-uk Kim continue; 696eef1b955SJung-uk Kim } 697eef1b955SJung-uk Kim 698eef1b955SJung-uk Kim /* Unknown escape sequence issue warning, but use the character */ 699eef1b955SJung-uk Kim 700eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE, 701eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 702eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 703eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 704eef1b955SJung-uk Kim break; 705eef1b955SJung-uk Kim } 706eef1b955SJung-uk Kim break; 707eef1b955SJung-uk Kim 708eef1b955SJung-uk Kim 709eef1b955SJung-uk Kim case ASL_OCTAL_CONSTANT: 710eef1b955SJung-uk Kim 711eef1b955SJung-uk Kim /* Up to three octal digits allowed */ 712eef1b955SJung-uk Kim 713eef1b955SJung-uk Kim if (!ACPI_IS_OCTAL_DIGIT (StringChar) || 714eef1b955SJung-uk Kim (i > 2)) 715eef1b955SJung-uk Kim { 716eef1b955SJung-uk Kim /* 717eef1b955SJung-uk Kim * Reached end of the constant. Convert the assembled ASCII 718eef1b955SJung-uk Kim * string and resume processing of the next character 719eef1b955SJung-uk Kim */ 720eef1b955SJung-uk Kim ConvertBuffer[i] = 0; 7215ef50723SJung-uk Kim Digit = (UINT8) strtoul (ConvertBuffer, NULL, 8); 722eef1b955SJung-uk Kim 723eef1b955SJung-uk Kim /* Check for NULL or non-ascii character (ignore if so) */ 724eef1b955SJung-uk Kim 725eef1b955SJung-uk Kim if ((Digit == 0) || (Digit > ACPI_ASCII_MAX)) 726eef1b955SJung-uk Kim { 727eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING, 728eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 729eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 730eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 731eef1b955SJung-uk Kim } 732eef1b955SJung-uk Kim else 733eef1b955SJung-uk Kim { 734eef1b955SJung-uk Kim *StringBuffer = (char) Digit; 735eef1b955SJung-uk Kim StringBuffer++; 736eef1b955SJung-uk Kim if (StringBuffer >= EndBuffer) 737eef1b955SJung-uk Kim { 738eef1b955SJung-uk Kim goto BufferOverflow; 739eef1b955SJung-uk Kim } 740eef1b955SJung-uk Kim } 741eef1b955SJung-uk Kim 742eef1b955SJung-uk Kim State = ASL_NORMAL_CHAR; 743eef1b955SJung-uk Kim goto DoCharacter; 744eef1b955SJung-uk Kim break; 745eef1b955SJung-uk Kim } 746eef1b955SJung-uk Kim 747eef1b955SJung-uk Kim /* Append another digit of the constant */ 748eef1b955SJung-uk Kim 749eef1b955SJung-uk Kim ConvertBuffer[i] = StringChar; 750eef1b955SJung-uk Kim i++; 751eef1b955SJung-uk Kim continue; 752eef1b955SJung-uk Kim 753eef1b955SJung-uk Kim case ASL_HEX_CONSTANT: 754eef1b955SJung-uk Kim 755eef1b955SJung-uk Kim /* Up to two hex digits allowed */ 756eef1b955SJung-uk Kim 7575ef50723SJung-uk Kim if (!isxdigit (StringChar) || 758eef1b955SJung-uk Kim (i > 1)) 759eef1b955SJung-uk Kim { 760eef1b955SJung-uk Kim /* 761eef1b955SJung-uk Kim * Reached end of the constant. Convert the assembled ASCII 762eef1b955SJung-uk Kim * string and resume processing of the next character 763eef1b955SJung-uk Kim */ 764eef1b955SJung-uk Kim ConvertBuffer[i] = 0; 7655ef50723SJung-uk Kim Digit = (UINT8) strtoul (ConvertBuffer, NULL, 16); 766eef1b955SJung-uk Kim 767eef1b955SJung-uk Kim /* Check for NULL or non-ascii character (ignore if so) */ 768eef1b955SJung-uk Kim 769eef1b955SJung-uk Kim if ((Digit == 0) || (Digit > ACPI_ASCII_MAX)) 770eef1b955SJung-uk Kim { 771eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING, 772eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 773eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 774eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 775eef1b955SJung-uk Kim } 776eef1b955SJung-uk Kim else 777eef1b955SJung-uk Kim { 778eef1b955SJung-uk Kim *StringBuffer = (char) Digit; 779eef1b955SJung-uk Kim StringBuffer++; 780eef1b955SJung-uk Kim if (StringBuffer >= EndBuffer) 781eef1b955SJung-uk Kim { 782eef1b955SJung-uk Kim goto BufferOverflow; 783eef1b955SJung-uk Kim } 784eef1b955SJung-uk Kim } 785eef1b955SJung-uk Kim 786eef1b955SJung-uk Kim State = ASL_NORMAL_CHAR; 787eef1b955SJung-uk Kim goto DoCharacter; 788eef1b955SJung-uk Kim break; 789eef1b955SJung-uk Kim } 790eef1b955SJung-uk Kim 791eef1b955SJung-uk Kim /* Append another digit of the constant */ 792eef1b955SJung-uk Kim 793eef1b955SJung-uk Kim ConvertBuffer[i] = StringChar; 794eef1b955SJung-uk Kim i++; 795eef1b955SJung-uk Kim continue; 7969c48c75eSJung-uk Kim 7979c48c75eSJung-uk Kim default: 798a9d8d09cSJung-uk Kim 7999c48c75eSJung-uk Kim break; 800eef1b955SJung-uk Kim } 801eef1b955SJung-uk Kim 802eef1b955SJung-uk Kim /* Save the finished character */ 803eef1b955SJung-uk Kim 804eef1b955SJung-uk Kim *StringBuffer = StringChar; 805eef1b955SJung-uk Kim StringBuffer++; 806eef1b955SJung-uk Kim if (StringBuffer >= EndBuffer) 807eef1b955SJung-uk Kim { 808eef1b955SJung-uk Kim goto BufferOverflow; 809eef1b955SJung-uk Kim } 810eef1b955SJung-uk Kim } 811eef1b955SJung-uk Kim 812eef1b955SJung-uk Kim /* 813eef1b955SJung-uk Kim * Premature End-Of-File 814eef1b955SJung-uk Kim */ 815eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF, 816eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 817eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 818eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 819eef1b955SJung-uk Kim return (FALSE); 820eef1b955SJung-uk Kim 821eef1b955SJung-uk Kim 822eef1b955SJung-uk Kim CompletedString: 823eef1b955SJung-uk Kim /* 824eef1b955SJung-uk Kim * Null terminate the input string and copy string to a new buffer 825eef1b955SJung-uk Kim */ 826eef1b955SJung-uk Kim *StringBuffer = 0; 827eef1b955SJung-uk Kim 828313a0c13SJung-uk Kim CleanString = UtStringCacheCalloc (strlen (MsgBuffer) + 1); 829eef1b955SJung-uk Kim if (!CleanString) 830eef1b955SJung-uk Kim { 831eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, 832eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 833eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 834eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 835eef1b955SJung-uk Kim return (FALSE); 836eef1b955SJung-uk Kim } 837eef1b955SJung-uk Kim 8385ef50723SJung-uk Kim strcpy (CleanString, MsgBuffer); 839eef1b955SJung-uk Kim AslCompilerlval.s = CleanString; 840eef1b955SJung-uk Kim return (TRUE); 841eef1b955SJung-uk Kim 842eef1b955SJung-uk Kim 843eef1b955SJung-uk Kim BufferOverflow: 844eef1b955SJung-uk Kim 845eef1b955SJung-uk Kim /* Literal was too long */ 846eef1b955SJung-uk Kim 847eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH, 848eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 849eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 850eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096"); 851eef1b955SJung-uk Kim return (FALSE); 852eef1b955SJung-uk Kim } 853