Home | History | Annotate | Line # | Download | only in acpisrc
asconvrt.c revision 1.1.1.12.4.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.12.4.1   thorpej  * Copyright (C) 2000 - 2021, 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.12.4.1   thorpej  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 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.12.4.1   thorpej #define INTEL_COPYRIGHT     " * Copyright (C) 2000 - 2021, 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