1 /****************************************************************************** 2 * 3 * Module Name: asconvrt - Source conversion code 4 * 5 *****************************************************************************/ 6 7 /****************************************************************************** 8 * 9 * 1. Copyright Notice 10 * 11 * Some or all of this work - Copyright (c) 1999 - 2023, Intel Corp. 12 * All rights reserved. 13 * 14 * 2. License 15 * 16 * 2.1. This is your license from Intel Corp. under its intellectual property 17 * rights. You may have additional license terms from the party that provided 18 * you this software, covering your right to use that party's intellectual 19 * property rights. 20 * 21 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22 * copy of the source code appearing in this file ("Covered Code") an 23 * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24 * base code distributed originally by Intel ("Original Intel Code") to copy, 25 * make derivatives, distribute, use and display any portion of the Covered 26 * Code in any form, with the right to sublicense such rights; and 27 * 28 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29 * license (with the right to sublicense), under only those claims of Intel 30 * patents that are infringed by the Original Intel Code, to make, use, sell, 31 * offer to sell, and import the Covered Code and derivative works thereof 32 * solely to the minimum extent necessary to exercise the above copyright 33 * license, and in no event shall the patent license extend to any additions 34 * to or modifications of the Original Intel Code. No other license or right 35 * is granted directly or by implication, estoppel or otherwise; 36 * 37 * The above copyright and patent license is granted only if the following 38 * conditions are met: 39 * 40 * 3. Conditions 41 * 42 * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43 * Redistribution of source code of any substantial portion of the Covered 44 * Code or modification with rights to further distribute source must include 45 * the above Copyright Notice, the above License, this list of Conditions, 46 * and the following Disclaimer and Export Compliance provision. In addition, 47 * Licensee must cause all Covered Code to which Licensee contributes to 48 * contain a file documenting the changes Licensee made to create that Covered 49 * Code and the date of any change. Licensee must include in that file the 50 * documentation of any changes made by any predecessor Licensee. Licensee 51 * must include a prominent statement that the modification is derived, 52 * directly or indirectly, from Original Intel Code. 53 * 54 * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55 * Redistribution of source code of any substantial portion of the Covered 56 * Code or modification without rights to further distribute source must 57 * include the following Disclaimer and Export Compliance provision in the 58 * documentation and/or other materials provided with distribution. In 59 * addition, Licensee may not authorize further sublicense of source of any 60 * portion of the Covered Code, and must include terms to the effect that the 61 * license from Licensee to its licensee is limited to the intellectual 62 * property embodied in the software Licensee provides to its licensee, and 63 * not to intellectual property embodied in modifications its licensee may 64 * make. 65 * 66 * 3.3. Redistribution of Executable. Redistribution in executable form of any 67 * substantial portion of the Covered Code or modification must reproduce the 68 * above Copyright Notice, and the following Disclaimer and Export Compliance 69 * provision in the documentation and/or other materials provided with the 70 * distribution. 71 * 72 * 3.4. Intel retains all right, title, and interest in and to the Original 73 * Intel Code. 74 * 75 * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76 * Intel shall be used in advertising or otherwise to promote the sale, use or 77 * other dealings in products derived from or relating to the Covered Code 78 * without prior written authorization from Intel. 79 * 80 * 4. Disclaimer and Export Compliance 81 * 82 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88 * PARTICULAR PURPOSE. 89 * 90 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97 * LIMITED REMEDY. 98 * 99 * 4.3. Licensee shall not export, either directly or indirectly, any of this 100 * software or system incorporating such software without first obtaining any 101 * required license or other approval from the U. S. Department of Commerce or 102 * any other agency or department of the United States Government. In the 103 * event Licensee exports any such software from the United States or 104 * re-exports any such software from a foreign destination, Licensee shall 105 * ensure that the distribution and export/re-export of the software is in 106 * compliance with all laws, regulations, orders, or other restrictions of the 107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108 * any of its subsidiaries will export/re-export any technical data, process, 109 * software, or service, directly or indirectly, to any country for which the 110 * United States government or any agency thereof requires an export license, 111 * other governmental approval, or letter of assurance, without first obtaining 112 * such license, approval or letter. 113 * 114 ***************************************************************************** 115 * 116 * Alternatively, you may choose to be licensed under the terms of the 117 * following license: 118 * 119 * Redistribution and use in source and binary forms, with or without 120 * modification, are permitted provided that the following conditions 121 * are met: 122 * 1. Redistributions of source code must retain the above copyright 123 * notice, this list of conditions, and the following disclaimer, 124 * without modification. 125 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 126 * substantially similar to the "NO WARRANTY" disclaimer below 127 * ("Disclaimer") and any redistribution must be conditioned upon 128 * including a substantially similar Disclaimer requirement for further 129 * binary redistribution. 130 * 3. Neither the names of the above-listed copyright holders nor the names 131 * of any contributors may be used to endorse or promote products derived 132 * from this software without specific prior written permission. 133 * 134 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 135 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 136 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 137 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 138 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 139 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 140 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 141 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 142 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 143 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 144 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 145 * 146 * Alternatively, you may choose to be licensed under the terms of the 147 * GNU General Public License ("GPL") version 2 as published by the Free 148 * Software Foundation. 149 * 150 *****************************************************************************/ 151 152 #include "acpisrc.h" 153 154 AS_BRACE_INFO Gbl_BraceInfo[] = 155 { 156 {" if", 3}, 157 {" else if", 8}, 158 {" else while", 11}, 159 {" else", 5}, 160 {" do ", 4}, 161 {NULL, 0} 162 }; 163 164 165 /* Local prototypes */ 166 167 static char * 168 AsMatchValidToken ( 169 char *Buffer, 170 char *Filename, 171 char TargetChar, 172 AS_SCAN_CALLBACK Callback); 173 174 static char * 175 AsCheckBracesCallback ( 176 char *Buffer, 177 char *Filename, 178 UINT32 LineNumber); 179 180 static UINT32 181 AsCountLines ( 182 char *Buffer, 183 char *Filename); 184 185 186 #define MODULE_HEADER_BEGIN "/******************************************************************************\n *\n * Module Name:"; 187 #define MODULE_HEADER_END " *****************************************************************************/\n\n" 188 #define INTEL_COPYRIGHT " * Copyright (C) 2000 - 2023, Intel Corp.\n" 189 190 /* Opening signature of the Intel legal header */ 191 192 char *HeaderBegin = "/******************************************************************************\n *\n * 1. Copyright Notice"; 193 194 UINT32 NonAnsiCommentCount; 195 196 char CopyRightHeaderEnd[] = INTEL_COPYRIGHT " *\n" MODULE_HEADER_END; 197 198 /****************************************************************************** 199 * 200 * FUNCTION: AsCountNonAnsiComments 201 * 202 * DESCRIPTION: Count the number of "//" comments. This type of comment is 203 * non-ANSI C. 204 * 205 * NOTE: July 2014: Allows // within quoted strings and within normal 206 * comments. Eliminates extraneous warnings from this utility. 207 * 208 ******************************************************************************/ 209 210 void AsCountNonAnsiComments(char * Buffer,char * Filename)211 AsCountNonAnsiComments ( 212 char *Buffer, 213 char *Filename) 214 { 215 216 AsMatchValidToken (Buffer, Filename, 0, NULL); 217 218 /* Error if any slash-slash comments found */ 219 220 if (NonAnsiCommentCount) 221 { 222 AsPrint ("Non-ANSI // Comments Found", NonAnsiCommentCount, Filename); 223 Gbl_NonAnsiComments += NonAnsiCommentCount; 224 } 225 } 226 227 228 /****************************************************************************** 229 * 230 * FUNCTION: AsCheckForBraces 231 * 232 * DESCRIPTION: Check for an open brace after each if/else/do (etc.) 233 * statement 234 * 235 ******************************************************************************/ 236 237 void AsCheckForBraces(char * Buffer,char * Filename)238 AsCheckForBraces ( 239 char *Buffer, 240 char *Filename) 241 { 242 243 AsMatchValidToken (Buffer, Filename, 0, AsCheckBracesCallback); 244 } 245 246 247 /****************************************************************************** 248 * 249 * FUNCTION: AsCheckBracesCallback 250 * 251 * DESCRIPTION: Check if/else/do statements. Ensure that braces 252 * are always used. 253 * 254 * TBD: Currently, don't check while() statements. The problem is that there 255 * are two forms: do {} while (); and while () {}. 256 * 257 ******************************************************************************/ 258 259 static char * AsCheckBracesCallback(char * Buffer,char * Filename,UINT32 LineNumber)260 AsCheckBracesCallback ( 261 char *Buffer, 262 char *Filename, 263 UINT32 LineNumber) 264 { 265 char *SubBuffer = Buffer; 266 char *NextBrace; 267 char *NextSemicolon; 268 AS_BRACE_INFO *BraceInfo; 269 270 271 for (BraceInfo = Gbl_BraceInfo; BraceInfo->Operator; BraceInfo++) 272 { 273 if (!(strncmp (BraceInfo->Operator, SubBuffer, BraceInfo->Length))) 274 { 275 SubBuffer += (BraceInfo->Length - 1); 276 277 /* Find next brace and the next semicolon */ 278 279 NextBrace = AsMatchValidToken (SubBuffer, Filename, '{', NULL); 280 NextSemicolon = AsMatchValidToken (SubBuffer, Filename, ';', NULL); 281 282 /* Next brace should appear before next semicolon */ 283 284 if ((!NextBrace) || 285 (NextSemicolon && (NextBrace > NextSemicolon))) 286 { 287 Gbl_MissingBraces++; 288 289 if (!Gbl_QuietMode) 290 { 291 printf ("Missing braces for <%s>, line %u: %s\n", 292 BraceInfo->Operator + 1, LineNumber, Filename); 293 } 294 } 295 296 return (SubBuffer); 297 } 298 } 299 300 /* No match, just return original buffer */ 301 302 return (Buffer); 303 } 304 305 306 /****************************************************************************** 307 * 308 * FUNCTION: AsMatchValidToken 309 * 310 * DESCRIPTION: Find the next matching token in the input buffer. 311 * 312 ******************************************************************************/ 313 314 static char * AsMatchValidToken(char * Buffer,char * Filename,char TargetChar,AS_SCAN_CALLBACK Callback)315 AsMatchValidToken ( 316 char *Buffer, 317 char *Filename, 318 char TargetChar, 319 AS_SCAN_CALLBACK Callback) 320 { 321 char *SubBuffer = Buffer; 322 char *StringStart; 323 UINT32 TotalLines; 324 325 326 TotalLines = 1; 327 NonAnsiCommentCount = 0; 328 329 /* Scan from current position up to the end if necessary */ 330 331 while (*SubBuffer) 332 { 333 /* Skip normal comments */ 334 335 if ((*SubBuffer == '/') && 336 (*(SubBuffer + 1) == '*')) 337 { 338 /* Must maintain line count */ 339 340 SubBuffer += 2; 341 while (strncmp ("*/", SubBuffer, 2)) 342 { 343 if (*SubBuffer == '\n') 344 { 345 TotalLines++; 346 } 347 SubBuffer++; 348 } 349 350 SubBuffer += 2; 351 continue; 352 } 353 354 /* Skip single quoted chars */ 355 356 if (*SubBuffer == '\'') 357 { 358 SubBuffer++; 359 if (!(*SubBuffer)) 360 { 361 break; 362 } 363 364 if (*SubBuffer == '\\') 365 { 366 SubBuffer++; 367 } 368 369 SubBuffer++; 370 continue; 371 } 372 373 /* Skip quoted strings */ 374 375 if (*SubBuffer == '"') 376 { 377 StringStart = SubBuffer; 378 SubBuffer++; 379 if (!(*SubBuffer)) 380 { 381 break; 382 } 383 384 while (*SubBuffer != '"') 385 { 386 if ((*SubBuffer == '\n') || 387 (!(*SubBuffer))) 388 { 389 AsPrint ("Unbalanced quoted string",1, Filename); 390 printf (" %.32s (line %u)\n", StringStart, TotalLines); 391 break; 392 } 393 394 /* Handle escapes within the string */ 395 396 if (*SubBuffer == '\\') 397 { 398 SubBuffer++; 399 } 400 401 SubBuffer++; 402 } 403 404 SubBuffer++; 405 continue; 406 } 407 408 /* Now we can check for a slash-slash comment */ 409 410 if ((*SubBuffer == '/') && 411 (*(SubBuffer + 1) == '/')) 412 { 413 NonAnsiCommentCount++; 414 415 /* Skip to end-of-line */ 416 417 while ((*SubBuffer != '\n') && 418 (*SubBuffer)) 419 { 420 SubBuffer++; 421 } 422 423 if (!(*SubBuffer)) 424 { 425 break; 426 } 427 428 if (*SubBuffer == '\n') 429 { 430 TotalLines++; 431 } 432 433 SubBuffer++; 434 continue; 435 } 436 437 /* Finally, check for a newline */ 438 439 if (*SubBuffer == '\n') 440 { 441 TotalLines++; 442 SubBuffer++; 443 continue; 444 } 445 446 /* Normal character, do the user actions */ 447 448 if (Callback) 449 { 450 SubBuffer = Callback (SubBuffer, Filename, TotalLines); 451 } 452 453 if (TargetChar && (*SubBuffer == TargetChar)) 454 { 455 return (SubBuffer); 456 } 457 458 SubBuffer++; 459 } 460 461 return (NULL); 462 } 463 464 465 /****************************************************************************** 466 * 467 * FUNCTION: AsRemoveExtraLines 468 * 469 * DESCRIPTION: Remove all extra lines at the start and end of the file. 470 * 471 ******************************************************************************/ 472 473 void AsRemoveExtraLines(char * FileBuffer,char * Filename)474 AsRemoveExtraLines ( 475 char *FileBuffer, 476 char *Filename) 477 { 478 char *FileEnd; 479 int Length; 480 481 482 /* Remove any extra lines at the start of the file */ 483 484 while (*FileBuffer == '\n') 485 { 486 printf ("Removing extra line at start of file: %s\n", Filename); 487 AsRemoveData (FileBuffer, FileBuffer + 1); 488 } 489 490 /* Remove any extra lines at the end of the file */ 491 492 Length = strlen (FileBuffer); 493 FileEnd = FileBuffer + (Length - 2); 494 495 while (*FileEnd == '\n') 496 { 497 printf ("Removing extra line at end of file: %s\n", Filename); 498 AsRemoveData (FileEnd, FileEnd + 1); 499 FileEnd--; 500 } 501 } 502 503 504 /****************************************************************************** 505 * 506 * FUNCTION: AsRemoveSpacesAfterPeriod 507 * 508 * DESCRIPTION: Remove an extra space after a period. 509 * 510 ******************************************************************************/ 511 512 void AsRemoveSpacesAfterPeriod(char * FileBuffer,char * Filename)513 AsRemoveSpacesAfterPeriod ( 514 char *FileBuffer, 515 char *Filename) 516 { 517 int ReplaceCount = 0; 518 char *Possible; 519 520 521 Possible = FileBuffer; 522 while (Possible) 523 { 524 Possible = strstr (Possible, ". "); 525 if (Possible) 526 { 527 if ((*(Possible -1) == '.') || 528 (*(Possible -1) == '\"') || 529 (*(Possible -1) == '\n')) 530 { 531 Possible += 3; 532 continue; 533 } 534 535 Possible = AsReplaceData (Possible, 3, ". ", 2); 536 ReplaceCount++; 537 } 538 } 539 540 if (ReplaceCount) 541 { 542 printf ("Removed %d extra blanks after a period: %s\n", 543 ReplaceCount, Filename); 544 } 545 } 546 547 548 /****************************************************************************** 549 * 550 * FUNCTION: AsMatchExactWord 551 * 552 * DESCRIPTION: Check previous and next characters for whitespace 553 * 554 ******************************************************************************/ 555 556 BOOLEAN AsMatchExactWord(char * Word,UINT32 WordLength)557 AsMatchExactWord ( 558 char *Word, 559 UINT32 WordLength) 560 { 561 char NextChar; 562 char PrevChar; 563 564 565 NextChar = Word[WordLength]; 566 PrevChar = * (Word -1); 567 568 if (isalnum ((int) NextChar) || 569 (NextChar == '_') || 570 isalnum ((int) PrevChar) || 571 (PrevChar == '_')) 572 { 573 return (FALSE); 574 } 575 576 return (TRUE); 577 } 578 579 580 /****************************************************************************** 581 * 582 * FUNCTION: AsPrint 583 * 584 * DESCRIPTION: Common formatted print 585 * 586 ******************************************************************************/ 587 588 void AsPrint(char * Message,UINT32 Count,char * Filename)589 AsPrint ( 590 char *Message, 591 UINT32 Count, 592 char *Filename) 593 { 594 595 if (Gbl_QuietMode) 596 { 597 return; 598 } 599 600 printf ("-- %4u %28.28s : %s\n", Count, Message, Filename); 601 } 602 603 604 /****************************************************************************** 605 * 606 * FUNCTION: AsTrimLines 607 * 608 * DESCRIPTION: Remove extra blanks from the end of source lines. Does not 609 * check for tabs. 610 * 611 ******************************************************************************/ 612 613 void AsTrimLines(char * Buffer,char * Filename)614 AsTrimLines ( 615 char *Buffer, 616 char *Filename) 617 { 618 char *SubBuffer = Buffer; 619 char *StartWhiteSpace = NULL; 620 UINT32 SpaceCount = 0; 621 622 623 while (*SubBuffer) 624 { 625 while (*SubBuffer != '\n') 626 { 627 if (!*SubBuffer) 628 { 629 goto Exit; 630 } 631 632 if (*SubBuffer == ' ') 633 { 634 if (!StartWhiteSpace) 635 { 636 StartWhiteSpace = SubBuffer; 637 } 638 } 639 else 640 { 641 StartWhiteSpace = NULL; 642 } 643 644 SubBuffer++; 645 } 646 647 if (StartWhiteSpace) 648 { 649 SpaceCount += (SubBuffer - StartWhiteSpace); 650 651 /* Remove the spaces */ 652 653 SubBuffer = AsRemoveData (StartWhiteSpace, SubBuffer); 654 StartWhiteSpace = NULL; 655 } 656 657 SubBuffer++; 658 } 659 660 661 Exit: 662 if (SpaceCount) 663 { 664 Gbl_MadeChanges = TRUE; 665 AsPrint ("Extraneous spaces removed", SpaceCount, Filename); 666 } 667 } 668 669 670 /****************************************************************************** 671 * 672 * FUNCTION: AsTrimWhitespace 673 * 674 * DESCRIPTION: Remove "excess" blank lines - any more than 2 blank lines. 675 * this can happen during the translation when lines are removed. 676 * 677 ******************************************************************************/ 678 679 void AsTrimWhitespace(char * Buffer)680 AsTrimWhitespace ( 681 char *Buffer) 682 { 683 char *SubBuffer; 684 int ReplaceCount = 1; 685 686 687 while (ReplaceCount) 688 { 689 ReplaceCount = AsReplaceString ("\n\n\n\n", "\n\n\n", 690 REPLACE_SUBSTRINGS, Buffer); 691 } 692 693 /* 694 * Check for exactly one blank line after the copyright header 695 */ 696 697 /* Find the header */ 698 699 SubBuffer = strstr (Buffer, HeaderBegin); 700 if (!SubBuffer) 701 { 702 return; 703 } 704 705 /* Find the end of the header */ 706 707 SubBuffer = strstr (SubBuffer, "*/"); 708 SubBuffer = AsSkipPastChar (SubBuffer, '\n'); 709 710 /* Replace a double blank line with a single */ 711 712 if (!strncmp (SubBuffer, "\n\n", 2)) 713 { 714 AsReplaceData (SubBuffer, 2, "\n", 1); 715 AcpiOsPrintf ("Found multiple blank lines after copyright\n"); 716 } 717 718 /* If no blank line after header, insert one */ 719 720 else if (*SubBuffer != '\n') 721 { 722 AsInsertData (SubBuffer, "\n", 1); 723 AcpiOsPrintf ("Inserted blank line after copyright\n"); 724 } 725 } 726 727 728 /****************************************************************************** 729 * 730 * FUNCTION: AsReplaceHeader 731 * 732 * DESCRIPTION: Replace the default Intel legal header with a new header 733 * 734 ******************************************************************************/ 735 736 void AsReplaceHeader(char * Buffer,char * NewHeader)737 AsReplaceHeader ( 738 char *Buffer, 739 char *NewHeader) 740 { 741 char *SubBuffer; 742 char *TokenEnd; 743 744 745 /* Find the original header */ 746 747 SubBuffer = strstr (Buffer, HeaderBegin); 748 if (!SubBuffer) 749 { 750 return; 751 } 752 753 /* Find the end of the original header */ 754 755 TokenEnd = strstr (SubBuffer, "*/"); 756 TokenEnd = AsSkipPastChar (TokenEnd, '\n'); 757 758 /* Delete old header, insert new one */ 759 760 AsReplaceData (SubBuffer, TokenEnd - SubBuffer, 761 NewHeader, strlen (NewHeader)); 762 } 763 764 765 /****************************************************************************** 766 * 767 * FUNCTION: AsDoSpdxHeader 768 * 769 * DESCRIPTION: Replace the default Intel legal header with a new header 770 * 771 ******************************************************************************/ 772 773 void AsDoSpdxHeader(char * Buffer,char * SpdxHeader)774 AsDoSpdxHeader ( 775 char *Buffer, 776 char *SpdxHeader) 777 { 778 char *SubBuffer; 779 780 781 /* Place an SPDX header at the very top */ 782 783 AsReplaceData (Buffer, 0, 784 SpdxHeader, strlen (SpdxHeader)); 785 786 /* Place an Intel copyright notice in the module header */ 787 788 SubBuffer = strstr (Buffer, MODULE_HEADER_END); 789 if (!SubBuffer) 790 { 791 return; 792 } 793 794 AsReplaceData (SubBuffer, strlen (MODULE_HEADER_END), 795 CopyRightHeaderEnd, strlen (CopyRightHeaderEnd)); 796 } 797 798 /****************************************************************************** 799 * 800 * FUNCTION: AsReplaceString 801 * 802 * DESCRIPTION: Replace all instances of a target string with a replacement 803 * string. Returns count of the strings replaced. 804 * 805 ******************************************************************************/ 806 807 int AsReplaceString(char * Target,char * Replacement,UINT8 Type,char * Buffer)808 AsReplaceString ( 809 char *Target, 810 char *Replacement, 811 UINT8 Type, 812 char *Buffer) 813 { 814 char *SubString1; 815 char *SubString2; 816 char *SubBuffer; 817 int TargetLength; 818 int ReplacementLength; 819 int ReplaceCount = 0; 820 821 822 TargetLength = strlen (Target); 823 ReplacementLength = strlen (Replacement); 824 825 SubBuffer = Buffer; 826 SubString1 = Buffer; 827 828 while (SubString1) 829 { 830 /* Find the target string */ 831 832 SubString1 = strstr (SubBuffer, Target); 833 if (!SubString1) 834 { 835 return (ReplaceCount); 836 } 837 838 /* 839 * Check for translation escape string -- means to ignore 840 * blocks of code while replacing 841 */ 842 if (Gbl_IgnoreTranslationEscapes) 843 { 844 SubString2 = NULL; 845 } 846 else 847 { 848 SubString2 = strstr (SubBuffer, AS_START_IGNORE); 849 } 850 851 if ((SubString2) && 852 (SubString2 < SubString1)) 853 { 854 /* Find end of the escape block starting at "Substring2" */ 855 856 SubString2 = strstr (SubString2, AS_STOP_IGNORE); 857 if (!SubString2) 858 { 859 /* Didn't find terminator */ 860 861 return (ReplaceCount); 862 } 863 864 /* Move buffer to end of escape block and continue */ 865 866 SubBuffer = SubString2; 867 } 868 869 /* Do the actual replace if the target was found */ 870 871 else 872 { 873 if ((Type & REPLACE_MASK) == REPLACE_WHOLE_WORD) 874 { 875 if (!AsMatchExactWord (SubString1, TargetLength)) 876 { 877 SubBuffer = SubString1 + 1; 878 continue; 879 } 880 } 881 882 SubBuffer = AsReplaceData (SubString1, TargetLength, 883 Replacement, ReplacementLength); 884 885 if ((Type & EXTRA_INDENT_C) && 886 (!Gbl_StructDefs)) 887 { 888 SubBuffer = AsInsertData (SubBuffer, " ", 8); 889 } 890 891 ReplaceCount++; 892 } 893 } 894 895 return (ReplaceCount); 896 } 897 898 899 /****************************************************************************** 900 * 901 * FUNCTION: AsConvertToLineFeeds 902 * 903 * DESCRIPTION: Convert all CR/LF pairs to LF only. 904 * 905 ******************************************************************************/ 906 907 void AsConvertToLineFeeds(char * Buffer)908 AsConvertToLineFeeds ( 909 char *Buffer) 910 { 911 char *SubString; 912 char *SubBuffer; 913 914 915 SubBuffer = Buffer; 916 SubString = Buffer; 917 918 while (SubString) 919 { 920 /* Find the target string */ 921 922 SubString = strstr (SubBuffer, "\r\n"); 923 if (!SubString) 924 { 925 return; 926 } 927 928 SubBuffer = AsReplaceData (SubString, 1, NULL, 0); 929 } 930 } 931 932 933 /****************************************************************************** 934 * 935 * FUNCTION: AsInsertCarriageReturns 936 * 937 * DESCRIPTION: Convert lone LFs to CR/LF pairs. 938 * 939 ******************************************************************************/ 940 941 void AsInsertCarriageReturns(char * Buffer)942 AsInsertCarriageReturns ( 943 char *Buffer) 944 { 945 char *SubString; 946 char *SubBuffer; 947 948 949 SubBuffer = Buffer; 950 SubString = Buffer; 951 952 while (SubString) 953 { 954 /* Find the target string */ 955 956 SubString = strstr (SubBuffer, "\n"); 957 if (!SubString) 958 { 959 return; 960 } 961 962 SubBuffer = AsInsertData (SubString, "\r", 1); 963 SubBuffer += 1; 964 } 965 } 966 967 968 /****************************************************************************** 969 * 970 * FUNCTION: AsBracesOnSameLine 971 * 972 * DESCRIPTION: Move opening braces up to the same line as an if, for, else, 973 * or while statement (leave function opening brace on separate 974 * line). 975 * 976 ******************************************************************************/ 977 978 void AsBracesOnSameLine(char * Buffer)979 AsBracesOnSameLine ( 980 char *Buffer) 981 { 982 char *SubBuffer = Buffer; 983 char *Beginning; 984 char *StartOfThisLine; 985 char *Next; 986 BOOLEAN BlockBegin = TRUE; 987 988 989 while (*SubBuffer) 990 { 991 /* Ignore comments */ 992 993 if ((SubBuffer[0] == '/') && 994 (SubBuffer[1] == '*')) 995 { 996 SubBuffer = strstr (SubBuffer, "*/"); 997 if (!SubBuffer) 998 { 999 return; 1000 } 1001 1002 SubBuffer += 2; 1003 continue; 1004 } 1005 1006 /* Ignore quoted strings */ 1007 1008 if (*SubBuffer == '\"') 1009 { 1010 SubBuffer++; 1011 SubBuffer = AsSkipPastChar (SubBuffer, '\"'); 1012 if (!SubBuffer) 1013 { 1014 return; 1015 } 1016 } 1017 1018 if (!strncmp ("\n}", SubBuffer, 2)) 1019 { 1020 /* 1021 * A newline followed by a closing brace closes a function 1022 * or struct or initializer block 1023 */ 1024 BlockBegin = TRUE; 1025 } 1026 1027 /* 1028 * Move every standalone brace up to the previous line 1029 * Check for digit will ignore initializer lists surrounded by braces. 1030 * This will work until we we need more complex detection. 1031 */ 1032 if ((*SubBuffer == '{') && !isdigit ((int) SubBuffer[1])) 1033 { 1034 if (BlockBegin) 1035 { 1036 BlockBegin = FALSE; 1037 } 1038 else 1039 { 1040 /* 1041 * Backup to previous non-whitespace 1042 */ 1043 Beginning = SubBuffer - 1; 1044 while ((*Beginning == ' ') || 1045 (*Beginning == '\n')) 1046 { 1047 Beginning--; 1048 } 1049 1050 StartOfThisLine = Beginning; 1051 while (*StartOfThisLine != '\n') 1052 { 1053 StartOfThisLine--; 1054 } 1055 1056 /* 1057 * Move the brace up to the previous line, UNLESS: 1058 * 1059 * 1) There is a conditional compile on the line (starts with '#') 1060 * 2) Previous line ends with an '=' (Start of initializer block) 1061 * 3) Previous line ends with a comma (part of an init list) 1062 * 4) Previous line ends with a backslash (part of a macro) 1063 */ 1064 if ((StartOfThisLine[1] != '#') && 1065 (*Beginning != '\\') && 1066 (*Beginning != '/') && 1067 (*Beginning != '{') && 1068 (*Beginning != '=') && 1069 (*Beginning != ',')) 1070 { 1071 Beginning++; 1072 SubBuffer++; 1073 1074 Gbl_MadeChanges = TRUE; 1075 1076 #ifdef ADD_EXTRA_WHITESPACE 1077 AsReplaceData (Beginning, SubBuffer - Beginning, " {\n", 3); 1078 #else 1079 /* Find non-whitespace start of next line */ 1080 1081 Next = SubBuffer + 1; 1082 while ((*Next == ' ') || 1083 (*Next == '\t')) 1084 { 1085 Next++; 1086 } 1087 1088 /* Find non-whitespace start of this line */ 1089 1090 StartOfThisLine++; 1091 while ((*StartOfThisLine == ' ') || 1092 (*StartOfThisLine == '\t')) 1093 { 1094 StartOfThisLine++; 1095 } 1096 1097 /* 1098 * Must be a single-line comment to need more whitespace 1099 * Even then, we don't need more if the previous statement 1100 * is an "else". 1101 */ 1102 if ((Next[0] == '/') && 1103 (Next[1] == '*') && 1104 (Next[2] != '\n') && 1105 1106 (!strncmp (StartOfThisLine, "else if", 7) || 1107 !strncmp (StartOfThisLine, "else while", 10) || 1108 strncmp (StartOfThisLine, "else", 4))) 1109 { 1110 AsReplaceData (Beginning, SubBuffer - Beginning, " {\n", 3); 1111 } 1112 else 1113 { 1114 AsReplaceData (Beginning, SubBuffer - Beginning, " {", 2); 1115 } 1116 #endif 1117 } 1118 } 1119 } 1120 1121 SubBuffer++; 1122 } 1123 } 1124 1125 1126 /****************************************************************************** 1127 * 1128 * FUNCTION: AsTabify4 1129 * 1130 * DESCRIPTION: Convert the text to tabbed text. Alignment of text is 1131 * preserved. 1132 * 1133 ******************************************************************************/ 1134 1135 void AsTabify4(char * Buffer)1136 AsTabify4 ( 1137 char *Buffer) 1138 { 1139 char *SubBuffer = Buffer; 1140 char *NewSubBuffer; 1141 UINT32 SpaceCount = 0; 1142 UINT32 Column = 0; 1143 1144 1145 while (*SubBuffer) 1146 { 1147 if (*SubBuffer == '\n') 1148 { 1149 Column = 0; 1150 } 1151 else 1152 { 1153 Column++; 1154 } 1155 1156 /* Ignore comments */ 1157 1158 if ((SubBuffer[0] == '/') && 1159 (SubBuffer[1] == '*')) 1160 { 1161 SubBuffer = strstr (SubBuffer, "*/"); 1162 if (!SubBuffer) 1163 { 1164 return; 1165 } 1166 1167 SubBuffer += 2; 1168 continue; 1169 } 1170 1171 /* Ignore quoted strings */ 1172 1173 if (*SubBuffer == '\"') 1174 { 1175 SubBuffer++; 1176 SubBuffer = AsSkipPastChar (SubBuffer, '\"'); 1177 if (!SubBuffer) 1178 { 1179 return; 1180 } 1181 SpaceCount = 0; 1182 } 1183 1184 if (*SubBuffer == ' ') 1185 { 1186 SpaceCount++; 1187 1188 if (SpaceCount >= 4) 1189 { 1190 SpaceCount = 0; 1191 1192 NewSubBuffer = (SubBuffer + 1) - 4; 1193 *NewSubBuffer = '\t'; 1194 NewSubBuffer++; 1195 1196 /* Remove the spaces */ 1197 1198 SubBuffer = AsRemoveData (NewSubBuffer, SubBuffer + 1); 1199 } 1200 1201 if ((Column % 4) == 0) 1202 { 1203 SpaceCount = 0; 1204 } 1205 } 1206 else 1207 { 1208 SpaceCount = 0; 1209 } 1210 1211 SubBuffer++; 1212 } 1213 } 1214 1215 1216 /****************************************************************************** 1217 * 1218 * FUNCTION: AsTabify8 1219 * 1220 * DESCRIPTION: Convert the text to tabbed text. Alignment of text is 1221 * preserved. 1222 * 1223 ******************************************************************************/ 1224 1225 void AsTabify8(char * Buffer)1226 AsTabify8 ( 1227 char *Buffer) 1228 { 1229 char *SubBuffer = Buffer; 1230 char *NewSubBuffer; 1231 char *CommentEnd = NULL; 1232 UINT32 SpaceCount = 0; 1233 UINT32 TabCount = 0; 1234 UINT32 LastLineTabCount = 0; 1235 UINT32 LastLineColumnStart = 0; 1236 UINT32 ThisColumnStart = 0; 1237 UINT32 ThisTabCount = 0; 1238 char *FirstNonBlank = NULL; 1239 1240 1241 while (*SubBuffer) 1242 { 1243 if (*SubBuffer == '\n') 1244 { 1245 /* This is a standalone blank line */ 1246 1247 FirstNonBlank = NULL; 1248 SpaceCount = 0; 1249 TabCount = 0; 1250 SubBuffer++; 1251 continue; 1252 } 1253 1254 if (!FirstNonBlank) 1255 { 1256 /* Find the first non-blank character on this line */ 1257 1258 FirstNonBlank = SubBuffer; 1259 while (*FirstNonBlank == ' ') 1260 { 1261 FirstNonBlank++; 1262 } 1263 1264 /* 1265 * This mechanism limits the difference in tab counts from 1266 * line to line. It helps avoid the situation where a second 1267 * continuation line (which was indented correctly for tabs=4) would 1268 * get indented off the screen if we just blindly converted to tabs. 1269 */ 1270 ThisColumnStart = FirstNonBlank - SubBuffer; 1271 1272 if (LastLineTabCount == 0) 1273 { 1274 ThisTabCount = 0; 1275 } 1276 else if (ThisColumnStart == LastLineColumnStart) 1277 { 1278 ThisTabCount = LastLineTabCount -1; 1279 } 1280 else 1281 { 1282 ThisTabCount = LastLineTabCount + 1; 1283 } 1284 } 1285 1286 /* Check if we are in a comment */ 1287 1288 if ((SubBuffer[0] == '*') && 1289 (SubBuffer[1] == '/')) 1290 { 1291 SpaceCount = 0; 1292 SubBuffer += 2; 1293 1294 if (*SubBuffer == '\n') 1295 { 1296 if (TabCount > 0) 1297 { 1298 LastLineTabCount = TabCount; 1299 TabCount = 0; 1300 } 1301 1302 FirstNonBlank = NULL; 1303 LastLineColumnStart = ThisColumnStart; 1304 SubBuffer++; 1305 } 1306 1307 continue; 1308 } 1309 1310 /* Check for comment open */ 1311 1312 if ((SubBuffer[0] == '/') && 1313 (SubBuffer[1] == '*')) 1314 { 1315 /* Find the end of the comment, it must exist */ 1316 1317 CommentEnd = strstr (SubBuffer, "*/"); 1318 if (!CommentEnd) 1319 { 1320 return; 1321 } 1322 1323 /* Toss the rest of this line or single-line comment */ 1324 1325 while ((SubBuffer < CommentEnd) && 1326 (*SubBuffer != '\n')) 1327 { 1328 SubBuffer++; 1329 } 1330 1331 if (*SubBuffer == '\n') 1332 { 1333 if (TabCount > 0) 1334 { 1335 LastLineTabCount = TabCount; 1336 TabCount = 0; 1337 } 1338 1339 FirstNonBlank = NULL; 1340 LastLineColumnStart = ThisColumnStart; 1341 } 1342 1343 SpaceCount = 0; 1344 continue; 1345 } 1346 1347 /* Ignore quoted strings */ 1348 1349 if ((!CommentEnd) && (*SubBuffer == '\"')) 1350 { 1351 SubBuffer++; 1352 SubBuffer = AsSkipPastChar (SubBuffer, '\"'); 1353 if (!SubBuffer) 1354 { 1355 return; 1356 } 1357 1358 SpaceCount = 0; 1359 } 1360 1361 if (*SubBuffer != ' ') 1362 { 1363 /* Not a space, skip to end of line */ 1364 1365 SubBuffer = AsSkipUntilChar (SubBuffer, '\n'); 1366 if (!SubBuffer) 1367 { 1368 return; 1369 } 1370 if (TabCount > 0) 1371 { 1372 LastLineTabCount = TabCount; 1373 TabCount = 0; 1374 } 1375 1376 FirstNonBlank = NULL; 1377 LastLineColumnStart = ThisColumnStart; 1378 SpaceCount = 0; 1379 } 1380 else 1381 { 1382 /* Another space */ 1383 1384 SpaceCount++; 1385 1386 if (SpaceCount >= 4) 1387 { 1388 /* Replace this group of spaces with a tab character */ 1389 1390 SpaceCount = 0; 1391 1392 NewSubBuffer = SubBuffer - 3; 1393 1394 if (TabCount <= ThisTabCount ? (ThisTabCount +1) : 0) 1395 { 1396 *NewSubBuffer = '\t'; 1397 NewSubBuffer++; 1398 SubBuffer++; 1399 TabCount++; 1400 } 1401 1402 /* Remove the spaces */ 1403 1404 SubBuffer = AsRemoveData (NewSubBuffer, SubBuffer); 1405 continue; 1406 } 1407 } 1408 1409 SubBuffer++; 1410 } 1411 } 1412 1413 1414 /****************************************************************************** 1415 * 1416 * FUNCTION: AsCountLines 1417 * 1418 * DESCRIPTION: Count the number of lines in the input buffer. Also count 1419 * the number of long lines (lines longer than 80 chars). 1420 * 1421 ******************************************************************************/ 1422 1423 static UINT32 AsCountLines(char * Buffer,char * Filename)1424 AsCountLines ( 1425 char *Buffer, 1426 char *Filename) 1427 { 1428 char *SubBuffer = Buffer; 1429 char *EndOfLine; 1430 UINT32 LineCount = 0; 1431 UINT32 LongLineCount = 0; 1432 1433 1434 while (*SubBuffer) 1435 { 1436 EndOfLine = AsSkipUntilChar (SubBuffer, '\n'); 1437 if (!EndOfLine) 1438 { 1439 Gbl_TotalLines += LineCount; 1440 return (LineCount); 1441 } 1442 1443 if ((EndOfLine - SubBuffer) > 80) 1444 { 1445 LongLineCount++; 1446 VERBOSE_PRINT (("long: %.80s\n", SubBuffer)); 1447 } 1448 1449 LineCount++; 1450 SubBuffer = EndOfLine + 1; 1451 } 1452 1453 if (LongLineCount) 1454 { 1455 VERBOSE_PRINT (("%u Lines longer than 80 found in %s\n", 1456 LongLineCount, Filename)); 1457 1458 Gbl_LongLines += LongLineCount; 1459 } 1460 1461 Gbl_TotalLines += LineCount; 1462 return (LineCount); 1463 } 1464 1465 1466 /****************************************************************************** 1467 * 1468 * FUNCTION: AsCountTabs 1469 * 1470 * DESCRIPTION: Simply count the number of tabs in the input file buffer 1471 * 1472 ******************************************************************************/ 1473 1474 void AsCountTabs(char * Buffer,char * Filename)1475 AsCountTabs ( 1476 char *Buffer, 1477 char *Filename) 1478 { 1479 UINT32 i; 1480 UINT32 TabCount = 0; 1481 1482 1483 for (i = 0; Buffer[i]; i++) 1484 { 1485 if (Buffer[i] == '\t') 1486 { 1487 TabCount++; 1488 } 1489 } 1490 1491 if (TabCount) 1492 { 1493 AsPrint ("Tabs found", TabCount, Filename); 1494 Gbl_Tabs += TabCount; 1495 } 1496 1497 AsCountLines (Buffer, Filename); 1498 } 1499 1500 1501 /****************************************************************************** 1502 * 1503 * FUNCTION: AsCountSourceLines 1504 * 1505 * DESCRIPTION: Count the number of C source lines. Defined by 1) not a 1506 * comment, and 2) not a blank line. 1507 * 1508 ******************************************************************************/ 1509 1510 void AsCountSourceLines(char * Buffer,char * Filename)1511 AsCountSourceLines ( 1512 char *Buffer, 1513 char *Filename) 1514 { 1515 char *SubBuffer = Buffer; 1516 UINT32 LineCount = 0; 1517 UINT32 WhiteCount = 0; 1518 UINT32 CommentCount = 0; 1519 1520 1521 while (*SubBuffer) 1522 { 1523 /* Detect comments (// comments are not used, non-ansii) */ 1524 1525 if ((SubBuffer[0] == '/') && 1526 (SubBuffer[1] == '*')) 1527 { 1528 SubBuffer += 2; 1529 1530 /* First line of multi-line comment is often just whitespace */ 1531 1532 if (SubBuffer[0] == '\n') 1533 { 1534 WhiteCount++; 1535 SubBuffer++; 1536 } 1537 else 1538 { 1539 CommentCount++; 1540 } 1541 1542 /* Find end of comment */ 1543 1544 while (SubBuffer[0] && SubBuffer[1] && 1545 !(((SubBuffer[0] == '*') && 1546 (SubBuffer[1] == '/')))) 1547 { 1548 if (SubBuffer[0] == '\n') 1549 { 1550 CommentCount++; 1551 } 1552 1553 SubBuffer++; 1554 } 1555 } 1556 1557 /* A linefeed followed by a non-linefeed is a valid source line */ 1558 1559 else if ((SubBuffer[0] == '\n') && 1560 (SubBuffer[1] != '\n')) 1561 { 1562 LineCount++; 1563 } 1564 1565 /* Two back-to-back linefeeds indicate a whitespace line */ 1566 1567 else if ((SubBuffer[0] == '\n') && 1568 (SubBuffer[1] == '\n')) 1569 { 1570 WhiteCount++; 1571 } 1572 1573 SubBuffer++; 1574 } 1575 1576 /* Adjust comment count for legal header */ 1577 1578 if (Gbl_HeaderSize < CommentCount) 1579 { 1580 CommentCount -= Gbl_HeaderSize; 1581 Gbl_HeaderLines += Gbl_HeaderSize; 1582 } 1583 1584 Gbl_SourceLines += LineCount; 1585 Gbl_WhiteLines += WhiteCount; 1586 Gbl_CommentLines += CommentCount; 1587 1588 VERBOSE_PRINT (("%u Comment %u White %u Code %u Lines in %s\n", 1589 CommentCount, WhiteCount, LineCount, 1590 LineCount + WhiteCount + CommentCount, Filename)); 1591 } 1592 1593 1594 /****************************************************************************** 1595 * 1596 * FUNCTION: AsInsertPrefix 1597 * 1598 * DESCRIPTION: Insert struct or union prefixes 1599 * 1600 ******************************************************************************/ 1601 1602 void AsInsertPrefix(char * Buffer,char * Keyword,UINT8 Type)1603 AsInsertPrefix ( 1604 char *Buffer, 1605 char *Keyword, 1606 UINT8 Type) 1607 { 1608 char *SubString; 1609 char *SubBuffer; 1610 char *EndKeyword; 1611 int InsertLength; 1612 char *InsertString; 1613 int TrailingSpaces; 1614 char LowerKeyword[128]; 1615 int KeywordLength; 1616 char *LineStart; 1617 BOOLEAN FoundPrefix; 1618 1619 1620 switch (Type) 1621 { 1622 case SRC_TYPE_STRUCT: 1623 1624 InsertString = "struct "; 1625 break; 1626 1627 case SRC_TYPE_UNION: 1628 1629 InsertString = "union "; 1630 break; 1631 1632 default: 1633 1634 return; 1635 } 1636 1637 strcpy (LowerKeyword, Keyword); 1638 AcpiUtStrlwr (LowerKeyword); 1639 1640 SubBuffer = Buffer; 1641 SubString = Buffer; 1642 InsertLength = strlen (InsertString); 1643 KeywordLength = strlen (Keyword); 1644 1645 1646 while (SubString) 1647 { 1648 /* Find an instance of the keyword */ 1649 1650 SubString = strstr (SubBuffer, LowerKeyword); 1651 if (!SubString) 1652 { 1653 return; 1654 } 1655 1656 SubBuffer = SubString; 1657 1658 /* Must be standalone word, not a substring */ 1659 1660 if (AsMatchExactWord (SubString, KeywordLength)) 1661 { 1662 /* Make sure the keyword isn't already prefixed with the insert */ 1663 1664 /* We find the beginning of the line and try to find the InsertString 1665 * from LineStart up to SubBuffer (our keyword). If it's not there, 1666 * we assume it doesn't have a prefix; this is a limitation, as having 1667 * a keyword on another line is absolutely valid C. 1668 */ 1669 1670 LineStart = SubString; 1671 FoundPrefix = FALSE; 1672 1673 /* Find the start of the line */ 1674 1675 while (LineStart > Buffer) 1676 { 1677 if (*LineStart == '\n') 1678 { 1679 LineStart++; 1680 break; 1681 } 1682 1683 LineStart--; 1684 } 1685 1686 /* Try to find InsertString from the start of the line up to SubBuffer */ 1687 /* Note that this algorithm is a bit naive. */ 1688 1689 while (SubBuffer > LineStart) 1690 { 1691 if (*LineStart != *InsertString) 1692 { 1693 LineStart++; 1694 continue; 1695 } 1696 1697 if (strncmp (LineStart++, InsertString, InsertLength)) 1698 { 1699 continue; 1700 } 1701 1702 FoundPrefix = TRUE; 1703 LineStart += InsertLength - 1; 1704 1705 /* Now check if there's non-whitespace between InsertString and SubBuffer, as that 1706 * means it's not a valid prefix in this case. */ 1707 1708 while (LineStart != SubBuffer) 1709 { 1710 if (!strchr (" \t\r\n", *LineStart)) 1711 { 1712 /* We found non-whitespace while traversing up to SubBuffer, 1713 * so this isn't a prefix. 1714 */ 1715 FoundPrefix = FALSE; 1716 break; 1717 } 1718 1719 LineStart++; 1720 } 1721 } 1722 1723 if (FoundPrefix) 1724 { 1725 /* Add spaces if not already at the end-of-line */ 1726 1727 if (*(SubBuffer + KeywordLength) != '\n') 1728 { 1729 /* Already present, add spaces after to align structure members */ 1730 1731 #if 0 1732 /* ONLY FOR C FILES */ 1733 AsInsertData (SubBuffer + KeywordLength, " ", 8); 1734 #endif 1735 } 1736 goto Next; 1737 } 1738 1739 /* Make sure the keyword isn't at the end of a struct/union */ 1740 /* Note: This code depends on a single space after the brace */ 1741 1742 if (*(SubString - 2) == '}') 1743 { 1744 goto Next; 1745 } 1746 1747 /* Prefix the keyword with the insert string */ 1748 1749 Gbl_MadeChanges = TRUE; 1750 1751 /* Is there room for insertion */ 1752 1753 EndKeyword = SubString + strlen (LowerKeyword); 1754 1755 TrailingSpaces = 0; 1756 while (EndKeyword[TrailingSpaces] == ' ') 1757 { 1758 TrailingSpaces++; 1759 } 1760 1761 /* 1762 * Use "if (TrailingSpaces > 1)" if we want to ignore casts 1763 */ 1764 SubBuffer = SubString + InsertLength; 1765 1766 if (TrailingSpaces > InsertLength) 1767 { 1768 /* Insert the keyword */ 1769 1770 memmove (SubBuffer, SubString, KeywordLength); 1771 1772 /* Insert the keyword */ 1773 1774 memmove (SubString, InsertString, InsertLength); 1775 } 1776 else 1777 { 1778 AsInsertData (SubString, InsertString, InsertLength); 1779 } 1780 } 1781 1782 Next: 1783 SubBuffer += KeywordLength; 1784 } 1785 } 1786 1787 #ifdef ACPI_FUTURE_IMPLEMENTATION 1788 /****************************************************************************** 1789 * 1790 * FUNCTION: AsTrimComments 1791 * 1792 * DESCRIPTION: Finds 3-line comments with only a single line of text 1793 * 1794 ******************************************************************************/ 1795 1796 void AsTrimComments(char * Buffer,char * Filename)1797 AsTrimComments ( 1798 char *Buffer, 1799 char *Filename) 1800 { 1801 char *SubBuffer = Buffer; 1802 char *Ptr1; 1803 char *Ptr2; 1804 UINT32 LineCount; 1805 UINT32 ShortCommentCount = 0; 1806 1807 1808 while (1) 1809 { 1810 /* Find comment open, within procedure level */ 1811 1812 SubBuffer = strstr (SubBuffer, " /*"); 1813 if (!SubBuffer) 1814 { 1815 goto Exit; 1816 } 1817 1818 /* Find comment terminator */ 1819 1820 Ptr1 = strstr (SubBuffer, "*/"); 1821 if (!Ptr1) 1822 { 1823 goto Exit; 1824 } 1825 1826 /* Find next EOL (from original buffer) */ 1827 1828 Ptr2 = strstr (SubBuffer, "\n"); 1829 if (!Ptr2) 1830 { 1831 goto Exit; 1832 } 1833 1834 /* Ignore one-line comments */ 1835 1836 if (Ptr1 < Ptr2) 1837 { 1838 /* Normal comment, ignore and continue; */ 1839 1840 SubBuffer = Ptr2; 1841 continue; 1842 } 1843 1844 /* Examine multi-line comment */ 1845 1846 LineCount = 1; 1847 while (Ptr1 > Ptr2) 1848 { 1849 /* Find next EOL */ 1850 1851 Ptr2++; 1852 Ptr2 = strstr (Ptr2, "\n"); 1853 if (!Ptr2) 1854 { 1855 goto Exit; 1856 } 1857 1858 LineCount++; 1859 } 1860 1861 SubBuffer = Ptr1; 1862 1863 if (LineCount <= 3) 1864 { 1865 ShortCommentCount++; 1866 } 1867 } 1868 1869 1870 Exit: 1871 1872 if (ShortCommentCount) 1873 { 1874 AsPrint ("Short Comments found", ShortCommentCount, Filename); 1875 } 1876 } 1877 #endif 1878 1879 #ifdef ACPI_UNUSED_FUNCTIONS 1880 /****************************************************************************** 1881 * 1882 * FUNCTION: AsCheckAndSkipLiterals 1883 * 1884 * DESCRIPTION: Generic routine to skip comments and quoted string literals. 1885 * Keeps a line count. 1886 * 1887 ******************************************************************************/ 1888 1889 static char * 1890 AsCheckAndSkipLiterals ( 1891 char *Buffer, 1892 UINT32 *TotalLines); 1893 1894 1895 static char * AsCheckAndSkipLiterals(char * Buffer,UINT32 * TotalLines)1896 AsCheckAndSkipLiterals ( 1897 char *Buffer, 1898 UINT32 *TotalLines) 1899 { 1900 UINT32 NewLines = 0; 1901 char *SubBuffer = Buffer; 1902 char *LiteralEnd; 1903 1904 1905 /* Ignore comments */ 1906 1907 if ((SubBuffer[0] == '/') && 1908 (SubBuffer[1] == '*')) 1909 { 1910 LiteralEnd = strstr (SubBuffer, "*/"); 1911 SubBuffer += 2; /* Get past comment opening */ 1912 1913 if (!LiteralEnd) 1914 { 1915 return (SubBuffer); 1916 } 1917 1918 while (SubBuffer < LiteralEnd) 1919 { 1920 if (*SubBuffer == '\n') 1921 { 1922 NewLines++; 1923 } 1924 1925 SubBuffer++; 1926 } 1927 1928 SubBuffer += 2; /* Get past comment close */ 1929 } 1930 1931 /* Ignore quoted strings */ 1932 1933 else if (*SubBuffer == '\"') 1934 { 1935 SubBuffer++; 1936 LiteralEnd = AsSkipPastChar (SubBuffer, '\"'); 1937 if (!LiteralEnd) 1938 { 1939 return (SubBuffer); 1940 } 1941 } 1942 1943 if (TotalLines) 1944 { 1945 (*TotalLines) += NewLines; 1946 } 1947 return (SubBuffer); 1948 } 1949 #endif 1950