Home | History | Annotate | Line # | Download | only in acpisrc
asconvrt.c revision 1.1.1.13
      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.13  christos  * 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.13  christos  * 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.13  christos #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