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