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