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