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