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