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*313a0c13SJung-uk Kim * Copyright (C) 2000 - 2014, 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 72*313a0c13SJung-uk Kim void 73*313a0c13SJung-uk Kim AslParserCleanup ( 74*313a0c13SJung-uk Kim void) 75*313a0c13SJung-uk Kim { 76*313a0c13SJung-uk Kim 77*313a0c13SJung-uk Kim yy_delete_buffer (YY_CURRENT_BUFFER); 78*313a0c13SJung-uk Kim } 79*313a0c13SJung-uk Kim 80*313a0c13SJung-uk Kim 81eef1b955SJung-uk Kim /******************************************************************************* 82eef1b955SJung-uk Kim * 83eef1b955SJung-uk Kim * FUNCTION: AslDoLineDirective 84eef1b955SJung-uk Kim * 85eef1b955SJung-uk Kim * PARAMETERS: None. Uses input() to access current source code line 86eef1b955SJung-uk Kim * 87eef1b955SJung-uk Kim * RETURN: Updates global line number and filename 88eef1b955SJung-uk Kim * 89eef1b955SJung-uk Kim * DESCRIPTION: Handle #line directives emitted by the preprocessor. 90eef1b955SJung-uk Kim * 91eef1b955SJung-uk Kim * The #line directive is emitted by the preprocesser, and is used to 92eef1b955SJung-uk Kim * pass through line numbers from the original source code file to the 93eef1b955SJung-uk Kim * preprocessor output file (.i). This allows any compiler-generated 94eef1b955SJung-uk Kim * error messages to be displayed with the correct line number. 95eef1b955SJung-uk Kim * 96eef1b955SJung-uk Kim ******************************************************************************/ 97eef1b955SJung-uk Kim 98eef1b955SJung-uk Kim static void 99eef1b955SJung-uk Kim AslDoLineDirective ( 100eef1b955SJung-uk Kim void) 101eef1b955SJung-uk Kim { 102f38b0f21SJung-uk Kim int c; 103eef1b955SJung-uk Kim char *Token; 104eef1b955SJung-uk Kim UINT32 LineNumber; 105eef1b955SJung-uk Kim char *Filename; 106f38b0f21SJung-uk Kim UINT32 i; 107eef1b955SJung-uk Kim 108eef1b955SJung-uk Kim 109eef1b955SJung-uk Kim /* Eat the entire line that contains the #line directive */ 110eef1b955SJung-uk Kim 111f38b0f21SJung-uk Kim Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 112f38b0f21SJung-uk Kim 113f38b0f21SJung-uk Kim while ((c = input()) != '\n' && c != EOF) 114eef1b955SJung-uk Kim { 115f38b0f21SJung-uk Kim *Gbl_LineBufPtr = c; 116f38b0f21SJung-uk Kim Gbl_LineBufPtr++; 117eef1b955SJung-uk Kim } 118f38b0f21SJung-uk Kim *Gbl_LineBufPtr = 0; 119eef1b955SJung-uk Kim 120eef1b955SJung-uk Kim /* First argument is the actual line number */ 121eef1b955SJung-uk Kim 122eef1b955SJung-uk Kim Token = strtok (Gbl_CurrentLineBuffer, " "); 123eef1b955SJung-uk Kim if (!Token) 124eef1b955SJung-uk Kim { 125eef1b955SJung-uk Kim goto ResetAndExit; 126eef1b955SJung-uk Kim } 127eef1b955SJung-uk Kim 128f38b0f21SJung-uk Kim /* First argument is the line number */ 129eef1b955SJung-uk Kim 130eef1b955SJung-uk Kim LineNumber = (UINT32) UtDoConstant (Token); 131f38b0f21SJung-uk Kim 132f38b0f21SJung-uk Kim /* Emit the appropriate number of newlines */ 133f38b0f21SJung-uk Kim 134f38b0f21SJung-uk Kim Gbl_CurrentColumn = 0; 135f38b0f21SJung-uk Kim if (LineNumber > Gbl_CurrentLineNumber) 136f38b0f21SJung-uk Kim { 137f38b0f21SJung-uk Kim for (i = 0; i < (LineNumber - Gbl_CurrentLineNumber); i++) 138f38b0f21SJung-uk Kim { 139f38b0f21SJung-uk Kim FlWriteFile (ASL_FILE_SOURCE_OUTPUT, "\n", 1); 140f38b0f21SJung-uk Kim Gbl_CurrentColumn++; 141f38b0f21SJung-uk Kim } 142f38b0f21SJung-uk Kim } 143f38b0f21SJung-uk Kim 144f38b0f21SJung-uk Kim FlSetLineNumber (LineNumber); 145eef1b955SJung-uk Kim 146eef1b955SJung-uk Kim /* Second argument is the optional filename (in double quotes) */ 147eef1b955SJung-uk Kim 148eef1b955SJung-uk Kim Token = strtok (NULL, " \""); 149eef1b955SJung-uk Kim if (Token) 150eef1b955SJung-uk Kim { 151eef1b955SJung-uk Kim Filename = ACPI_ALLOCATE_ZEROED (strlen (Token) + 1); 152eef1b955SJung-uk Kim strcpy (Filename, Token); 153eef1b955SJung-uk Kim FlSetFilename (Filename); 154eef1b955SJung-uk Kim } 155eef1b955SJung-uk Kim 156eef1b955SJung-uk Kim /* Third argument is not supported at this time */ 157eef1b955SJung-uk Kim 158eef1b955SJung-uk Kim ResetAndExit: 159f38b0f21SJung-uk Kim 160f38b0f21SJung-uk Kim /* Reset globals for a new line */ 161f38b0f21SJung-uk Kim 162f38b0f21SJung-uk Kim Gbl_CurrentLineOffset += Gbl_CurrentColumn; 163f38b0f21SJung-uk Kim Gbl_CurrentColumn = 0; 164f38b0f21SJung-uk Kim Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 165eef1b955SJung-uk Kim } 166eef1b955SJung-uk Kim 167eef1b955SJung-uk Kim 168eef1b955SJung-uk Kim /******************************************************************************* 169eef1b955SJung-uk Kim * 170eef1b955SJung-uk Kim * FUNCTION: AslPopInputFileStack 171eef1b955SJung-uk Kim * 172eef1b955SJung-uk Kim * PARAMETERS: None 173eef1b955SJung-uk Kim * 174eef1b955SJung-uk Kim * RETURN: 0 if a node was popped, -1 otherwise 175eef1b955SJung-uk Kim * 176eef1b955SJung-uk Kim * DESCRIPTION: Pop the top of the input file stack and point the parser to 177eef1b955SJung-uk Kim * the saved parse buffer contained in the fnode. Also, set the 178eef1b955SJung-uk Kim * global line counters to the saved values. This function is 179eef1b955SJung-uk Kim * called when an include file reaches EOF. 180eef1b955SJung-uk Kim * 181eef1b955SJung-uk Kim ******************************************************************************/ 182eef1b955SJung-uk Kim 183eef1b955SJung-uk Kim int 184eef1b955SJung-uk Kim AslPopInputFileStack ( 185eef1b955SJung-uk Kim void) 186eef1b955SJung-uk Kim { 187eef1b955SJung-uk Kim ASL_FILE_NODE *Fnode; 188eef1b955SJung-uk Kim 189eef1b955SJung-uk Kim 190eef1b955SJung-uk Kim Fnode = Gbl_IncludeFileStack; 191eef1b955SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\nPop InputFile Stack, Fnode %p\n\n", Fnode); 192eef1b955SJung-uk Kim 193eef1b955SJung-uk Kim if (!Fnode) 194eef1b955SJung-uk Kim { 195eef1b955SJung-uk Kim return (-1); 196eef1b955SJung-uk Kim } 197eef1b955SJung-uk Kim 198eef1b955SJung-uk Kim /* Close the current include file */ 199eef1b955SJung-uk Kim 200eef1b955SJung-uk Kim fclose (yyin); 201eef1b955SJung-uk Kim 202eef1b955SJung-uk Kim /* Update the top-of-stack */ 203eef1b955SJung-uk Kim 204eef1b955SJung-uk Kim Gbl_IncludeFileStack = Fnode->Next; 205eef1b955SJung-uk Kim 206eef1b955SJung-uk Kim /* Reset global line counter and filename */ 207eef1b955SJung-uk Kim 208eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename; 209eef1b955SJung-uk Kim Gbl_CurrentLineNumber = Fnode->CurrentLineNumber; 210eef1b955SJung-uk Kim 211eef1b955SJung-uk Kim /* Point the parser to the popped file */ 212eef1b955SJung-uk Kim 213eef1b955SJung-uk Kim yy_delete_buffer (YY_CURRENT_BUFFER); 214eef1b955SJung-uk Kim yy_switch_to_buffer (Fnode->State); 215eef1b955SJung-uk Kim 216eef1b955SJung-uk Kim /* All done with this node */ 217eef1b955SJung-uk Kim 218eef1b955SJung-uk Kim ACPI_FREE (Fnode); 219eef1b955SJung-uk Kim return (0); 220eef1b955SJung-uk Kim } 221eef1b955SJung-uk Kim 222eef1b955SJung-uk Kim 223eef1b955SJung-uk Kim /******************************************************************************* 224eef1b955SJung-uk Kim * 225eef1b955SJung-uk Kim * FUNCTION: AslPushInputFileStack 226eef1b955SJung-uk Kim * 227eef1b955SJung-uk Kim * PARAMETERS: InputFile - Open file pointer 228eef1b955SJung-uk Kim * Filename - Name of the file 229eef1b955SJung-uk Kim * 230eef1b955SJung-uk Kim * RETURN: None 231eef1b955SJung-uk Kim * 232eef1b955SJung-uk Kim * DESCRIPTION: Push the InputFile onto the file stack, and point the parser 233eef1b955SJung-uk Kim * to this file. Called when an include file is successfully 234eef1b955SJung-uk Kim * opened. 235eef1b955SJung-uk Kim * 236eef1b955SJung-uk Kim ******************************************************************************/ 237eef1b955SJung-uk Kim 238eef1b955SJung-uk Kim void 239eef1b955SJung-uk Kim AslPushInputFileStack ( 240eef1b955SJung-uk Kim FILE *InputFile, 241eef1b955SJung-uk Kim char *Filename) 242eef1b955SJung-uk Kim { 243eef1b955SJung-uk Kim ASL_FILE_NODE *Fnode; 244eef1b955SJung-uk Kim YY_BUFFER_STATE State; 245eef1b955SJung-uk Kim 246eef1b955SJung-uk Kim 247eef1b955SJung-uk Kim /* Save the current state in an Fnode */ 248eef1b955SJung-uk Kim 249eef1b955SJung-uk Kim Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE)); 250eef1b955SJung-uk Kim 251eef1b955SJung-uk Kim Fnode->File = yyin; 252eef1b955SJung-uk Kim Fnode->Next = Gbl_IncludeFileStack; 253eef1b955SJung-uk Kim Fnode->State = YY_CURRENT_BUFFER; 254eef1b955SJung-uk Kim Fnode->CurrentLineNumber = Gbl_CurrentLineNumber; 255eef1b955SJung-uk Kim Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename; 256eef1b955SJung-uk Kim 257eef1b955SJung-uk Kim /* Push it on the stack */ 258eef1b955SJung-uk Kim 259eef1b955SJung-uk Kim Gbl_IncludeFileStack = Fnode; 260eef1b955SJung-uk Kim 261eef1b955SJung-uk Kim /* Point the parser to this file */ 262eef1b955SJung-uk Kim 263eef1b955SJung-uk Kim State = yy_create_buffer (InputFile, YY_BUF_SIZE); 264eef1b955SJung-uk Kim yy_switch_to_buffer (State); 265eef1b955SJung-uk Kim 266eef1b955SJung-uk Kim DbgPrint (ASL_PARSE_OUTPUT, "\nPush InputFile Stack, returning %p\n\n", InputFile); 267eef1b955SJung-uk Kim 268eef1b955SJung-uk Kim /* Reset the global line count and filename */ 269eef1b955SJung-uk Kim 270*313a0c13SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename = 271*313a0c13SJung-uk Kim UtStringCacheCalloc (strlen (Filename) + 1); 272*313a0c13SJung-uk Kim 273*313a0c13SJung-uk Kim strcpy (Gbl_Files[ASL_FILE_INPUT].Filename, Filename); 274*313a0c13SJung-uk Kim 275eef1b955SJung-uk Kim Gbl_CurrentLineNumber = 1; 276eef1b955SJung-uk Kim yyin = InputFile; 277eef1b955SJung-uk Kim } 278eef1b955SJung-uk Kim 279eef1b955SJung-uk Kim 280eef1b955SJung-uk Kim /******************************************************************************* 281eef1b955SJung-uk Kim * 282eef1b955SJung-uk Kim * FUNCTION: AslResetCurrentLineBuffer 283eef1b955SJung-uk Kim * 284eef1b955SJung-uk Kim * PARAMETERS: None 285eef1b955SJung-uk Kim * 286eef1b955SJung-uk Kim * RETURN: None 287eef1b955SJung-uk Kim * 288eef1b955SJung-uk Kim * DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers. 289eef1b955SJung-uk Kim * 290eef1b955SJung-uk Kim ******************************************************************************/ 291eef1b955SJung-uk Kim 292eef1b955SJung-uk Kim void 293eef1b955SJung-uk Kim AslResetCurrentLineBuffer ( 294eef1b955SJung-uk Kim void) 295eef1b955SJung-uk Kim { 296eef1b955SJung-uk Kim 297eef1b955SJung-uk Kim if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle) 298eef1b955SJung-uk Kim { 299eef1b955SJung-uk Kim FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer, 300eef1b955SJung-uk Kim Gbl_LineBufPtr - Gbl_CurrentLineBuffer); 301eef1b955SJung-uk Kim } 302eef1b955SJung-uk Kim 303eef1b955SJung-uk Kim Gbl_CurrentLineOffset += Gbl_CurrentColumn; 304eef1b955SJung-uk Kim Gbl_CurrentColumn = 0; 305eef1b955SJung-uk Kim 306eef1b955SJung-uk Kim Gbl_CurrentLineNumber++; 307eef1b955SJung-uk Kim Gbl_LogicalLineNumber++; 308eef1b955SJung-uk Kim Gbl_LineBufPtr = Gbl_CurrentLineBuffer; 309eef1b955SJung-uk Kim } 310eef1b955SJung-uk Kim 311eef1b955SJung-uk Kim 312eef1b955SJung-uk Kim /******************************************************************************* 313eef1b955SJung-uk Kim * 314eef1b955SJung-uk Kim * FUNCTION: AslInsertLineBuffer 315eef1b955SJung-uk Kim * 316eef1b955SJung-uk Kim * PARAMETERS: SourceChar - One char from the input ASL source file 317eef1b955SJung-uk Kim * 318eef1b955SJung-uk Kim * RETURN: None 319eef1b955SJung-uk Kim * 320eef1b955SJung-uk Kim * DESCRIPTION: Put one character of the source file into the temp line buffer 321eef1b955SJung-uk Kim * 322eef1b955SJung-uk Kim ******************************************************************************/ 323eef1b955SJung-uk Kim 324eef1b955SJung-uk Kim void 325eef1b955SJung-uk Kim AslInsertLineBuffer ( 326eef1b955SJung-uk Kim int SourceChar) 327eef1b955SJung-uk Kim { 328eef1b955SJung-uk Kim UINT32 i; 329eef1b955SJung-uk Kim UINT32 Count = 1; 330eef1b955SJung-uk Kim 331eef1b955SJung-uk Kim 332eef1b955SJung-uk Kim if (SourceChar == EOF) 333eef1b955SJung-uk Kim { 334eef1b955SJung-uk Kim return; 335eef1b955SJung-uk Kim } 336eef1b955SJung-uk Kim 337eef1b955SJung-uk Kim Gbl_InputByteCount++; 338eef1b955SJung-uk Kim 339eef1b955SJung-uk Kim /* Handle tabs. Convert to spaces */ 340eef1b955SJung-uk Kim 341eef1b955SJung-uk Kim if (SourceChar == '\t') 342eef1b955SJung-uk Kim { 343eef1b955SJung-uk Kim SourceChar = ' '; 344eef1b955SJung-uk Kim Count = ASL_SPACES_PER_TAB - 345eef1b955SJung-uk Kim (Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1)); 346eef1b955SJung-uk Kim } 347eef1b955SJung-uk Kim 348eef1b955SJung-uk Kim for (i = 0; i < Count; i++) 349eef1b955SJung-uk Kim { 350eef1b955SJung-uk Kim Gbl_CurrentColumn++; 351eef1b955SJung-uk Kim 352eef1b955SJung-uk Kim /* Insert the character into the line buffer */ 353eef1b955SJung-uk Kim 354eef1b955SJung-uk Kim *Gbl_LineBufPtr = (UINT8) SourceChar; 355eef1b955SJung-uk Kim Gbl_LineBufPtr++; 356eef1b955SJung-uk Kim 357042ff955SJung-uk Kim if (Gbl_LineBufPtr > (Gbl_CurrentLineBuffer + (Gbl_LineBufferSize - 1))) 358eef1b955SJung-uk Kim { 359eef1b955SJung-uk Kim #if 0 360eef1b955SJung-uk Kim /* 361eef1b955SJung-uk Kim * Warning if we have split a long source line. 362eef1b955SJung-uk Kim * <Probably overkill> 363eef1b955SJung-uk Kim */ 364042ff955SJung-uk Kim sprintf (MsgBuffer, "Max %u", Gbl_LineBufferSize); 365eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE, 366eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 367eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 368eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer); 369eef1b955SJung-uk Kim #endif 370eef1b955SJung-uk Kim 371eef1b955SJung-uk Kim AslResetCurrentLineBuffer (); 372eef1b955SJung-uk Kim } 373eef1b955SJung-uk Kim else if (SourceChar == '\n') 374eef1b955SJung-uk Kim { 375eef1b955SJung-uk Kim /* End of line */ 376eef1b955SJung-uk Kim 377eef1b955SJung-uk Kim AslResetCurrentLineBuffer (); 378eef1b955SJung-uk Kim } 379eef1b955SJung-uk Kim } 380eef1b955SJung-uk Kim } 381eef1b955SJung-uk Kim 382eef1b955SJung-uk Kim 383eef1b955SJung-uk Kim /******************************************************************************* 384eef1b955SJung-uk Kim * 385eef1b955SJung-uk Kim * FUNCTION: count 386eef1b955SJung-uk Kim * 387eef1b955SJung-uk Kim * PARAMETERS: yytext - Contains the matched keyword. 388eef1b955SJung-uk Kim * Type - Keyword/Character type: 389eef1b955SJung-uk Kim * 0 = anything except a keyword 390eef1b955SJung-uk Kim * 1 = pseudo-keywords 391eef1b955SJung-uk Kim * 2 = non-executable ASL keywords 392eef1b955SJung-uk Kim * 3 = executable ASL keywords 393eef1b955SJung-uk Kim * 394eef1b955SJung-uk Kim * RETURN: None 395eef1b955SJung-uk Kim * 396eef1b955SJung-uk Kim * DESCRIPTION: Count keywords and put them into the line buffer 397eef1b955SJung-uk Kim * 398eef1b955SJung-uk Kim ******************************************************************************/ 399eef1b955SJung-uk Kim 400eef1b955SJung-uk Kim static void 401eef1b955SJung-uk Kim count ( 402eef1b955SJung-uk Kim int Type) 403eef1b955SJung-uk Kim { 404eef1b955SJung-uk Kim int i; 405eef1b955SJung-uk Kim 406eef1b955SJung-uk Kim 407eef1b955SJung-uk Kim switch (Type) 408eef1b955SJung-uk Kim { 409eef1b955SJung-uk Kim case 2: 410a9d8d09cSJung-uk Kim 411eef1b955SJung-uk Kim TotalKeywords++; 412eef1b955SJung-uk Kim TotalNamedObjects++; 413eef1b955SJung-uk Kim break; 414eef1b955SJung-uk Kim 415eef1b955SJung-uk Kim case 3: 416a9d8d09cSJung-uk Kim 417eef1b955SJung-uk Kim TotalKeywords++; 418eef1b955SJung-uk Kim TotalExecutableOpcodes++; 419eef1b955SJung-uk Kim break; 4209c48c75eSJung-uk Kim 4219c48c75eSJung-uk Kim default: 422a9d8d09cSJung-uk Kim 4239c48c75eSJung-uk Kim break; 424eef1b955SJung-uk Kim } 425eef1b955SJung-uk Kim 426eef1b955SJung-uk Kim for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++) 427eef1b955SJung-uk Kim { 428eef1b955SJung-uk Kim AslInsertLineBuffer (yytext[i]); 429eef1b955SJung-uk Kim *Gbl_LineBufPtr = 0; 430eef1b955SJung-uk Kim } 431eef1b955SJung-uk Kim } 432eef1b955SJung-uk Kim 433eef1b955SJung-uk Kim 434eef1b955SJung-uk Kim /******************************************************************************* 435eef1b955SJung-uk Kim * 436eef1b955SJung-uk Kim * FUNCTION: AslDoComment 437eef1b955SJung-uk Kim * 438eef1b955SJung-uk Kim * PARAMETERS: none 439eef1b955SJung-uk Kim * 440eef1b955SJung-uk Kim * RETURN: none 441eef1b955SJung-uk Kim * 442eef1b955SJung-uk Kim * DESCRIPTION: Process a standard comment. 443eef1b955SJung-uk Kim * 444eef1b955SJung-uk Kim ******************************************************************************/ 445eef1b955SJung-uk Kim 446eef1b955SJung-uk Kim static char 447eef1b955SJung-uk Kim AslDoComment ( 448eef1b955SJung-uk Kim void) 449eef1b955SJung-uk Kim { 450f38b0f21SJung-uk Kim int c; 451f38b0f21SJung-uk Kim int c1 = 0; 452eef1b955SJung-uk Kim 453eef1b955SJung-uk Kim 454eef1b955SJung-uk Kim AslInsertLineBuffer ('/'); 455eef1b955SJung-uk Kim AslInsertLineBuffer ('*'); 456eef1b955SJung-uk Kim 457eef1b955SJung-uk Kim loop: 458eef1b955SJung-uk Kim 459eef1b955SJung-uk Kim /* Eat chars until end-of-comment */ 460eef1b955SJung-uk Kim 461f38b0f21SJung-uk Kim while ((c = input()) != '*' && c != EOF) 462eef1b955SJung-uk Kim { 463eef1b955SJung-uk Kim AslInsertLineBuffer (c); 464eef1b955SJung-uk Kim c1 = c; 465eef1b955SJung-uk Kim } 466eef1b955SJung-uk Kim 467eef1b955SJung-uk Kim if (c == EOF) 468eef1b955SJung-uk Kim { 469eef1b955SJung-uk Kim goto EarlyEOF; 470eef1b955SJung-uk Kim } 471eef1b955SJung-uk Kim 472eef1b955SJung-uk Kim /* 473eef1b955SJung-uk Kim * Check for nested comment -- can help catch cases where a previous 474eef1b955SJung-uk Kim * comment was accidently left unterminated 475eef1b955SJung-uk Kim */ 476eef1b955SJung-uk Kim if ((c1 == '/') && (c == '*')) 477eef1b955SJung-uk Kim { 478eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT, 479eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 480eef1b955SJung-uk Kim Gbl_InputByteCount, Gbl_CurrentColumn, 481eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 482eef1b955SJung-uk Kim } 483eef1b955SJung-uk Kim 484eef1b955SJung-uk Kim /* Comment is closed only if the NEXT character is a slash */ 485eef1b955SJung-uk Kim 486eef1b955SJung-uk Kim AslInsertLineBuffer (c); 487eef1b955SJung-uk Kim 488f38b0f21SJung-uk Kim if ((c1 = input()) != '/' && c1 != EOF) 489eef1b955SJung-uk Kim { 490eef1b955SJung-uk Kim unput(c1); 491eef1b955SJung-uk Kim goto loop; 492eef1b955SJung-uk Kim } 493eef1b955SJung-uk Kim 494eef1b955SJung-uk Kim if (c1 == EOF) 495eef1b955SJung-uk Kim { 496eef1b955SJung-uk Kim goto EarlyEOF; 497eef1b955SJung-uk Kim } 498eef1b955SJung-uk Kim 499eef1b955SJung-uk Kim AslInsertLineBuffer (c1); 500eef1b955SJung-uk Kim return (TRUE); 501eef1b955SJung-uk Kim 502eef1b955SJung-uk Kim 503eef1b955SJung-uk Kim EarlyEOF: 504eef1b955SJung-uk Kim /* 505eef1b955SJung-uk Kim * Premature End-Of-File 506eef1b955SJung-uk Kim */ 507eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF, 508eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 509eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 510eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 511eef1b955SJung-uk Kim return (FALSE); 512eef1b955SJung-uk Kim } 513eef1b955SJung-uk Kim 514eef1b955SJung-uk Kim 515eef1b955SJung-uk Kim /******************************************************************************* 516eef1b955SJung-uk Kim * 517eef1b955SJung-uk Kim * FUNCTION: AslDoCommentType2 518eef1b955SJung-uk Kim * 519eef1b955SJung-uk Kim * PARAMETERS: none 520eef1b955SJung-uk Kim * 521eef1b955SJung-uk Kim * RETURN: none 522eef1b955SJung-uk Kim * 523eef1b955SJung-uk Kim * DESCRIPTION: Process a new "//" comment. 524eef1b955SJung-uk Kim * 525eef1b955SJung-uk Kim ******************************************************************************/ 526eef1b955SJung-uk Kim 527eef1b955SJung-uk Kim static char 528eef1b955SJung-uk Kim AslDoCommentType2 ( 529eef1b955SJung-uk Kim void) 530eef1b955SJung-uk Kim { 531f38b0f21SJung-uk Kim int c; 532eef1b955SJung-uk Kim 533eef1b955SJung-uk Kim 534eef1b955SJung-uk Kim AslInsertLineBuffer ('/'); 535eef1b955SJung-uk Kim AslInsertLineBuffer ('/'); 536eef1b955SJung-uk Kim 537f38b0f21SJung-uk Kim while ((c = input()) != '\n' && c != EOF) 538eef1b955SJung-uk Kim { 539eef1b955SJung-uk Kim AslInsertLineBuffer (c); 540eef1b955SJung-uk Kim } 541eef1b955SJung-uk Kim 542eef1b955SJung-uk Kim if (c == EOF) 543eef1b955SJung-uk Kim { 544eef1b955SJung-uk Kim /* End of file is OK, change to newline. Let parser detect EOF later */ 545eef1b955SJung-uk Kim 546eef1b955SJung-uk Kim c = '\n'; 547eef1b955SJung-uk Kim } 548eef1b955SJung-uk Kim 549eef1b955SJung-uk Kim AslInsertLineBuffer (c); 550eef1b955SJung-uk Kim return (TRUE); 551eef1b955SJung-uk Kim } 552eef1b955SJung-uk Kim 553eef1b955SJung-uk Kim 554eef1b955SJung-uk Kim /******************************************************************************* 555eef1b955SJung-uk Kim * 556eef1b955SJung-uk Kim * FUNCTION: AslDoStringLiteral 557eef1b955SJung-uk Kim * 558eef1b955SJung-uk Kim * PARAMETERS: none 559eef1b955SJung-uk Kim * 560eef1b955SJung-uk Kim * RETURN: none 561eef1b955SJung-uk Kim * 562eef1b955SJung-uk Kim * DESCRIPTION: Process a string literal (surrounded by quotes) 563eef1b955SJung-uk Kim * 564eef1b955SJung-uk Kim ******************************************************************************/ 565eef1b955SJung-uk Kim 566eef1b955SJung-uk Kim static char 567eef1b955SJung-uk Kim AslDoStringLiteral ( 568eef1b955SJung-uk Kim void) 569eef1b955SJung-uk Kim { 570eef1b955SJung-uk Kim char *StringBuffer = MsgBuffer; 571eef1b955SJung-uk Kim char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE; 572eef1b955SJung-uk Kim char *CleanString; 573f38b0f21SJung-uk Kim int StringChar; 574eef1b955SJung-uk Kim UINT32 State = ASL_NORMAL_CHAR; 575eef1b955SJung-uk Kim UINT32 i = 0; 576eef1b955SJung-uk Kim UINT8 Digit; 577eef1b955SJung-uk Kim char ConvertBuffer[4]; 578eef1b955SJung-uk Kim 579eef1b955SJung-uk Kim 580eef1b955SJung-uk Kim /* 581eef1b955SJung-uk Kim * Eat chars until end-of-literal. 582eef1b955SJung-uk Kim * NOTE: Put back the original surrounding quotes into the 583eef1b955SJung-uk Kim * source line buffer. 584eef1b955SJung-uk Kim */ 585eef1b955SJung-uk Kim AslInsertLineBuffer ('\"'); 586f38b0f21SJung-uk Kim while ((StringChar = input()) != EOF) 587eef1b955SJung-uk Kim { 588eef1b955SJung-uk Kim AslInsertLineBuffer (StringChar); 589eef1b955SJung-uk Kim 590eef1b955SJung-uk Kim DoCharacter: 591eef1b955SJung-uk Kim switch (State) 592eef1b955SJung-uk Kim { 593eef1b955SJung-uk Kim case ASL_NORMAL_CHAR: 594eef1b955SJung-uk Kim 595eef1b955SJung-uk Kim switch (StringChar) 596eef1b955SJung-uk Kim { 597eef1b955SJung-uk Kim case '\\': 598eef1b955SJung-uk Kim /* 599eef1b955SJung-uk Kim * Special handling for backslash-escape sequence. We will 600eef1b955SJung-uk Kim * toss the backslash and translate the escape char(s). 601eef1b955SJung-uk Kim */ 602eef1b955SJung-uk Kim State = ASL_ESCAPE_SEQUENCE; 603eef1b955SJung-uk Kim continue; 604eef1b955SJung-uk Kim 605eef1b955SJung-uk Kim case '\"': 606eef1b955SJung-uk Kim 607eef1b955SJung-uk Kim /* String terminator */ 608eef1b955SJung-uk Kim 609eef1b955SJung-uk Kim goto CompletedString; 6109c48c75eSJung-uk Kim 6119c48c75eSJung-uk Kim default: 612a9d8d09cSJung-uk Kim 6139c48c75eSJung-uk Kim break; 614eef1b955SJung-uk Kim } 615eef1b955SJung-uk Kim break; 616eef1b955SJung-uk Kim 617eef1b955SJung-uk Kim 618eef1b955SJung-uk Kim case ASL_ESCAPE_SEQUENCE: 619eef1b955SJung-uk Kim 620eef1b955SJung-uk Kim State = ASL_NORMAL_CHAR; 621eef1b955SJung-uk Kim switch (StringChar) 622eef1b955SJung-uk Kim { 623eef1b955SJung-uk Kim case 'a': 624a9d8d09cSJung-uk Kim 625eef1b955SJung-uk Kim StringChar = 0x07; /* BELL */ 626eef1b955SJung-uk Kim break; 627eef1b955SJung-uk Kim 628eef1b955SJung-uk Kim case 'b': 629a9d8d09cSJung-uk Kim 630eef1b955SJung-uk Kim StringChar = 0x08; /* BACKSPACE */ 631eef1b955SJung-uk Kim break; 632eef1b955SJung-uk Kim 633eef1b955SJung-uk Kim case 'f': 634a9d8d09cSJung-uk Kim 635eef1b955SJung-uk Kim StringChar = 0x0C; /* FORMFEED */ 636eef1b955SJung-uk Kim break; 637eef1b955SJung-uk Kim 638eef1b955SJung-uk Kim case 'n': 639a9d8d09cSJung-uk Kim 640eef1b955SJung-uk Kim StringChar = 0x0A; /* LINEFEED */ 641eef1b955SJung-uk Kim break; 642eef1b955SJung-uk Kim 643eef1b955SJung-uk Kim case 'r': 644a9d8d09cSJung-uk Kim 645eef1b955SJung-uk Kim StringChar = 0x0D; /* CARRIAGE RETURN*/ 646eef1b955SJung-uk Kim break; 647eef1b955SJung-uk Kim 648eef1b955SJung-uk Kim case 't': 649a9d8d09cSJung-uk Kim 650eef1b955SJung-uk Kim StringChar = 0x09; /* HORIZONTAL TAB */ 651eef1b955SJung-uk Kim break; 652eef1b955SJung-uk Kim 653eef1b955SJung-uk Kim case 'v': 654a9d8d09cSJung-uk Kim 655eef1b955SJung-uk Kim StringChar = 0x0B; /* VERTICAL TAB */ 656eef1b955SJung-uk Kim break; 657eef1b955SJung-uk Kim 658eef1b955SJung-uk Kim case 'x': 659a9d8d09cSJung-uk Kim 660eef1b955SJung-uk Kim State = ASL_HEX_CONSTANT; 661eef1b955SJung-uk Kim i = 0; 662eef1b955SJung-uk Kim continue; 663eef1b955SJung-uk Kim 664eef1b955SJung-uk Kim case '\'': /* Single Quote */ 665eef1b955SJung-uk Kim case '\"': /* Double Quote */ 666eef1b955SJung-uk Kim case '\\': /* Backslash */ 667a9d8d09cSJung-uk Kim 668eef1b955SJung-uk Kim break; 669eef1b955SJung-uk Kim 670eef1b955SJung-uk Kim default: 671eef1b955SJung-uk Kim 672eef1b955SJung-uk Kim /* Check for an octal digit (0-7) */ 673eef1b955SJung-uk Kim 674eef1b955SJung-uk Kim if (ACPI_IS_OCTAL_DIGIT (StringChar)) 675eef1b955SJung-uk Kim { 676eef1b955SJung-uk Kim State = ASL_OCTAL_CONSTANT; 677eef1b955SJung-uk Kim ConvertBuffer[0] = StringChar; 678eef1b955SJung-uk Kim i = 1; 679eef1b955SJung-uk Kim continue; 680eef1b955SJung-uk Kim } 681eef1b955SJung-uk Kim 682eef1b955SJung-uk Kim /* Unknown escape sequence issue warning, but use the character */ 683eef1b955SJung-uk Kim 684eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE, 685eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 686eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 687eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 688eef1b955SJung-uk Kim break; 689eef1b955SJung-uk Kim } 690eef1b955SJung-uk Kim break; 691eef1b955SJung-uk Kim 692eef1b955SJung-uk Kim 693eef1b955SJung-uk Kim case ASL_OCTAL_CONSTANT: 694eef1b955SJung-uk Kim 695eef1b955SJung-uk Kim /* Up to three octal digits allowed */ 696eef1b955SJung-uk Kim 697eef1b955SJung-uk Kim if (!ACPI_IS_OCTAL_DIGIT (StringChar) || 698eef1b955SJung-uk Kim (i > 2)) 699eef1b955SJung-uk Kim { 700eef1b955SJung-uk Kim /* 701eef1b955SJung-uk Kim * Reached end of the constant. Convert the assembled ASCII 702eef1b955SJung-uk Kim * string and resume processing of the next character 703eef1b955SJung-uk Kim */ 704eef1b955SJung-uk Kim ConvertBuffer[i] = 0; 705eef1b955SJung-uk Kim Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 8); 706eef1b955SJung-uk Kim 707eef1b955SJung-uk Kim /* Check for NULL or non-ascii character (ignore if so) */ 708eef1b955SJung-uk Kim 709eef1b955SJung-uk Kim if ((Digit == 0) || (Digit > ACPI_ASCII_MAX)) 710eef1b955SJung-uk Kim { 711eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING, 712eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 713eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 714eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 715eef1b955SJung-uk Kim } 716eef1b955SJung-uk Kim else 717eef1b955SJung-uk Kim { 718eef1b955SJung-uk Kim *StringBuffer = (char) Digit; 719eef1b955SJung-uk Kim StringBuffer++; 720eef1b955SJung-uk Kim if (StringBuffer >= EndBuffer) 721eef1b955SJung-uk Kim { 722eef1b955SJung-uk Kim goto BufferOverflow; 723eef1b955SJung-uk Kim } 724eef1b955SJung-uk Kim } 725eef1b955SJung-uk Kim 726eef1b955SJung-uk Kim State = ASL_NORMAL_CHAR; 727eef1b955SJung-uk Kim goto DoCharacter; 728eef1b955SJung-uk Kim break; 729eef1b955SJung-uk Kim } 730eef1b955SJung-uk Kim 731eef1b955SJung-uk Kim /* Append another digit of the constant */ 732eef1b955SJung-uk Kim 733eef1b955SJung-uk Kim ConvertBuffer[i] = StringChar; 734eef1b955SJung-uk Kim i++; 735eef1b955SJung-uk Kim continue; 736eef1b955SJung-uk Kim 737eef1b955SJung-uk Kim case ASL_HEX_CONSTANT: 738eef1b955SJung-uk Kim 739eef1b955SJung-uk Kim /* Up to two hex digits allowed */ 740eef1b955SJung-uk Kim 741eef1b955SJung-uk Kim if (!ACPI_IS_XDIGIT (StringChar) || 742eef1b955SJung-uk Kim (i > 1)) 743eef1b955SJung-uk Kim { 744eef1b955SJung-uk Kim /* 745eef1b955SJung-uk Kim * Reached end of the constant. Convert the assembled ASCII 746eef1b955SJung-uk Kim * string and resume processing of the next character 747eef1b955SJung-uk Kim */ 748eef1b955SJung-uk Kim ConvertBuffer[i] = 0; 749eef1b955SJung-uk Kim Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 16); 750eef1b955SJung-uk Kim 751eef1b955SJung-uk Kim /* Check for NULL or non-ascii character (ignore if so) */ 752eef1b955SJung-uk Kim 753eef1b955SJung-uk Kim if ((Digit == 0) || (Digit > ACPI_ASCII_MAX)) 754eef1b955SJung-uk Kim { 755eef1b955SJung-uk Kim AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING, 756eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 757eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 758eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 759eef1b955SJung-uk Kim } 760eef1b955SJung-uk Kim else 761eef1b955SJung-uk Kim { 762eef1b955SJung-uk Kim *StringBuffer = (char) Digit; 763eef1b955SJung-uk Kim StringBuffer++; 764eef1b955SJung-uk Kim if (StringBuffer >= EndBuffer) 765eef1b955SJung-uk Kim { 766eef1b955SJung-uk Kim goto BufferOverflow; 767eef1b955SJung-uk Kim } 768eef1b955SJung-uk Kim } 769eef1b955SJung-uk Kim 770eef1b955SJung-uk Kim State = ASL_NORMAL_CHAR; 771eef1b955SJung-uk Kim goto DoCharacter; 772eef1b955SJung-uk Kim break; 773eef1b955SJung-uk Kim } 774eef1b955SJung-uk Kim 775eef1b955SJung-uk Kim /* Append another digit of the constant */ 776eef1b955SJung-uk Kim 777eef1b955SJung-uk Kim ConvertBuffer[i] = StringChar; 778eef1b955SJung-uk Kim i++; 779eef1b955SJung-uk Kim continue; 7809c48c75eSJung-uk Kim 7819c48c75eSJung-uk Kim default: 782a9d8d09cSJung-uk Kim 7839c48c75eSJung-uk Kim break; 784eef1b955SJung-uk Kim } 785eef1b955SJung-uk Kim 786eef1b955SJung-uk Kim /* Save the finished character */ 787eef1b955SJung-uk Kim 788eef1b955SJung-uk Kim *StringBuffer = StringChar; 789eef1b955SJung-uk Kim StringBuffer++; 790eef1b955SJung-uk Kim if (StringBuffer >= EndBuffer) 791eef1b955SJung-uk Kim { 792eef1b955SJung-uk Kim goto BufferOverflow; 793eef1b955SJung-uk Kim } 794eef1b955SJung-uk Kim } 795eef1b955SJung-uk Kim 796eef1b955SJung-uk Kim /* 797eef1b955SJung-uk Kim * Premature End-Of-File 798eef1b955SJung-uk Kim */ 799eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF, 800eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 801eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 802eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, NULL); 803eef1b955SJung-uk Kim return (FALSE); 804eef1b955SJung-uk Kim 805eef1b955SJung-uk Kim 806eef1b955SJung-uk Kim CompletedString: 807eef1b955SJung-uk Kim /* 808eef1b955SJung-uk Kim * Null terminate the input string and copy string to a new buffer 809eef1b955SJung-uk Kim */ 810eef1b955SJung-uk Kim *StringBuffer = 0; 811eef1b955SJung-uk Kim 812*313a0c13SJung-uk Kim CleanString = UtStringCacheCalloc (strlen (MsgBuffer) + 1); 813eef1b955SJung-uk Kim if (!CleanString) 814eef1b955SJung-uk Kim { 815eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION, 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 ACPI_STRCPY (CleanString, MsgBuffer); 823eef1b955SJung-uk Kim AslCompilerlval.s = CleanString; 824eef1b955SJung-uk Kim return (TRUE); 825eef1b955SJung-uk Kim 826eef1b955SJung-uk Kim 827eef1b955SJung-uk Kim BufferOverflow: 828eef1b955SJung-uk Kim 829eef1b955SJung-uk Kim /* Literal was too long */ 830eef1b955SJung-uk Kim 831eef1b955SJung-uk Kim AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH, 832eef1b955SJung-uk Kim Gbl_CurrentLineNumber, Gbl_LogicalLineNumber, 833eef1b955SJung-uk Kim Gbl_CurrentLineOffset, Gbl_CurrentColumn, 834eef1b955SJung-uk Kim Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096"); 835eef1b955SJung-uk Kim return (FALSE); 836eef1b955SJung-uk Kim } 837