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