Home | History | Annotate | Line # | Download | only in acpisrc
asconvrt.c revision 1.1.1.2
      1 
      2 /******************************************************************************
      3  *
      4  * Module Name: asconvrt - Source conversion code
      5  *
      6  *****************************************************************************/
      7 
      8 /*
      9  * Copyright (C) 2000 - 2011, 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 #include "acpisrc.h"
     46 
     47 /* Local prototypes */
     48 
     49 char *
     50 AsCheckAndSkipLiterals (
     51     char                    *Buffer,
     52     UINT32                  *TotalLines);
     53 
     54 UINT32
     55 AsCountLines (
     56     char                    *Buffer,
     57     char                    *Filename);
     58 
     59 /* Opening signature of the Intel legal header */
     60 
     61 char        *HeaderBegin = "/******************************************************************************\n *\n * 1. Copyright Notice";
     62 
     63 
     64 /******************************************************************************
     65  *
     66  * FUNCTION:    AsMatchExactWord
     67  *
     68  * DESCRIPTION: Check previous and next characters for whitespace
     69  *
     70  ******************************************************************************/
     71 
     72 BOOLEAN
     73 AsMatchExactWord (
     74     char                    *Word,
     75     UINT32                  WordLength)
     76 {
     77     char                    NextChar;
     78     char                    PrevChar;
     79 
     80 
     81     NextChar = Word[WordLength];
     82     PrevChar = * (Word -1);
     83 
     84     if (isalnum ((int) NextChar) ||
     85         (NextChar == '_')  ||
     86         isalnum ((int) PrevChar) ||
     87         (PrevChar == '_'))
     88     {
     89         return (FALSE);
     90     }
     91 
     92     return (TRUE);
     93 }
     94 
     95 
     96 /******************************************************************************
     97  *
     98  * FUNCTION:    AsPrint
     99  *
    100  * DESCRIPTION: Common formatted print
    101  *
    102  ******************************************************************************/
    103 
    104 void
    105 AsPrint (
    106     char                    *Message,
    107     UINT32                  Count,
    108     char                    *Filename)
    109 {
    110 
    111     if (Gbl_QuietMode)
    112     {
    113         return;
    114     }
    115 
    116     printf ("-- %4u %28.28s : %s\n", Count, Message, Filename);
    117 }
    118 
    119 
    120 /******************************************************************************
    121  *
    122  * FUNCTION:    AsCheckAndSkipLiterals
    123  *
    124  * DESCRIPTION: Generic routine to skip comments and quoted string literals.
    125  *              Keeps a line count.
    126  *
    127  ******************************************************************************/
    128 
    129 char *
    130 AsCheckAndSkipLiterals (
    131     char                    *Buffer,
    132     UINT32                  *TotalLines)
    133 {
    134     UINT32                  NewLines = 0;
    135     char                    *SubBuffer = Buffer;
    136     char                    *LiteralEnd;
    137 
    138 
    139     /* Ignore comments */
    140 
    141     if ((SubBuffer[0] == '/') &&
    142         (SubBuffer[1] == '*'))
    143     {
    144         LiteralEnd = strstr (SubBuffer, "*/");
    145         SubBuffer += 2;     /* Get past comment opening */
    146 
    147         if (!LiteralEnd)
    148         {
    149             return SubBuffer;
    150         }
    151 
    152         while (SubBuffer < LiteralEnd)
    153         {
    154             if (*SubBuffer == '\n')
    155             {
    156                 NewLines++;
    157             }
    158 
    159             SubBuffer++;
    160         }
    161 
    162         SubBuffer += 2;     /* Get past comment close */
    163     }
    164 
    165     /* Ignore quoted strings */
    166 
    167     else if (*SubBuffer == '\"')
    168     {
    169         SubBuffer++;
    170         LiteralEnd = AsSkipPastChar (SubBuffer, '\"');
    171         if (!LiteralEnd)
    172         {
    173             return SubBuffer;
    174         }
    175     }
    176 
    177     if (TotalLines)
    178     {
    179         (*TotalLines) += NewLines;
    180     }
    181     return SubBuffer;
    182 }
    183 
    184 
    185 /******************************************************************************
    186  *
    187  * FUNCTION:    AsAsCheckForBraces
    188  *
    189  * DESCRIPTION: Check for an open brace after each if statement
    190  *
    191  ******************************************************************************/
    192 
    193 void
    194 AsCheckForBraces (
    195     char                    *Buffer,
    196     char                    *Filename)
    197 {
    198     char                    *SubBuffer = Buffer;
    199     char                    *NextBrace;
    200     char                    *NextSemicolon;
    201     char                    *NextIf;
    202     UINT32                  TotalLines = 1;
    203 
    204 
    205     while (*SubBuffer)
    206     {
    207 
    208         SubBuffer = AsCheckAndSkipLiterals (SubBuffer, &TotalLines);
    209 
    210         if (*SubBuffer == '\n')
    211         {
    212             TotalLines++;
    213         }
    214         else if (!(strncmp (" if", SubBuffer, 3)))
    215         {
    216             SubBuffer += 2;
    217             NextBrace = strstr (SubBuffer, "{");
    218             NextSemicolon = strstr (SubBuffer, ";");
    219             NextIf = strstr (SubBuffer, " if");
    220 
    221             if ((!NextBrace) ||
    222                (NextSemicolon && (NextBrace > NextSemicolon)) ||
    223                (NextIf && (NextBrace > NextIf)))
    224             {
    225                 Gbl_MissingBraces++;
    226 
    227                 if (!Gbl_QuietMode)
    228                 {
    229                     printf ("Missing braces for <if>, line %u: %s\n", TotalLines, Filename);
    230                 }
    231             }
    232         }
    233         else if (!(strncmp (" else if", SubBuffer, 8)))
    234         {
    235             SubBuffer += 7;
    236             NextBrace = strstr (SubBuffer, "{");
    237             NextSemicolon = strstr (SubBuffer, ";");
    238             NextIf = strstr (SubBuffer, " if");
    239 
    240             if ((!NextBrace) ||
    241                (NextSemicolon && (NextBrace > NextSemicolon)) ||
    242                (NextIf && (NextBrace > NextIf)))
    243             {
    244                 Gbl_MissingBraces++;
    245 
    246                 if (!Gbl_QuietMode)
    247                 {
    248                     printf ("Missing braces for <if>, line %u: %s\n", TotalLines, Filename);
    249                 }
    250             }
    251         }
    252         else if (!(strncmp (" else", SubBuffer, 5)))
    253         {
    254             SubBuffer += 4;
    255             NextBrace = strstr (SubBuffer, "{");
    256             NextSemicolon = strstr (SubBuffer, ";");
    257             NextIf = strstr (SubBuffer, " if");
    258 
    259             if ((!NextBrace) ||
    260                (NextSemicolon && (NextBrace > NextSemicolon)) ||
    261                (NextIf && (NextBrace > NextIf)))
    262             {
    263                 Gbl_MissingBraces++;
    264 
    265                 if (!Gbl_QuietMode)
    266                 {
    267                     printf ("Missing braces for <else>, line %u: %s\n", TotalLines, Filename);
    268                 }
    269             }
    270         }
    271 
    272         SubBuffer++;
    273     }
    274 }
    275 
    276 
    277 /******************************************************************************
    278  *
    279  * FUNCTION:    AsTrimLines
    280  *
    281  * DESCRIPTION: Remove extra blanks from the end of source lines.  Does not
    282  *              check for tabs.
    283  *
    284  ******************************************************************************/
    285 
    286 void
    287 AsTrimLines (
    288     char                    *Buffer,
    289     char                    *Filename)
    290 {
    291     char                    *SubBuffer = Buffer;
    292     char                    *StartWhiteSpace = NULL;
    293     UINT32                  SpaceCount = 0;
    294 
    295 
    296     while (*SubBuffer)
    297     {
    298         while (*SubBuffer != '\n')
    299         {
    300             if (!*SubBuffer)
    301             {
    302                 goto Exit;
    303             }
    304 
    305             if (*SubBuffer == ' ')
    306             {
    307                 if (!StartWhiteSpace)
    308                 {
    309                     StartWhiteSpace = SubBuffer;
    310                 }
    311             }
    312             else
    313             {
    314                 StartWhiteSpace = NULL;
    315             }
    316 
    317             SubBuffer++;
    318         }
    319 
    320         if (StartWhiteSpace)
    321         {
    322             SpaceCount += (SubBuffer - StartWhiteSpace);
    323 
    324             /* Remove the spaces */
    325 
    326             SubBuffer = AsRemoveData (StartWhiteSpace, SubBuffer);
    327             StartWhiteSpace = NULL;
    328         }
    329 
    330         SubBuffer++;
    331     }
    332 
    333 
    334 Exit:
    335     if (SpaceCount)
    336     {
    337         Gbl_MadeChanges = TRUE;
    338         AsPrint ("Extraneous spaces removed", SpaceCount, Filename);
    339     }
    340 }
    341 
    342 
    343 /******************************************************************************
    344  *
    345  * FUNCTION:    AsTrimWhitespace
    346  *
    347  * DESCRIPTION: Remove "excess" blank lines - any more than 2 blank lines.
    348  *              this can happen during the translation when lines are removed.
    349  *
    350  ******************************************************************************/
    351 
    352 void
    353 AsTrimWhitespace (
    354     char                    *Buffer)
    355 {
    356     int                     ReplaceCount = 1;
    357 
    358 
    359     while (ReplaceCount)
    360     {
    361         ReplaceCount = AsReplaceString ("\n\n\n\n", "\n\n\n", REPLACE_SUBSTRINGS, Buffer);
    362     }
    363 }
    364 
    365 
    366 /******************************************************************************
    367  *
    368  * FUNCTION:    AsReplaceHeader
    369  *
    370  * DESCRIPTION: Replace the default Intel legal header with a new header
    371  *
    372  ******************************************************************************/
    373 
    374 void
    375 AsReplaceHeader (
    376     char                    *Buffer,
    377     char                    *NewHeader)
    378 {
    379     char                    *SubBuffer;
    380     char                    *TokenEnd;
    381 
    382 
    383     /* Find the original header */
    384 
    385     SubBuffer = strstr (Buffer, HeaderBegin);
    386     if (!SubBuffer)
    387     {
    388         return;
    389     }
    390 
    391     /* Find the end of the original header */
    392 
    393     TokenEnd = strstr (SubBuffer, "*/");
    394     TokenEnd = AsSkipPastChar (TokenEnd, '\n');
    395 
    396     /* Delete old header, insert new one */
    397 
    398     AsReplaceData (SubBuffer, TokenEnd - SubBuffer, NewHeader, strlen (NewHeader));
    399 }
    400 
    401 
    402 /******************************************************************************
    403  *
    404  * FUNCTION:    AsReplaceString
    405  *
    406  * DESCRIPTION: Replace all instances of a target string with a replacement
    407  *              string.  Returns count of the strings replaced.
    408  *
    409  ******************************************************************************/
    410 
    411 int
    412 AsReplaceString (
    413     char                    *Target,
    414     char                    *Replacement,
    415     UINT8                   Type,
    416     char                    *Buffer)
    417 {
    418     char                    *SubString1;
    419     char                    *SubString2;
    420     char                    *SubBuffer;
    421     int                     TargetLength;
    422     int                     ReplacementLength;
    423     int                     ReplaceCount = 0;
    424 
    425 
    426     TargetLength = strlen (Target);
    427     ReplacementLength = strlen (Replacement);
    428 
    429     SubBuffer = Buffer;
    430     SubString1 = Buffer;
    431 
    432     while (SubString1)
    433     {
    434         /* Find the target string */
    435 
    436         SubString1 = strstr (SubBuffer, Target);
    437         if (!SubString1)
    438         {
    439             return ReplaceCount;
    440         }
    441 
    442         /*
    443          * Check for translation escape string -- means to ignore
    444          * blocks of code while replacing
    445          */
    446         SubString2 = strstr (SubBuffer, AS_START_IGNORE);
    447 
    448         if ((SubString2) &&
    449             (SubString2 < SubString1))
    450         {
    451             /* Find end of the escape block starting at "Substring2" */
    452 
    453             SubString2 = strstr (SubString2, AS_STOP_IGNORE);
    454             if (!SubString2)
    455             {
    456                 /* Didn't find terminator */
    457 
    458                 return ReplaceCount;
    459             }
    460 
    461             /* Move buffer to end of escape block and continue */
    462 
    463             SubBuffer = SubString2;
    464         }
    465 
    466         /* Do the actual replace if the target was found */
    467 
    468         else
    469         {
    470             if ((Type & REPLACE_MASK) == REPLACE_WHOLE_WORD)
    471             {
    472                 if (!AsMatchExactWord (SubString1, TargetLength))
    473                 {
    474                     SubBuffer = SubString1 + 1;
    475                     continue;
    476                 }
    477             }
    478 
    479             SubBuffer = AsReplaceData (SubString1, TargetLength, Replacement, ReplacementLength);
    480 
    481             if ((Type & EXTRA_INDENT_C) &&
    482                 (!Gbl_StructDefs))
    483             {
    484                 SubBuffer = AsInsertData (SubBuffer, "        ", 8);
    485             }
    486 
    487             ReplaceCount++;
    488         }
    489     }
    490 
    491     return ReplaceCount;
    492 }
    493 
    494 
    495 /******************************************************************************
    496  *
    497  * FUNCTION:    AsConvertToLineFeeds
    498  *
    499  * DESCRIPTION:
    500  *
    501  ******************************************************************************/
    502 
    503 void
    504 AsConvertToLineFeeds (
    505     char                    *Buffer)
    506 {
    507     char                    *SubString;
    508     char                    *SubBuffer;
    509 
    510 
    511     SubBuffer = Buffer;
    512     SubString = Buffer;
    513 
    514     while (SubString)
    515     {
    516         /* Find the target string */
    517 
    518         SubString = strstr (SubBuffer, "\r\n");
    519         if (!SubString)
    520         {
    521             return;
    522         }
    523 
    524         SubBuffer = AsReplaceData (SubString, 1, NULL, 0);
    525     }
    526     return;
    527 }
    528 
    529 
    530 /******************************************************************************
    531  *
    532  * FUNCTION:    AsInsertCarriageReturns
    533  *
    534  * DESCRIPTION:
    535  *
    536  ******************************************************************************/
    537 
    538 void
    539 AsInsertCarriageReturns (
    540     char                    *Buffer)
    541 {
    542     char                    *SubString;
    543     char                    *SubBuffer;
    544 
    545 
    546     SubBuffer = Buffer;
    547     SubString = Buffer;
    548 
    549     while (SubString)
    550     {
    551         /* Find the target string */
    552 
    553         SubString = strstr (SubBuffer, "\n");
    554         if (!SubString)
    555         {
    556             return;
    557         }
    558 
    559         SubBuffer = AsInsertData (SubString, "\r", 1);
    560         SubBuffer += 1;
    561     }
    562     return;
    563 }
    564 
    565 
    566 /******************************************************************************
    567  *
    568  * FUNCTION:    AsBracesOnSameLine
    569  *
    570  * DESCRIPTION: Move opening braces up to the same line as an if, for, else,
    571  *              or while statement (leave function opening brace on separate
    572  *              line).
    573  *
    574  ******************************************************************************/
    575 
    576 void
    577 AsBracesOnSameLine (
    578     char                    *Buffer)
    579 {
    580     UINT32                  Length;
    581     char                    *SubBuffer = Buffer;
    582     char                    *Beginning;
    583     char                    *StartOfThisLine;
    584     char                    *Next;
    585     BOOLEAN                 BlockBegin = TRUE;
    586 
    587 
    588     while (*SubBuffer)
    589     {
    590         /* Ignore comments */
    591 
    592         if ((SubBuffer[0] == '/') &&
    593             (SubBuffer[1] == '*'))
    594         {
    595             SubBuffer = strstr (SubBuffer, "*/");
    596             if (!SubBuffer)
    597             {
    598                 return;
    599             }
    600 
    601             SubBuffer += 2;
    602             continue;
    603         }
    604 
    605         /* Ignore quoted strings */
    606 
    607         if (*SubBuffer == '\"')
    608         {
    609             SubBuffer++;
    610             SubBuffer = AsSkipPastChar (SubBuffer, '\"');
    611             if (!SubBuffer)
    612             {
    613                 return;
    614             }
    615         }
    616 
    617         if (!strncmp ("\n}", SubBuffer, 2))
    618         {
    619             /*
    620              * A newline followed by a closing brace closes a function
    621              * or struct or initializer block
    622              */
    623             BlockBegin = TRUE;
    624         }
    625 
    626         /*
    627          * Move every standalone brace up to the previous line
    628          * Check for digit will ignore initializer lists surrounded by braces.
    629          * This will work until we we need more complex detection.
    630          */
    631         if ((*SubBuffer == '{') && !isdigit ((int) SubBuffer[1]))
    632         {
    633             if (BlockBegin)
    634             {
    635                 BlockBegin = FALSE;
    636             }
    637             else
    638             {
    639                 /*
    640                  * Backup to previous non-whitespace
    641                  */
    642                 Beginning = SubBuffer - 1;
    643                 while ((*Beginning == ' ')   ||
    644                        (*Beginning == '\n'))
    645                 {
    646                     Beginning--;
    647                 }
    648 
    649                 StartOfThisLine = Beginning;
    650                 while (*StartOfThisLine != '\n')
    651                 {
    652                     StartOfThisLine--;
    653                 }
    654 
    655                 /*
    656                  * Move the brace up to the previous line, UNLESS:
    657                  *
    658                  * 1) There is a conditional compile on the line (starts with '#')
    659                  * 2) Previous line ends with an '=' (Start of initializer block)
    660                  * 3) Previous line ends with a comma (part of an init list)
    661                  * 4) Previous line ends with a backslash (part of a macro)
    662                  */
    663                 if ((StartOfThisLine[1] != '#') &&
    664                     (*Beginning != '\\') &&
    665                     (*Beginning != '/') &&
    666                     (*Beginning != '{') &&
    667                     (*Beginning != '=') &&
    668                     (*Beginning != ','))
    669                 {
    670                     Beginning++;
    671                     SubBuffer++;
    672                     Length = strlen (SubBuffer);
    673 
    674                     Gbl_MadeChanges = TRUE;
    675 
    676 #ifdef ADD_EXTRA_WHITESPACE
    677                     AsReplaceData (Beginning, SubBuffer - Beginning, " {\n", 3);
    678 #else
    679                     /* Find non-whitespace start of next line */
    680 
    681                     Next = SubBuffer + 1;
    682                     while ((*Next == ' ')   ||
    683                            (*Next == '\t'))
    684                     {
    685                         Next++;
    686                     }
    687 
    688                     /* Find non-whitespace start of this line */
    689 
    690                     StartOfThisLine++;
    691                     while ((*StartOfThisLine == ' ')   ||
    692                            (*StartOfThisLine == '\t'))
    693                     {
    694                         StartOfThisLine++;
    695                     }
    696 
    697                     /*
    698                      * Must be a single-line comment to need more whitespace
    699                      * Even then, we don't need more if the previous statement
    700                      * is an "else".
    701                      */
    702                     if ((Next[0] == '/')  &&
    703                         (Next[1] == '*')  &&
    704                         (Next[2] != '\n') &&
    705 
    706                         (!strncmp (StartOfThisLine, "else if", 7)     ||
    707                          !strncmp (StartOfThisLine, "else while", 10) ||
    708                           strncmp (StartOfThisLine, "else", 4)))
    709                     {
    710                         AsReplaceData (Beginning, SubBuffer - Beginning, " {\n", 3);
    711                     }
    712                     else
    713                     {
    714                         AsReplaceData (Beginning, SubBuffer - Beginning, " {", 2);
    715                     }
    716 #endif
    717                 }
    718             }
    719         }
    720 
    721         SubBuffer++;
    722     }
    723 }
    724 
    725 
    726 /******************************************************************************
    727  *
    728  * FUNCTION:    AsTabify4
    729  *
    730  * DESCRIPTION: Convert the text to tabbed text.  Alignment of text is
    731  *              preserved.
    732  *
    733  ******************************************************************************/
    734 
    735 void
    736 AsTabify4 (
    737     char                    *Buffer)
    738 {
    739     char                    *SubBuffer = Buffer;
    740     char                    *NewSubBuffer;
    741     UINT32                  SpaceCount = 0;
    742     UINT32                  Column = 0;
    743 
    744 
    745     while (*SubBuffer)
    746     {
    747         if (*SubBuffer == '\n')
    748         {
    749             Column = 0;
    750         }
    751         else
    752         {
    753             Column++;
    754         }
    755 
    756         /* Ignore comments */
    757 
    758         if ((SubBuffer[0] == '/') &&
    759             (SubBuffer[1] == '*'))
    760         {
    761             SubBuffer = strstr (SubBuffer, "*/");
    762             if (!SubBuffer)
    763             {
    764                 return;
    765             }
    766 
    767             SubBuffer += 2;
    768             continue;
    769         }
    770 
    771         /* Ignore quoted strings */
    772 
    773         if (*SubBuffer == '\"')
    774         {
    775             SubBuffer++;
    776             SubBuffer = AsSkipPastChar (SubBuffer, '\"');
    777             if (!SubBuffer)
    778             {
    779                 return;
    780             }
    781             SpaceCount = 0;
    782         }
    783 
    784         if (*SubBuffer == ' ')
    785         {
    786             SpaceCount++;
    787 
    788             if (SpaceCount >= 4)
    789             {
    790                 SpaceCount = 0;
    791 
    792                 NewSubBuffer = (SubBuffer + 1) - 4;
    793                 *NewSubBuffer = '\t';
    794                 NewSubBuffer++;
    795 
    796                 /* Remove the spaces */
    797 
    798                 SubBuffer = AsRemoveData (NewSubBuffer, SubBuffer + 1);
    799             }
    800 
    801             if ((Column % 4) == 0)
    802             {
    803                 SpaceCount = 0;
    804             }
    805         }
    806         else
    807         {
    808             SpaceCount = 0;
    809         }
    810 
    811         SubBuffer++;
    812     }
    813 }
    814 
    815 
    816 /******************************************************************************
    817  *
    818  * FUNCTION:    AsTabify8
    819  *
    820  * DESCRIPTION: Convert the text to tabbed text.  Alignment of text is
    821  *              preserved.
    822  *
    823  ******************************************************************************/
    824 
    825 void
    826 AsTabify8 (
    827     char                    *Buffer)
    828 {
    829     char                    *SubBuffer = Buffer;
    830     char                    *NewSubBuffer;
    831     char                    *CommentEnd = NULL;
    832     UINT32                  SpaceCount = 0;
    833     UINT32                  Column = 0;
    834     UINT32                  TabCount = 0;
    835     UINT32                  LastLineTabCount = 0;
    836     UINT32                  LastLineColumnStart = 0;
    837     UINT32                  ThisColumnStart = 0;
    838     UINT32                  ThisTabCount =  0;
    839     char                    *FirstNonBlank = NULL;
    840 
    841 
    842     while (*SubBuffer)
    843     {
    844         if (*SubBuffer == '\n')
    845         {
    846             /* This is a standalone blank line */
    847 
    848             FirstNonBlank = NULL;
    849             Column = 0;
    850             SpaceCount = 0;
    851             TabCount = 0;
    852             SubBuffer++;
    853             continue;
    854         }
    855 
    856         if (!FirstNonBlank)
    857         {
    858             /* Find the first non-blank character on this line */
    859 
    860             FirstNonBlank = SubBuffer;
    861             while (*FirstNonBlank == ' ')
    862             {
    863                 FirstNonBlank++;
    864             }
    865 
    866             /*
    867              * This mechanism limits the difference in tab counts from
    868              * line to line.  It helps avoid the situation where a second
    869              * continuation line (which was indented correctly for tabs=4) would
    870              * get indented off the screen if we just blindly converted to tabs.
    871              */
    872             ThisColumnStart = FirstNonBlank - SubBuffer;
    873 
    874             if (LastLineTabCount == 0)
    875             {
    876                 ThisTabCount = 0;
    877             }
    878             else if (ThisColumnStart == LastLineColumnStart)
    879             {
    880                 ThisTabCount = LastLineTabCount -1;
    881             }
    882             else
    883             {
    884                 ThisTabCount = LastLineTabCount + 1;
    885             }
    886         }
    887 
    888         Column++;
    889 
    890         /* Check if we are in a comment */
    891 
    892         if ((SubBuffer[0] == '*') &&
    893             (SubBuffer[1] == '/'))
    894         {
    895             SpaceCount = 0;
    896             SubBuffer += 2;
    897 
    898             if (*SubBuffer == '\n')
    899             {
    900                 if (TabCount > 0)
    901                 {
    902                     LastLineTabCount = TabCount;
    903                     TabCount = 0;
    904                 }
    905                 FirstNonBlank = NULL;
    906                 LastLineColumnStart = ThisColumnStart;
    907                 SubBuffer++;
    908             }
    909 
    910             continue;
    911         }
    912 
    913         /* Check for comment open */
    914 
    915         if ((SubBuffer[0] == '/') &&
    916             (SubBuffer[1] == '*'))
    917         {
    918             /* Find the end of the comment, it must exist */
    919 
    920             CommentEnd = strstr (SubBuffer, "*/");
    921             if (!CommentEnd)
    922             {
    923                 return;
    924             }
    925 
    926             /* Toss the rest of this line or single-line comment */
    927 
    928             while ((SubBuffer < CommentEnd) &&
    929                    (*SubBuffer != '\n'))
    930             {
    931                 SubBuffer++;
    932             }
    933 
    934             if (*SubBuffer == '\n')
    935             {
    936                 if (TabCount > 0)
    937                 {
    938                     LastLineTabCount = TabCount;
    939                     TabCount = 0;
    940                 }
    941                 FirstNonBlank = NULL;
    942                 LastLineColumnStart = ThisColumnStart;
    943             }
    944 
    945             SpaceCount = 0;
    946             continue;
    947         }
    948 
    949         /* Ignore quoted strings */
    950 
    951         if ((!CommentEnd) && (*SubBuffer == '\"'))
    952         {
    953             SubBuffer++;
    954             SubBuffer = AsSkipPastChar (SubBuffer, '\"');
    955             if (!SubBuffer)
    956             {
    957                 return;
    958             }
    959             SpaceCount = 0;
    960         }
    961 
    962         if (*SubBuffer != ' ')
    963         {
    964             /* Not a space, skip to end of line */
    965 
    966             SubBuffer = AsSkipUntilChar (SubBuffer, '\n');
    967             if (!SubBuffer)
    968             {
    969                 return;
    970             }
    971             if (TabCount > 0)
    972             {
    973                 LastLineTabCount = TabCount;
    974                 TabCount = 0;
    975             }
    976 
    977             FirstNonBlank = NULL;
    978             LastLineColumnStart = ThisColumnStart;
    979             Column = 0;
    980             SpaceCount = 0;
    981         }
    982         else
    983         {
    984             /* Another space */
    985 
    986             SpaceCount++;
    987 
    988             if (SpaceCount >= 4)
    989             {
    990                 /* Replace this group of spaces with a tab character */
    991 
    992                 SpaceCount = 0;
    993 
    994                 NewSubBuffer = SubBuffer - 3;
    995 
    996                 if (TabCount <= ThisTabCount ? (ThisTabCount +1) : 0)
    997                 {
    998                     *NewSubBuffer = '\t';
    999                     NewSubBuffer++;
   1000                     SubBuffer++;
   1001                     TabCount++;
   1002                 }
   1003 
   1004                 /* Remove the spaces */
   1005 
   1006                 SubBuffer = AsRemoveData (NewSubBuffer, SubBuffer);
   1007                 continue;
   1008             }
   1009         }
   1010 
   1011         SubBuffer++;
   1012     }
   1013 }
   1014 
   1015 
   1016 /******************************************************************************
   1017  *
   1018  * FUNCTION:    AsCountLines
   1019  *
   1020  * DESCRIPTION: Count the number of lines in the input buffer.  Also count
   1021  *              the number of long lines (lines longer than 80 chars).
   1022  *
   1023  ******************************************************************************/
   1024 
   1025 UINT32
   1026 AsCountLines (
   1027     char                    *Buffer,
   1028     char                    *Filename)
   1029 {
   1030     char                    *SubBuffer = Buffer;
   1031     char                    *EndOfLine;
   1032     UINT32                  LineCount = 0;
   1033     UINT32                  LongLineCount = 0;
   1034 
   1035 
   1036     while (*SubBuffer)
   1037     {
   1038         EndOfLine = AsSkipUntilChar (SubBuffer, '\n');
   1039         if (!EndOfLine)
   1040         {
   1041             Gbl_TotalLines += LineCount;
   1042             return LineCount;
   1043         }
   1044 
   1045         if ((EndOfLine - SubBuffer) > 80)
   1046         {
   1047             LongLineCount++;
   1048             VERBOSE_PRINT (("long: %.80s\n", SubBuffer));
   1049         }
   1050 
   1051         LineCount++;
   1052         SubBuffer = EndOfLine + 1;
   1053     }
   1054 
   1055     if (LongLineCount)
   1056     {
   1057         VERBOSE_PRINT (("%u Lines longer than 80 found in %s\n", LongLineCount, Filename));
   1058         Gbl_LongLines += LongLineCount;
   1059     }
   1060 
   1061     Gbl_TotalLines += LineCount;
   1062     return LineCount;
   1063 }
   1064 
   1065 
   1066 /******************************************************************************
   1067  *
   1068  * FUNCTION:    AsCountTabs
   1069  *
   1070  * DESCRIPTION: Simply count the number of tabs in the input file buffer
   1071  *
   1072  ******************************************************************************/
   1073 
   1074 void
   1075 AsCountTabs (
   1076     char                    *Buffer,
   1077     char                    *Filename)
   1078 {
   1079     UINT32                  i;
   1080     UINT32                  TabCount = 0;
   1081 
   1082 
   1083     for (i = 0; Buffer[i]; i++)
   1084     {
   1085         if (Buffer[i] == '\t')
   1086         {
   1087             TabCount++;
   1088         }
   1089     }
   1090 
   1091     if (TabCount)
   1092     {
   1093         AsPrint ("Tabs found", TabCount, Filename);
   1094         Gbl_Tabs += TabCount;
   1095     }
   1096 
   1097     AsCountLines (Buffer, Filename);
   1098 }
   1099 
   1100 
   1101 /******************************************************************************
   1102  *
   1103  * FUNCTION:    AsCountNonAnsiComments
   1104  *
   1105  * DESCRIPTION: Count the number of "//" comments.  This type of comment is
   1106  *              non-ANSI C.
   1107  *
   1108  ******************************************************************************/
   1109 
   1110 void
   1111 AsCountNonAnsiComments (
   1112     char                    *Buffer,
   1113     char                    *Filename)
   1114 {
   1115     char                    *SubBuffer = Buffer;
   1116     UINT32                  CommentCount = 0;
   1117 
   1118 
   1119     while (SubBuffer)
   1120     {
   1121         SubBuffer = strstr (SubBuffer, "//");
   1122         if (SubBuffer)
   1123         {
   1124             CommentCount++;
   1125             SubBuffer += 2;
   1126         }
   1127     }
   1128 
   1129     if (CommentCount)
   1130     {
   1131         AsPrint ("Non-ANSI Comments found", CommentCount, Filename);
   1132         Gbl_NonAnsiComments += CommentCount;
   1133     }
   1134 }
   1135 
   1136 
   1137 /******************************************************************************
   1138  *
   1139  * FUNCTION:    AsCountSourceLines
   1140  *
   1141  * DESCRIPTION: Count the number of C source lines.  Defined by 1) not a
   1142  *              comment, and 2) not a blank line.
   1143  *
   1144  ******************************************************************************/
   1145 
   1146 void
   1147 AsCountSourceLines (
   1148     char                    *Buffer,
   1149     char                    *Filename)
   1150 {
   1151     char                    *SubBuffer = Buffer;
   1152     UINT32                  LineCount = 0;
   1153     UINT32                  WhiteCount = 0;
   1154     UINT32                  CommentCount = 0;
   1155 
   1156 
   1157     while (*SubBuffer)
   1158     {
   1159         /* Detect comments (// comments are not used, non-ansii) */
   1160 
   1161         if ((SubBuffer[0] == '/') &&
   1162             (SubBuffer[1] == '*'))
   1163         {
   1164             SubBuffer += 2;
   1165 
   1166             /* First line of multi-line comment is often just whitespace */
   1167 
   1168             if (SubBuffer[0] == '\n')
   1169             {
   1170                 WhiteCount++;
   1171                 SubBuffer++;
   1172             }
   1173             else
   1174             {
   1175                 CommentCount++;
   1176             }
   1177 
   1178             /* Find end of comment */
   1179 
   1180             while (SubBuffer[0] && SubBuffer[1] &&
   1181                     !(((SubBuffer[0] == '*') &&
   1182                       (SubBuffer[1] == '/'))))
   1183             {
   1184                 if (SubBuffer[0] == '\n')
   1185                 {
   1186                     CommentCount++;
   1187                 }
   1188 
   1189                 SubBuffer++;
   1190             }
   1191         }
   1192 
   1193         /* A linefeed followed by a non-linefeed is a valid source line */
   1194 
   1195         else if ((SubBuffer[0] == '\n') &&
   1196                  (SubBuffer[1] != '\n'))
   1197         {
   1198             LineCount++;
   1199         }
   1200 
   1201         /* Two back-to-back linefeeds indicate a whitespace line */
   1202 
   1203         else if ((SubBuffer[0] == '\n') &&
   1204                  (SubBuffer[1] == '\n'))
   1205         {
   1206             WhiteCount++;
   1207         }
   1208 
   1209         SubBuffer++;
   1210     }
   1211 
   1212     /* Adjust comment count for legal header */
   1213 
   1214     if (Gbl_HeaderSize < CommentCount)
   1215     {
   1216         CommentCount -= Gbl_HeaderSize;
   1217         Gbl_HeaderLines += Gbl_HeaderSize;
   1218     }
   1219 
   1220     Gbl_SourceLines += LineCount;
   1221     Gbl_WhiteLines += WhiteCount;
   1222     Gbl_CommentLines += CommentCount;
   1223 
   1224     VERBOSE_PRINT (("%u Comment %u White %u Code %u Lines in %s\n",
   1225                 CommentCount, WhiteCount, LineCount, LineCount+WhiteCount+CommentCount, Filename));
   1226 }
   1227 
   1228 
   1229 /******************************************************************************
   1230  *
   1231  * FUNCTION:    AsInsertPrefix
   1232  *
   1233  * DESCRIPTION: Insert struct or union prefixes
   1234  *
   1235  ******************************************************************************/
   1236 
   1237 void
   1238 AsInsertPrefix (
   1239     char                    *Buffer,
   1240     char                    *Keyword,
   1241     UINT8                   Type)
   1242 {
   1243     char                    *SubString;
   1244     char                    *SubBuffer;
   1245     char                    *EndKeyword;
   1246     int                     StrLength;
   1247     int                     InsertLength;
   1248     char                    *InsertString;
   1249     int                     TrailingSpaces;
   1250     char                    LowerKeyword[128];
   1251     int                     KeywordLength;
   1252 
   1253 
   1254     switch (Type)
   1255     {
   1256     case SRC_TYPE_STRUCT:
   1257         InsertString = "struct ";
   1258         break;
   1259 
   1260     case SRC_TYPE_UNION:
   1261         InsertString = "union ";
   1262         break;
   1263 
   1264     default:
   1265         return;
   1266     }
   1267 
   1268     strcpy (LowerKeyword, Keyword);
   1269     strlwr (LowerKeyword);
   1270 
   1271     SubBuffer = Buffer;
   1272     SubString = Buffer;
   1273     InsertLength = strlen (InsertString);
   1274     KeywordLength = strlen (Keyword);
   1275 
   1276 
   1277     while (SubString)
   1278     {
   1279         /* Find an instance of the keyword */
   1280 
   1281         SubString = strstr (SubBuffer, LowerKeyword);
   1282 
   1283         if (!SubString)
   1284         {
   1285             return;
   1286         }
   1287 
   1288         SubBuffer = SubString;
   1289 
   1290         /* Must be standalone word, not a substring */
   1291 
   1292         if (AsMatchExactWord (SubString, KeywordLength))
   1293         {
   1294             /* Make sure the keyword isn't already prefixed with the insert */
   1295 
   1296             if (!strncmp (SubString - InsertLength, InsertString, InsertLength))
   1297             {
   1298                 /* Add spaces if not already at the end-of-line */
   1299 
   1300                 if (*(SubBuffer + KeywordLength) != '\n')
   1301                 {
   1302                     /* Already present, add spaces after to align structure members */
   1303 
   1304 #if 0
   1305 /* ONLY FOR C FILES */
   1306                     AsInsertData (SubBuffer + KeywordLength, "        ", 8);
   1307 #endif
   1308                 }
   1309                 goto Next;
   1310             }
   1311 
   1312             /* Make sure the keyword isn't at the end of a struct/union */
   1313             /* Note: This code depends on a single space after the brace */
   1314 
   1315             if (*(SubString - 2) == '}')
   1316             {
   1317                 goto Next;
   1318             }
   1319 
   1320             /* Prefix the keyword with the insert string */
   1321 
   1322             Gbl_MadeChanges = TRUE;
   1323             StrLength = strlen (SubString);
   1324 
   1325             /* Is there room for insertion */
   1326 
   1327             EndKeyword = SubString + strlen (LowerKeyword);
   1328 
   1329             TrailingSpaces = 0;
   1330             while (EndKeyword[TrailingSpaces] == ' ')
   1331             {
   1332                 TrailingSpaces++;
   1333             }
   1334 
   1335             /*
   1336              * Use "if (TrailingSpaces > 1)" if we want to ignore casts
   1337              */
   1338             SubBuffer = SubString + InsertLength;
   1339 
   1340             if (TrailingSpaces > InsertLength)
   1341             {
   1342                 /* Insert the keyword */
   1343 
   1344                 memmove (SubBuffer, SubString, KeywordLength);
   1345 
   1346                 /* Insert the keyword */
   1347 
   1348                 memmove (SubString, InsertString, InsertLength);
   1349             }
   1350             else
   1351             {
   1352                 AsInsertData (SubString, InsertString, InsertLength);
   1353             }
   1354         }
   1355 
   1356 Next:
   1357         SubBuffer += KeywordLength;
   1358     }
   1359 }
   1360 
   1361 #ifdef ACPI_FUTURE_IMPLEMENTATION
   1362 /******************************************************************************
   1363  *
   1364  * FUNCTION:    AsTrimComments
   1365  *
   1366  * DESCRIPTION: Finds 3-line comments with only a single line of text
   1367  *
   1368  ******************************************************************************/
   1369 
   1370 void
   1371 AsTrimComments (
   1372     char                    *Buffer,
   1373     char                    *Filename)
   1374 {
   1375     char                    *SubBuffer = Buffer;
   1376     char                    *Ptr1;
   1377     char                    *Ptr2;
   1378     UINT32                  LineCount;
   1379     UINT32                  ShortCommentCount = 0;
   1380 
   1381 
   1382     while (1)
   1383     {
   1384         /* Find comment open, within procedure level */
   1385 
   1386         SubBuffer = strstr (SubBuffer, "    /*");
   1387         if (!SubBuffer)
   1388         {
   1389             goto Exit;
   1390         }
   1391 
   1392         /* Find comment terminator */
   1393 
   1394         Ptr1 = strstr (SubBuffer, "*/");
   1395         if (!Ptr1)
   1396         {
   1397             goto Exit;
   1398         }
   1399 
   1400         /* Find next EOL (from original buffer) */
   1401 
   1402         Ptr2 = strstr (SubBuffer, "\n");
   1403         if (!Ptr2)
   1404         {
   1405             goto Exit;
   1406         }
   1407 
   1408         /* Ignore one-line comments */
   1409 
   1410         if (Ptr1 < Ptr2)
   1411         {
   1412             /* Normal comment, ignore and continue; */
   1413 
   1414             SubBuffer = Ptr2;
   1415             continue;
   1416         }
   1417 
   1418         /* Examine multi-line comment */
   1419 
   1420         LineCount = 1;
   1421         while (Ptr1 > Ptr2)
   1422         {
   1423             /* Find next EOL */
   1424 
   1425             Ptr2++;
   1426             Ptr2 = strstr (Ptr2, "\n");
   1427             if (!Ptr2)
   1428             {
   1429                 goto Exit;
   1430             }
   1431 
   1432             LineCount++;
   1433         }
   1434 
   1435         SubBuffer = Ptr1;
   1436 
   1437         if (LineCount <= 3)
   1438         {
   1439             ShortCommentCount++;
   1440         }
   1441     }
   1442 
   1443 
   1444 Exit:
   1445 
   1446     if (ShortCommentCount)
   1447     {
   1448         AsPrint ("Short Comments found", ShortCommentCount, Filename);
   1449     }
   1450 }
   1451 #endif
   1452 
   1453 
   1454