10d02842fSSascha Wildner /******************************************************************************
20d02842fSSascha Wildner  *
30d02842fSSascha Wildner  * Module Name: asremove - Source conversion - removal functions
40d02842fSSascha Wildner  *
50d02842fSSascha Wildner  *****************************************************************************/
60d02842fSSascha Wildner 
7b4315fc7SSascha Wildner /******************************************************************************
8b4315fc7SSascha Wildner  *
9b4315fc7SSascha Wildner  * 1. Copyright Notice
10b4315fc7SSascha Wildner  *
11*383048acSSascha Wildner  * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
120d02842fSSascha Wildner  * All rights reserved.
130d02842fSSascha Wildner  *
14b4315fc7SSascha Wildner  * 2. License
15b4315fc7SSascha Wildner  *
16b4315fc7SSascha Wildner  * 2.1. This is your license from Intel Corp. under its intellectual property
17b4315fc7SSascha Wildner  * rights. You may have additional license terms from the party that provided
18b4315fc7SSascha Wildner  * you this software, covering your right to use that party's intellectual
19b4315fc7SSascha Wildner  * property rights.
20b4315fc7SSascha Wildner  *
21b4315fc7SSascha Wildner  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22b4315fc7SSascha Wildner  * copy of the source code appearing in this file ("Covered Code") an
23b4315fc7SSascha Wildner  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24b4315fc7SSascha Wildner  * base code distributed originally by Intel ("Original Intel Code") to copy,
25b4315fc7SSascha Wildner  * make derivatives, distribute, use and display any portion of the Covered
26b4315fc7SSascha Wildner  * Code in any form, with the right to sublicense such rights; and
27b4315fc7SSascha Wildner  *
28b4315fc7SSascha Wildner  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29b4315fc7SSascha Wildner  * license (with the right to sublicense), under only those claims of Intel
30b4315fc7SSascha Wildner  * patents that are infringed by the Original Intel Code, to make, use, sell,
31b4315fc7SSascha Wildner  * offer to sell, and import the Covered Code and derivative works thereof
32b4315fc7SSascha Wildner  * solely to the minimum extent necessary to exercise the above copyright
33b4315fc7SSascha Wildner  * license, and in no event shall the patent license extend to any additions
34b4315fc7SSascha Wildner  * to or modifications of the Original Intel Code. No other license or right
35b4315fc7SSascha Wildner  * is granted directly or by implication, estoppel or otherwise;
36b4315fc7SSascha Wildner  *
37b4315fc7SSascha Wildner  * The above copyright and patent license is granted only if the following
38b4315fc7SSascha Wildner  * conditions are met:
39b4315fc7SSascha Wildner  *
40b4315fc7SSascha Wildner  * 3. Conditions
41b4315fc7SSascha Wildner  *
42b4315fc7SSascha Wildner  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
44b4315fc7SSascha Wildner  * Code or modification with rights to further distribute source must include
45b4315fc7SSascha Wildner  * the above Copyright Notice, the above License, this list of Conditions,
46b4315fc7SSascha Wildner  * and the following Disclaimer and Export Compliance provision. In addition,
47b4315fc7SSascha Wildner  * Licensee must cause all Covered Code to which Licensee contributes to
48b4315fc7SSascha Wildner  * contain a file documenting the changes Licensee made to create that Covered
49b4315fc7SSascha Wildner  * Code and the date of any change. Licensee must include in that file the
50b4315fc7SSascha Wildner  * documentation of any changes made by any predecessor Licensee. Licensee
51b4315fc7SSascha Wildner  * must include a prominent statement that the modification is derived,
52b4315fc7SSascha Wildner  * directly or indirectly, from Original Intel Code.
53b4315fc7SSascha Wildner  *
54b4315fc7SSascha Wildner  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55b4315fc7SSascha Wildner  * Redistribution of source code of any substantial portion of the Covered
56b4315fc7SSascha Wildner  * Code or modification without rights to further distribute source must
57b4315fc7SSascha Wildner  * include the following Disclaimer and Export Compliance provision in the
58b4315fc7SSascha Wildner  * documentation and/or other materials provided with distribution. In
59b4315fc7SSascha Wildner  * addition, Licensee may not authorize further sublicense of source of any
60b4315fc7SSascha Wildner  * portion of the Covered Code, and must include terms to the effect that the
61b4315fc7SSascha Wildner  * license from Licensee to its licensee is limited to the intellectual
62b4315fc7SSascha Wildner  * property embodied in the software Licensee provides to its licensee, and
63b4315fc7SSascha Wildner  * not to intellectual property embodied in modifications its licensee may
64b4315fc7SSascha Wildner  * make.
65b4315fc7SSascha Wildner  *
66b4315fc7SSascha Wildner  * 3.3. Redistribution of Executable. Redistribution in executable form of any
67b4315fc7SSascha Wildner  * substantial portion of the Covered Code or modification must reproduce the
68b4315fc7SSascha Wildner  * above Copyright Notice, and the following Disclaimer and Export Compliance
69b4315fc7SSascha Wildner  * provision in the documentation and/or other materials provided with the
70b4315fc7SSascha Wildner  * distribution.
71b4315fc7SSascha Wildner  *
72b4315fc7SSascha Wildner  * 3.4. Intel retains all right, title, and interest in and to the Original
73b4315fc7SSascha Wildner  * Intel Code.
74b4315fc7SSascha Wildner  *
75b4315fc7SSascha Wildner  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76b4315fc7SSascha Wildner  * Intel shall be used in advertising or otherwise to promote the sale, use or
77b4315fc7SSascha Wildner  * other dealings in products derived from or relating to the Covered Code
78b4315fc7SSascha Wildner  * without prior written authorization from Intel.
79b4315fc7SSascha Wildner  *
80b4315fc7SSascha Wildner  * 4. Disclaimer and Export Compliance
81b4315fc7SSascha Wildner  *
82b4315fc7SSascha Wildner  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83b4315fc7SSascha Wildner  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84b4315fc7SSascha Wildner  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85b4315fc7SSascha Wildner  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86b4315fc7SSascha Wildner  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87b4315fc7SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88b4315fc7SSascha Wildner  * PARTICULAR PURPOSE.
89b4315fc7SSascha Wildner  *
90b4315fc7SSascha Wildner  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91b4315fc7SSascha Wildner  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92b4315fc7SSascha Wildner  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93b4315fc7SSascha Wildner  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94b4315fc7SSascha Wildner  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95b4315fc7SSascha Wildner  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96b4315fc7SSascha Wildner  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97b4315fc7SSascha Wildner  * LIMITED REMEDY.
98b4315fc7SSascha Wildner  *
99b4315fc7SSascha Wildner  * 4.3. Licensee shall not export, either directly or indirectly, any of this
100b4315fc7SSascha Wildner  * software or system incorporating such software without first obtaining any
101b4315fc7SSascha Wildner  * required license or other approval from the U. S. Department of Commerce or
102b4315fc7SSascha Wildner  * any other agency or department of the United States Government. In the
103b4315fc7SSascha Wildner  * event Licensee exports any such software from the United States or
104b4315fc7SSascha Wildner  * re-exports any such software from a foreign destination, Licensee shall
105b4315fc7SSascha Wildner  * ensure that the distribution and export/re-export of the software is in
106b4315fc7SSascha Wildner  * compliance with all laws, regulations, orders, or other restrictions of the
107b4315fc7SSascha Wildner  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108b4315fc7SSascha Wildner  * any of its subsidiaries will export/re-export any technical data, process,
109b4315fc7SSascha Wildner  * software, or service, directly or indirectly, to any country for which the
110b4315fc7SSascha Wildner  * United States government or any agency thereof requires an export license,
111b4315fc7SSascha Wildner  * other governmental approval, or letter of assurance, without first obtaining
112b4315fc7SSascha Wildner  * such license, approval or letter.
113b4315fc7SSascha Wildner  *
114b4315fc7SSascha Wildner  *****************************************************************************
115b4315fc7SSascha Wildner  *
116b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
117b4315fc7SSascha Wildner  * following license:
118b4315fc7SSascha Wildner  *
1190d02842fSSascha Wildner  * Redistribution and use in source and binary forms, with or without
1200d02842fSSascha Wildner  * modification, are permitted provided that the following conditions
1210d02842fSSascha Wildner  * are met:
1220d02842fSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
1230d02842fSSascha Wildner  *    notice, this list of conditions, and the following disclaimer,
1240d02842fSSascha Wildner  *    without modification.
1250d02842fSSascha Wildner  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1260d02842fSSascha Wildner  *    substantially similar to the "NO WARRANTY" disclaimer below
1270d02842fSSascha Wildner  *    ("Disclaimer") and any redistribution must be conditioned upon
1280d02842fSSascha Wildner  *    including a substantially similar Disclaimer requirement for further
1290d02842fSSascha Wildner  *    binary redistribution.
1300d02842fSSascha Wildner  * 3. Neither the names of the above-listed copyright holders nor the names
1310d02842fSSascha Wildner  *    of any contributors may be used to endorse or promote products derived
1320d02842fSSascha Wildner  *    from this software without specific prior written permission.
1330d02842fSSascha Wildner  *
134b4315fc7SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135b4315fc7SSascha Wildner  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136b4315fc7SSascha Wildner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137b4315fc7SSascha Wildner  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138b4315fc7SSascha Wildner  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139b4315fc7SSascha Wildner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140b4315fc7SSascha Wildner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141b4315fc7SSascha Wildner  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142b4315fc7SSascha Wildner  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143b4315fc7SSascha Wildner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144b4315fc7SSascha Wildner  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145b4315fc7SSascha Wildner  *
146b4315fc7SSascha Wildner  * Alternatively, you may choose to be licensed under the terms of the
1470d02842fSSascha Wildner  * GNU General Public License ("GPL") version 2 as published by the Free
1480d02842fSSascha Wildner  * Software Foundation.
1490d02842fSSascha Wildner  *
150b4315fc7SSascha Wildner  *****************************************************************************/
1510d02842fSSascha Wildner 
1520d02842fSSascha Wildner #include "acpisrc.h"
1530d02842fSSascha Wildner 
1540d02842fSSascha Wildner /* Local prototypes */
1550d02842fSSascha Wildner 
1560d02842fSSascha Wildner void
1570d02842fSSascha Wildner AsRemoveStatement (
1580d02842fSSascha Wildner     char                    *Buffer,
1590d02842fSSascha Wildner     char                    *Keyword,
1600d02842fSSascha Wildner     UINT32                  Type);
1610d02842fSSascha Wildner 
1620d02842fSSascha Wildner 
1630d02842fSSascha Wildner /******************************************************************************
1640d02842fSSascha Wildner  *
1650d02842fSSascha Wildner  * FUNCTION:    AsRemoveStatement
1660d02842fSSascha Wildner  *
1670d02842fSSascha Wildner  * DESCRIPTION: Remove all statements that contain the given keyword.
1680d02842fSSascha Wildner  *              Limitations:  Removes text from the start of the line that
1690d02842fSSascha Wildner  *              contains the keyword to the next semicolon. Currently
1700d02842fSSascha Wildner  *              doesn't ignore comments.
1710d02842fSSascha Wildner  *
1720d02842fSSascha Wildner  ******************************************************************************/
1730d02842fSSascha Wildner 
1740d02842fSSascha Wildner void
AsRemoveStatement(char * Buffer,char * Keyword,UINT32 Type)1750d02842fSSascha Wildner AsRemoveStatement (
1760d02842fSSascha Wildner     char                    *Buffer,
1770d02842fSSascha Wildner     char                    *Keyword,
1780d02842fSSascha Wildner     UINT32                  Type)
1790d02842fSSascha Wildner {
1800d02842fSSascha Wildner     char                    *SubString;
1810d02842fSSascha Wildner     char                    *SubBuffer;
1820d02842fSSascha Wildner     int                     KeywordLength;
1830d02842fSSascha Wildner 
1840d02842fSSascha Wildner 
1850d02842fSSascha Wildner     KeywordLength = strlen (Keyword);
1860d02842fSSascha Wildner     SubBuffer = Buffer;
1870d02842fSSascha Wildner     SubString = Buffer;
1880d02842fSSascha Wildner 
1890d02842fSSascha Wildner     while (SubString)
1900d02842fSSascha Wildner     {
1910d02842fSSascha Wildner         SubString = strstr (SubBuffer, Keyword);
1920d02842fSSascha Wildner 
1930d02842fSSascha Wildner         if (SubString)
1940d02842fSSascha Wildner         {
1950d02842fSSascha Wildner             SubBuffer = SubString;
1960d02842fSSascha Wildner 
1970d02842fSSascha Wildner             if ((Type == REPLACE_WHOLE_WORD) &&
1980d02842fSSascha Wildner                 (!AsMatchExactWord (SubString, KeywordLength)))
1990d02842fSSascha Wildner             {
2000d02842fSSascha Wildner                 SubBuffer++;
2010d02842fSSascha Wildner                 continue;
2020d02842fSSascha Wildner             }
2030d02842fSSascha Wildner 
2040d02842fSSascha Wildner             /* Find start of this line */
2050d02842fSSascha Wildner 
2060d02842fSSascha Wildner             while (*SubString != '\n')
2070d02842fSSascha Wildner             {
2080d02842fSSascha Wildner                 SubString--;
2090d02842fSSascha Wildner             }
2100d02842fSSascha Wildner             SubString++;
2110d02842fSSascha Wildner 
2120d02842fSSascha Wildner             /* Find end of this statement */
2130d02842fSSascha Wildner 
2140d02842fSSascha Wildner             SubBuffer = AsSkipPastChar (SubBuffer, ';');
2150d02842fSSascha Wildner             if (!SubBuffer)
2160d02842fSSascha Wildner             {
2170d02842fSSascha Wildner                 return;
2180d02842fSSascha Wildner             }
2190d02842fSSascha Wildner 
2200d02842fSSascha Wildner             /* Find end of this line */
2210d02842fSSascha Wildner 
2220d02842fSSascha Wildner             SubBuffer = AsSkipPastChar (SubBuffer, '\n');
2230d02842fSSascha Wildner             if (!SubBuffer)
2240d02842fSSascha Wildner             {
2250d02842fSSascha Wildner                 return;
2260d02842fSSascha Wildner             }
2270d02842fSSascha Wildner 
2280d02842fSSascha Wildner             /* If next line is blank, remove it too */
2290d02842fSSascha Wildner 
2300d02842fSSascha Wildner             if (*SubBuffer == '\n')
2310d02842fSSascha Wildner             {
2320d02842fSSascha Wildner                 SubBuffer++;
2330d02842fSSascha Wildner             }
2340d02842fSSascha Wildner 
2350d02842fSSascha Wildner             /* Remove the lines */
2360d02842fSSascha Wildner 
2370d02842fSSascha Wildner             SubBuffer = AsRemoveData (SubString, SubBuffer);
2380d02842fSSascha Wildner         }
2390d02842fSSascha Wildner     }
2400d02842fSSascha Wildner }
2410d02842fSSascha Wildner 
2420d02842fSSascha Wildner 
2430d02842fSSascha Wildner /******************************************************************************
2440d02842fSSascha Wildner  *
2450d02842fSSascha Wildner  * FUNCTION:    AsRemoveConditionalCompile
2460d02842fSSascha Wildner  *
2470d02842fSSascha Wildner  * DESCRIPTION: Remove a "#ifdef" statement, and all text that it encompasses.
2480d02842fSSascha Wildner  *              Limitations: cannot handle nested ifdefs.
2490d02842fSSascha Wildner  *
2500d02842fSSascha Wildner  ******************************************************************************/
2510d02842fSSascha Wildner 
2520d02842fSSascha Wildner void
AsRemoveConditionalCompile(char * Buffer,char * Keyword)2530d02842fSSascha Wildner AsRemoveConditionalCompile (
2540d02842fSSascha Wildner     char                    *Buffer,
2550d02842fSSascha Wildner     char                    *Keyword)
2560d02842fSSascha Wildner {
2570d02842fSSascha Wildner     char                    *SubString;
2580d02842fSSascha Wildner     char                    *SubBuffer;
2590d02842fSSascha Wildner     char                    *IfPtr;
2600d02842fSSascha Wildner     char                    *EndifPtr;
2610d02842fSSascha Wildner     char                    *ElsePtr;
2620d02842fSSascha Wildner     char                    *Comment;
2630d02842fSSascha Wildner     int                     KeywordLength;
2640d02842fSSascha Wildner 
2650d02842fSSascha Wildner 
2660d02842fSSascha Wildner     KeywordLength = strlen (Keyword);
2670d02842fSSascha Wildner     SubString = Buffer;
2680d02842fSSascha Wildner 
2690d02842fSSascha Wildner     while (SubString)
2700d02842fSSascha Wildner     {
2710d02842fSSascha Wildner         SubBuffer = strstr (SubString, Keyword);
2720d02842fSSascha Wildner         if (!SubBuffer)
2730d02842fSSascha Wildner         {
2740d02842fSSascha Wildner             return;
2750d02842fSSascha Wildner         }
2760d02842fSSascha Wildner 
2770d02842fSSascha Wildner         /*
2780d02842fSSascha Wildner          * Check for translation escape string -- means to ignore
2790d02842fSSascha Wildner          * blocks of code while replacing
2800d02842fSSascha Wildner          */
2810d02842fSSascha Wildner         if (Gbl_IgnoreTranslationEscapes)
2820d02842fSSascha Wildner         {
2830d02842fSSascha Wildner             Comment = NULL;
2840d02842fSSascha Wildner         }
2850d02842fSSascha Wildner         else
2860d02842fSSascha Wildner         {
2870d02842fSSascha Wildner             Comment = strstr (SubString, AS_START_IGNORE);
2880d02842fSSascha Wildner         }
2890d02842fSSascha Wildner 
2900d02842fSSascha Wildner         if ((Comment) &&
2910d02842fSSascha Wildner             (Comment < SubBuffer))
2920d02842fSSascha Wildner         {
2930d02842fSSascha Wildner             SubString = strstr (Comment, AS_STOP_IGNORE);
2940d02842fSSascha Wildner             if (!SubString)
2950d02842fSSascha Wildner             {
2960d02842fSSascha Wildner                 return;
2970d02842fSSascha Wildner             }
2980d02842fSSascha Wildner 
2990d02842fSSascha Wildner             SubString += 3;
3000d02842fSSascha Wildner             continue;
3010d02842fSSascha Wildner         }
3020d02842fSSascha Wildner 
3030d02842fSSascha Wildner         /* Check for ordinary comment */
3040d02842fSSascha Wildner 
3050d02842fSSascha Wildner         Comment = strstr (SubString, "/*");
3060d02842fSSascha Wildner 
3070d02842fSSascha Wildner         if ((Comment) &&
3080d02842fSSascha Wildner             (Comment < SubBuffer))
3090d02842fSSascha Wildner         {
3100d02842fSSascha Wildner             SubString = strstr (Comment, "*/");
3110d02842fSSascha Wildner             if (!SubString)
3120d02842fSSascha Wildner             {
3130d02842fSSascha Wildner                 return;
3140d02842fSSascha Wildner             }
3150d02842fSSascha Wildner 
3160d02842fSSascha Wildner             SubString += 2;
3170d02842fSSascha Wildner             continue;
3180d02842fSSascha Wildner         }
3190d02842fSSascha Wildner 
3200d02842fSSascha Wildner         SubString = SubBuffer;
3210d02842fSSascha Wildner         if (!AsMatchExactWord (SubString, KeywordLength))
3220d02842fSSascha Wildner         {
3230d02842fSSascha Wildner             SubString++;
3240d02842fSSascha Wildner             continue;
3250d02842fSSascha Wildner         }
3260d02842fSSascha Wildner 
3270d02842fSSascha Wildner         /* Find start of this line */
3280d02842fSSascha Wildner 
3290d02842fSSascha Wildner         while (*SubString != '\n' && (SubString > Buffer))
3300d02842fSSascha Wildner         {
3310d02842fSSascha Wildner             SubString--;
3320d02842fSSascha Wildner         }
333820c5b08SSascha Wildner 
3340d02842fSSascha Wildner         SubString++;
3350d02842fSSascha Wildner 
3360d02842fSSascha Wildner         /* Find the "#ifxxxx" */
3370d02842fSSascha Wildner 
3380d02842fSSascha Wildner         IfPtr = strstr (SubString, "#if");
3390d02842fSSascha Wildner         if (!IfPtr)
3400d02842fSSascha Wildner         {
3410d02842fSSascha Wildner             return;
3420d02842fSSascha Wildner         }
3430d02842fSSascha Wildner 
3440d02842fSSascha Wildner         if (IfPtr > SubBuffer)
3450d02842fSSascha Wildner         {
3460d02842fSSascha Wildner             /* Not the right #if */
3470d02842fSSascha Wildner 
3480d02842fSSascha Wildner             SubString = SubBuffer + strlen (Keyword);
3490d02842fSSascha Wildner             continue;
3500d02842fSSascha Wildner         }
3510d02842fSSascha Wildner 
3520d02842fSSascha Wildner         /* Find closing #endif or #else */
3530d02842fSSascha Wildner 
3540d02842fSSascha Wildner         EndifPtr = strstr (SubBuffer, "#endif");
3550d02842fSSascha Wildner         if (!EndifPtr)
3560d02842fSSascha Wildner         {
3570d02842fSSascha Wildner             /* There has to be an #endif */
3580d02842fSSascha Wildner 
3590d02842fSSascha Wildner             return;
3600d02842fSSascha Wildner         }
3610d02842fSSascha Wildner 
3620d02842fSSascha Wildner         ElsePtr = strstr (SubBuffer, "#else");
3630d02842fSSascha Wildner         if ((ElsePtr) &&
3640d02842fSSascha Wildner             (EndifPtr > ElsePtr))
3650d02842fSSascha Wildner         {
3660d02842fSSascha Wildner             /* This #ifdef contains an #else clause */
3670d02842fSSascha Wildner             /* Find end of this line */
3680d02842fSSascha Wildner 
3690d02842fSSascha Wildner             SubBuffer = AsSkipPastChar (ElsePtr, '\n');
3700d02842fSSascha Wildner             if (!SubBuffer)
3710d02842fSSascha Wildner             {
3720d02842fSSascha Wildner                 return;
3730d02842fSSascha Wildner             }
3740d02842fSSascha Wildner 
3750d02842fSSascha Wildner             /* Remove the #ifdef .... #else code */
3760d02842fSSascha Wildner 
3770d02842fSSascha Wildner             AsRemoveData (SubString, SubBuffer);
3780d02842fSSascha Wildner 
3790d02842fSSascha Wildner             /* Next, we will remove the #endif statement */
3800d02842fSSascha Wildner 
3810d02842fSSascha Wildner             EndifPtr = strstr (SubString, "#endif");
3820d02842fSSascha Wildner             if (!EndifPtr)
3830d02842fSSascha Wildner             {
3840d02842fSSascha Wildner                 /* There has to be an #endif */
3850d02842fSSascha Wildner 
3860d02842fSSascha Wildner                 return;
3870d02842fSSascha Wildner             }
3880d02842fSSascha Wildner 
3890d02842fSSascha Wildner             SubString = EndifPtr;
3900d02842fSSascha Wildner         }
3910d02842fSSascha Wildner 
3920d02842fSSascha Wildner         /* Remove the ... #endif part */
3930d02842fSSascha Wildner         /* Find end of this line */
3940d02842fSSascha Wildner 
3950d02842fSSascha Wildner         SubBuffer = AsSkipPastChar (EndifPtr, '\n');
3960d02842fSSascha Wildner         if (!SubBuffer)
3970d02842fSSascha Wildner         {
3980d02842fSSascha Wildner             return;
3990d02842fSSascha Wildner         }
4000d02842fSSascha Wildner 
4010d02842fSSascha Wildner         /* Remove the lines */
4020d02842fSSascha Wildner 
403e5412f1eSSascha Wildner         (void) AsRemoveData (SubString, SubBuffer);
4040d02842fSSascha Wildner     }
4050d02842fSSascha Wildner }
4060d02842fSSascha Wildner 
4070d02842fSSascha Wildner 
40825ca8c79SSascha Wildner #ifdef _OBSOLETE_FUNCTIONS
4090d02842fSSascha Wildner /******************************************************************************
4100d02842fSSascha Wildner  *
4110d02842fSSascha Wildner  * FUNCTION:    AsRemoveMacro
4120d02842fSSascha Wildner  *
4130d02842fSSascha Wildner  * DESCRIPTION: Remove every line that contains the keyword. Does not
4140d02842fSSascha Wildner  *              skip comments.
4150d02842fSSascha Wildner  *
4160d02842fSSascha Wildner  ******************************************************************************/
4170d02842fSSascha Wildner 
41825ca8c79SSascha Wildner NOTE: This function is no longer used and is commented out for now.
41925ca8c79SSascha Wildner 
42025ca8c79SSascha Wildner Also, it appears to have one or more bugs in it. It can incorrectly remove
42125ca8c79SSascha Wildner lines of code, producing some garbage.
42225ca8c79SSascha Wildner 
4230d02842fSSascha Wildner void
4240d02842fSSascha Wildner AsRemoveMacro (
4250d02842fSSascha Wildner     char                    *Buffer,
4260d02842fSSascha Wildner     char                    *Keyword)
4270d02842fSSascha Wildner {
4280d02842fSSascha Wildner     char                    *SubString;
4290d02842fSSascha Wildner     char                    *SubBuffer;
4300d02842fSSascha Wildner     int                     NestLevel;
4310d02842fSSascha Wildner 
4320d02842fSSascha Wildner 
4330d02842fSSascha Wildner     SubBuffer = Buffer;
4340d02842fSSascha Wildner     SubString = Buffer;
4350d02842fSSascha Wildner 
4360d02842fSSascha Wildner     while (SubString)
4370d02842fSSascha Wildner     {
4380d02842fSSascha Wildner         SubString = strstr (SubBuffer, Keyword);
4390d02842fSSascha Wildner 
4400d02842fSSascha Wildner         if (SubString)
4410d02842fSSascha Wildner         {
4420d02842fSSascha Wildner             SubBuffer = SubString;
4430d02842fSSascha Wildner 
4440d02842fSSascha Wildner             /* Find start of the macro parameters */
4450d02842fSSascha Wildner 
4460d02842fSSascha Wildner             while (*SubString != '(')
4470d02842fSSascha Wildner             {
4480d02842fSSascha Wildner                 SubString++;
4490d02842fSSascha Wildner             }
4500d02842fSSascha Wildner             SubString++;
4510d02842fSSascha Wildner 
4520d02842fSSascha Wildner             /* Remove the macro name and opening paren */
4530d02842fSSascha Wildner 
4540d02842fSSascha Wildner             SubString = AsRemoveData (SubBuffer, SubString);
4550d02842fSSascha Wildner 
4560d02842fSSascha Wildner             NestLevel = 1;
4570d02842fSSascha Wildner             while (*SubString)
4580d02842fSSascha Wildner             {
4590d02842fSSascha Wildner                 if (*SubString == '(')
4600d02842fSSascha Wildner                 {
4610d02842fSSascha Wildner                     NestLevel++;
4620d02842fSSascha Wildner                 }
4630d02842fSSascha Wildner                 else if (*SubString == ')')
4640d02842fSSascha Wildner                 {
4650d02842fSSascha Wildner                     NestLevel--;
4660d02842fSSascha Wildner                 }
4670d02842fSSascha Wildner 
4680d02842fSSascha Wildner                 SubString++;
4690d02842fSSascha Wildner 
4700d02842fSSascha Wildner                 if (NestLevel == 0)
4710d02842fSSascha Wildner                 {
4720d02842fSSascha Wildner                     break;
4730d02842fSSascha Wildner                 }
4740d02842fSSascha Wildner             }
4750d02842fSSascha Wildner 
4760d02842fSSascha Wildner             /* Remove the closing paren */
4770d02842fSSascha Wildner 
4780d02842fSSascha Wildner             SubBuffer = AsRemoveData (SubString-1, SubString);
4790d02842fSSascha Wildner         }
4800d02842fSSascha Wildner     }
4810d02842fSSascha Wildner }
48225ca8c79SSascha Wildner #endif
4830d02842fSSascha Wildner 
4840d02842fSSascha Wildner /******************************************************************************
4850d02842fSSascha Wildner  *
4860d02842fSSascha Wildner  * FUNCTION:    AsRemoveLine
4870d02842fSSascha Wildner  *
4880d02842fSSascha Wildner  * DESCRIPTION: Remove every line that contains the keyword. Does not
4890d02842fSSascha Wildner  *              skip comments.
4900d02842fSSascha Wildner  *
4910d02842fSSascha Wildner  ******************************************************************************/
4920d02842fSSascha Wildner 
4930d02842fSSascha Wildner void
AsRemoveLine(char * Buffer,char * Keyword)4940d02842fSSascha Wildner AsRemoveLine (
4950d02842fSSascha Wildner     char                    *Buffer,
4960d02842fSSascha Wildner     char                    *Keyword)
4970d02842fSSascha Wildner {
4980d02842fSSascha Wildner     char                    *SubString;
4990d02842fSSascha Wildner     char                    *SubBuffer;
5000d02842fSSascha Wildner 
5010d02842fSSascha Wildner 
5020d02842fSSascha Wildner     SubBuffer = Buffer;
5030d02842fSSascha Wildner     SubString = Buffer;
5040d02842fSSascha Wildner 
5050d02842fSSascha Wildner     while (SubString)
5060d02842fSSascha Wildner     {
5070d02842fSSascha Wildner         SubString = strstr (SubBuffer, Keyword);
5080d02842fSSascha Wildner 
5090d02842fSSascha Wildner         if (SubString)
5100d02842fSSascha Wildner         {
5110d02842fSSascha Wildner             SubBuffer = SubString;
5120d02842fSSascha Wildner 
5130d02842fSSascha Wildner             /* Find start of this line */
5140d02842fSSascha Wildner 
5150d02842fSSascha Wildner             while (*SubString != '\n')
5160d02842fSSascha Wildner             {
5170d02842fSSascha Wildner                 SubString--;
5180d02842fSSascha Wildner             }
5190d02842fSSascha Wildner             SubString++;
5200d02842fSSascha Wildner 
5210d02842fSSascha Wildner             /* Find end of this line */
5220d02842fSSascha Wildner 
5230d02842fSSascha Wildner             SubBuffer = AsSkipPastChar (SubBuffer, '\n');
5240d02842fSSascha Wildner             if (!SubBuffer)
5250d02842fSSascha Wildner             {
5260d02842fSSascha Wildner                 return;
5270d02842fSSascha Wildner             }
5280d02842fSSascha Wildner 
5290d02842fSSascha Wildner             /* Remove the line */
5300d02842fSSascha Wildner 
5310d02842fSSascha Wildner             SubBuffer = AsRemoveData (SubString, SubBuffer);
5320d02842fSSascha Wildner         }
5330d02842fSSascha Wildner     }
5340d02842fSSascha Wildner }
5350d02842fSSascha Wildner 
5360d02842fSSascha Wildner 
5370d02842fSSascha Wildner /******************************************************************************
5380d02842fSSascha Wildner  *
5390d02842fSSascha Wildner  * FUNCTION:    AsReduceTypedefs
5400d02842fSSascha Wildner  *
5410d02842fSSascha Wildner  * DESCRIPTION: Eliminate certain typedefs
5420d02842fSSascha Wildner  *
5430d02842fSSascha Wildner  ******************************************************************************/
5440d02842fSSascha Wildner 
5450d02842fSSascha Wildner void
AsReduceTypedefs(char * Buffer,char * Keyword)5460d02842fSSascha Wildner AsReduceTypedefs (
5470d02842fSSascha Wildner     char                    *Buffer,
5480d02842fSSascha Wildner     char                    *Keyword)
5490d02842fSSascha Wildner {
5500d02842fSSascha Wildner     char                    *SubString;
5510d02842fSSascha Wildner     char                    *SubBuffer;
5521093ca81SSascha Wildner     char                    *SubSubString;
5530d02842fSSascha Wildner     int                     NestLevel;
5540d02842fSSascha Wildner 
5550d02842fSSascha Wildner 
5560d02842fSSascha Wildner     SubBuffer = Buffer;
5570d02842fSSascha Wildner     SubString = Buffer;
5580d02842fSSascha Wildner 
5590d02842fSSascha Wildner     while (SubString)
5600d02842fSSascha Wildner     {
5610d02842fSSascha Wildner         SubString = strstr (SubBuffer, Keyword);
5620d02842fSSascha Wildner 
5630d02842fSSascha Wildner         if (SubString)
5640d02842fSSascha Wildner         {
5651093ca81SSascha Wildner             SubSubString = SubString + strlen (Keyword);
5661093ca81SSascha Wildner 
5671093ca81SSascha Wildner             /* skip spaces */
5681093ca81SSascha Wildner 
5691093ca81SSascha Wildner             while (strchr(" \t\r\n", *SubSubString))
5701093ca81SSascha Wildner             {
5711093ca81SSascha Wildner                 SubSubString++;
5721093ca81SSascha Wildner             }
5731093ca81SSascha Wildner 
5741093ca81SSascha Wildner             /* skip type name */
5751093ca81SSascha Wildner 
5761093ca81SSascha Wildner             while (!strchr(" \t\r\n", *SubSubString))
5771093ca81SSascha Wildner             {
5781093ca81SSascha Wildner                 SubSubString++;
5791093ca81SSascha Wildner             }
5801093ca81SSascha Wildner 
5811093ca81SSascha Wildner             /* skip spaces */
5821093ca81SSascha Wildner 
5831093ca81SSascha Wildner             while (strchr(" \t\r\n", *SubSubString))
5841093ca81SSascha Wildner             {
5851093ca81SSascha Wildner                 SubSubString++;
5861093ca81SSascha Wildner             }
5871093ca81SSascha Wildner 
5881093ca81SSascha Wildner             if (*SubSubString == '{')
5891093ca81SSascha Wildner             {
5900d02842fSSascha Wildner                 /* Remove the typedef itself */
5910d02842fSSascha Wildner 
5920d02842fSSascha Wildner                 SubBuffer = SubString + strlen ("typedef") + 1;
593e5412f1eSSascha Wildner                 (void) AsRemoveData (SubString, SubBuffer);
5940d02842fSSascha Wildner 
5950d02842fSSascha Wildner                 /* Find the opening brace of the struct or union */
5960d02842fSSascha Wildner 
5970d02842fSSascha Wildner                 while (*SubString != '{')
5980d02842fSSascha Wildner                 {
5990d02842fSSascha Wildner                     SubString++;
6000d02842fSSascha Wildner                 }
6010d02842fSSascha Wildner                 SubString++;
6020d02842fSSascha Wildner 
6030d02842fSSascha Wildner                 /* Find the closing brace. Handles nested braces */
6040d02842fSSascha Wildner 
6050d02842fSSascha Wildner                 NestLevel = 1;
6060d02842fSSascha Wildner                 while (*SubString)
6070d02842fSSascha Wildner                 {
6080d02842fSSascha Wildner                     if (*SubString == '{')
6090d02842fSSascha Wildner                     {
6100d02842fSSascha Wildner                         NestLevel++;
6110d02842fSSascha Wildner                     }
6120d02842fSSascha Wildner                     else if (*SubString == '}')
6130d02842fSSascha Wildner                     {
6140d02842fSSascha Wildner                         NestLevel--;
6150d02842fSSascha Wildner                     }
6160d02842fSSascha Wildner 
6170d02842fSSascha Wildner                     SubString++;
6180d02842fSSascha Wildner 
6190d02842fSSascha Wildner                     if (NestLevel == 0)
6200d02842fSSascha Wildner                     {
6210d02842fSSascha Wildner                         break;
6220d02842fSSascha Wildner                     }
6230d02842fSSascha Wildner                 }
6240d02842fSSascha Wildner 
6250d02842fSSascha Wildner                 /* Remove an extra line feed if present */
6260d02842fSSascha Wildner 
6270d02842fSSascha Wildner                 if (!strncmp (SubString - 3, "\n\n", 2))
6280d02842fSSascha Wildner                 {
6290d02842fSSascha Wildner                     *(SubString -2) = '}';
6300d02842fSSascha Wildner                     SubString--;
6310d02842fSSascha Wildner                 }
6320d02842fSSascha Wildner 
6330d02842fSSascha Wildner                 /* Find the end of the typedef name */
6340d02842fSSascha Wildner 
6350d02842fSSascha Wildner                 SubBuffer = AsSkipUntilChar (SubString, ';');
6360d02842fSSascha Wildner 
6370d02842fSSascha Wildner                 /* And remove the typedef name */
6380d02842fSSascha Wildner 
6390d02842fSSascha Wildner                 SubBuffer = AsRemoveData (SubString, SubBuffer);
6400d02842fSSascha Wildner             }
6411093ca81SSascha Wildner             else
6421093ca81SSascha Wildner             {
6431093ca81SSascha Wildner                 /* Skip the entire definition */
6441093ca81SSascha Wildner 
6451093ca81SSascha Wildner                 SubString = strchr (SubString, ';') + 1;
6461093ca81SSascha Wildner                 SubBuffer = SubString;
6471093ca81SSascha Wildner             }
6481093ca81SSascha Wildner         }
6490d02842fSSascha Wildner     }
6500d02842fSSascha Wildner }
6510d02842fSSascha Wildner 
6520d02842fSSascha Wildner 
6530d02842fSSascha Wildner /******************************************************************************
6540d02842fSSascha Wildner  *
6550d02842fSSascha Wildner  * FUNCTION:    AsRemoveEmptyBlocks
6560d02842fSSascha Wildner  *
6570d02842fSSascha Wildner  * DESCRIPTION: Remove any C blocks (e.g., if {}) that contain no code. This
6580d02842fSSascha Wildner  *              can happen as a result of removing lines such as DEBUG_PRINT.
6590d02842fSSascha Wildner  *
6600d02842fSSascha Wildner  ******************************************************************************/
6610d02842fSSascha Wildner 
6620d02842fSSascha Wildner void
AsRemoveEmptyBlocks(char * Buffer,char * Filename)6630d02842fSSascha Wildner AsRemoveEmptyBlocks (
6640d02842fSSascha Wildner     char                    *Buffer,
6650d02842fSSascha Wildner     char                    *Filename)
6660d02842fSSascha Wildner {
6670d02842fSSascha Wildner     char                    *SubBuffer;
6680d02842fSSascha Wildner     char                    *BlockStart;
6690d02842fSSascha Wildner     BOOLEAN                 EmptyBlock = TRUE;
6700d02842fSSascha Wildner     BOOLEAN                 AnotherPassRequired = TRUE;
6710d02842fSSascha Wildner     UINT32                  BlockCount = 0;
6720d02842fSSascha Wildner 
6730d02842fSSascha Wildner 
6740d02842fSSascha Wildner     while (AnotherPassRequired)
6750d02842fSSascha Wildner     {
6760d02842fSSascha Wildner         SubBuffer = Buffer;
6770d02842fSSascha Wildner         AnotherPassRequired = FALSE;
6780d02842fSSascha Wildner 
6790d02842fSSascha Wildner         while (*SubBuffer)
6800d02842fSSascha Wildner         {
6810d02842fSSascha Wildner             if (*SubBuffer == '{')
6820d02842fSSascha Wildner             {
6830d02842fSSascha Wildner                 BlockStart = SubBuffer;
6840d02842fSSascha Wildner                 EmptyBlock = TRUE;
6850d02842fSSascha Wildner 
6860d02842fSSascha Wildner                 SubBuffer++;
6870d02842fSSascha Wildner                 while (*SubBuffer != '}')
6880d02842fSSascha Wildner                 {
6890d02842fSSascha Wildner                     if ((*SubBuffer != ' ') &&
6900d02842fSSascha Wildner                         (*SubBuffer != '\n'))
6910d02842fSSascha Wildner                     {
6920d02842fSSascha Wildner                         EmptyBlock = FALSE;
6930d02842fSSascha Wildner                         break;
6940d02842fSSascha Wildner                     }
695820c5b08SSascha Wildner 
6960d02842fSSascha Wildner                     SubBuffer++;
6970d02842fSSascha Wildner                 }
6980d02842fSSascha Wildner 
6990d02842fSSascha Wildner                 if (EmptyBlock)
7000d02842fSSascha Wildner                 {
7010d02842fSSascha Wildner                     /* Find start of the first line of the block */
7020d02842fSSascha Wildner 
7030d02842fSSascha Wildner                     while (*BlockStart != '\n')
7040d02842fSSascha Wildner                     {
7050d02842fSSascha Wildner                         BlockStart--;
7060d02842fSSascha Wildner                     }
7070d02842fSSascha Wildner 
7080d02842fSSascha Wildner                     /* Find end of the last line of the block */
7090d02842fSSascha Wildner 
7100d02842fSSascha Wildner                     SubBuffer = AsSkipUntilChar (SubBuffer, '\n');
7110d02842fSSascha Wildner                     if (!SubBuffer)
7120d02842fSSascha Wildner                     {
7130d02842fSSascha Wildner                         break;
7140d02842fSSascha Wildner                     }
7150d02842fSSascha Wildner 
7160d02842fSSascha Wildner                     /* Remove the block */
7170d02842fSSascha Wildner 
7180d02842fSSascha Wildner                     SubBuffer = AsRemoveData (BlockStart, SubBuffer);
7190d02842fSSascha Wildner                     BlockCount++;
7200d02842fSSascha Wildner                     AnotherPassRequired = TRUE;
7210d02842fSSascha Wildner                     continue;
7220d02842fSSascha Wildner                 }
7230d02842fSSascha Wildner             }
7240d02842fSSascha Wildner 
7250d02842fSSascha Wildner             SubBuffer++;
7260d02842fSSascha Wildner         }
7270d02842fSSascha Wildner     }
7280d02842fSSascha Wildner 
7290d02842fSSascha Wildner     if (BlockCount)
7300d02842fSSascha Wildner     {
7310d02842fSSascha Wildner         Gbl_MadeChanges = TRUE;
7320d02842fSSascha Wildner         AsPrint ("Code blocks deleted", BlockCount, Filename);
7330d02842fSSascha Wildner     }
7340d02842fSSascha Wildner }
7350d02842fSSascha Wildner 
7360d02842fSSascha Wildner 
7370d02842fSSascha Wildner /******************************************************************************
7380d02842fSSascha Wildner  *
7390d02842fSSascha Wildner  * FUNCTION:    AsRemoveDebugMacros
7400d02842fSSascha Wildner  *
7410d02842fSSascha Wildner  * DESCRIPTION: Remove all "Debug" macros -- macros that produce debug output.
7420d02842fSSascha Wildner  *
7430d02842fSSascha Wildner  ******************************************************************************/
7440d02842fSSascha Wildner 
7450d02842fSSascha Wildner void
AsRemoveDebugMacros(char * Buffer)7460d02842fSSascha Wildner AsRemoveDebugMacros (
7470d02842fSSascha Wildner     char                    *Buffer)
7480d02842fSSascha Wildner {
7490d02842fSSascha Wildner     AsRemoveConditionalCompile (Buffer, "ACPI_DEBUG_OUTPUT");
7500d02842fSSascha Wildner 
7510d02842fSSascha Wildner     AsRemoveStatement (Buffer, "ACPI_DEBUG_PRINT",      REPLACE_WHOLE_WORD);
7520d02842fSSascha Wildner     AsRemoveStatement (Buffer, "ACPI_DEBUG_PRINT_RAW",  REPLACE_WHOLE_WORD);
7530d02842fSSascha Wildner     AsRemoveStatement (Buffer, "DEBUG_EXEC",            REPLACE_WHOLE_WORD);
7540d02842fSSascha Wildner     AsRemoveStatement (Buffer, "FUNCTION_ENTRY",        REPLACE_WHOLE_WORD);
7550d02842fSSascha Wildner     AsRemoveStatement (Buffer, "PROC_NAME",             REPLACE_WHOLE_WORD);
7560d02842fSSascha Wildner     AsRemoveStatement (Buffer, "FUNCTION_TRACE",        REPLACE_SUBSTRINGS);
7570d02842fSSascha Wildner     AsRemoveStatement (Buffer, "DUMP_",                 REPLACE_SUBSTRINGS);
7580d02842fSSascha Wildner 
7590d02842fSSascha Wildner     AsReplaceString ("return_VOID",         "return", REPLACE_WHOLE_WORD, Buffer);
7600d02842fSSascha Wildner     AsReplaceString ("return_PTR",          "return", REPLACE_WHOLE_WORD, Buffer);
7612adac2b8SSascha Wildner     AsReplaceString ("return_STR",          "return", REPLACE_WHOLE_WORD, Buffer);
7620d02842fSSascha Wildner     AsReplaceString ("return_ACPI_STATUS",  "return", REPLACE_WHOLE_WORD, Buffer);
7630d02842fSSascha Wildner     AsReplaceString ("return_acpi_status",  "return", REPLACE_WHOLE_WORD, Buffer);
7640d02842fSSascha Wildner     AsReplaceString ("return_VALUE",        "return", REPLACE_WHOLE_WORD, Buffer);
7650d02842fSSascha Wildner }
7660d02842fSSascha Wildner 
7670d02842fSSascha Wildner 
7680d02842fSSascha Wildner /******************************************************************************
7690d02842fSSascha Wildner  *
7700d02842fSSascha Wildner  * FUNCTION:    AsCleanupSpecialMacro
7710d02842fSSascha Wildner  *
7720d02842fSSascha Wildner  * DESCRIPTION: For special macro invocations (invoked without ";" at the end
7730d02842fSSascha Wildner  *              of the lines), do the following:
7740d02842fSSascha Wildner  *              1. Remove spaces appended by indent at the beginning of lines.
7750d02842fSSascha Wildner  *              2. Add an empty line between two special macro invocations.
7760d02842fSSascha Wildner  *
7770d02842fSSascha Wildner  ******************************************************************************/
7780d02842fSSascha Wildner 
7790d02842fSSascha Wildner void
AsCleanupSpecialMacro(char * Buffer,char * Keyword)7800d02842fSSascha Wildner AsCleanupSpecialMacro (
7810d02842fSSascha Wildner     char                    *Buffer,
7820d02842fSSascha Wildner     char                    *Keyword)
7830d02842fSSascha Wildner {
7840d02842fSSascha Wildner     char                    *SubString;
7850d02842fSSascha Wildner     char                    *SubBuffer;
7860d02842fSSascha Wildner     char                    *CommentEnd;
7870d02842fSSascha Wildner     int                     NewLine;
7880d02842fSSascha Wildner     int                     NestLevel;
7890d02842fSSascha Wildner 
7900d02842fSSascha Wildner 
7910d02842fSSascha Wildner     SubBuffer = Buffer;
7920d02842fSSascha Wildner     SubString = Buffer;
7930d02842fSSascha Wildner 
7940d02842fSSascha Wildner     while (SubString)
7950d02842fSSascha Wildner     {
7960d02842fSSascha Wildner         SubString = strstr (SubBuffer, Keyword);
7970d02842fSSascha Wildner 
7980d02842fSSascha Wildner         if (SubString)
7990d02842fSSascha Wildner         {
8000d02842fSSascha Wildner             /* Find start of the macro parameters */
8010d02842fSSascha Wildner 
8020d02842fSSascha Wildner             while (*SubString != '(')
8030d02842fSSascha Wildner             {
8040d02842fSSascha Wildner                 SubString++;
8050d02842fSSascha Wildner             }
806820c5b08SSascha Wildner 
8070d02842fSSascha Wildner             SubString++;
8080d02842fSSascha Wildner 
8090d02842fSSascha Wildner             NestLevel = 1;
8100d02842fSSascha Wildner             while (*SubString)
8110d02842fSSascha Wildner             {
8120d02842fSSascha Wildner                 if (*SubString == '(')
8130d02842fSSascha Wildner                 {
8140d02842fSSascha Wildner                     NestLevel++;
8150d02842fSSascha Wildner                 }
8160d02842fSSascha Wildner                 else if (*SubString == ')')
8170d02842fSSascha Wildner                 {
8180d02842fSSascha Wildner                     NestLevel--;
8190d02842fSSascha Wildner                 }
8200d02842fSSascha Wildner 
8210d02842fSSascha Wildner                 SubString++;
8220d02842fSSascha Wildner 
8230d02842fSSascha Wildner                 if (NestLevel == 0)
8240d02842fSSascha Wildner                 {
8250d02842fSSascha Wildner                     break;
8260d02842fSSascha Wildner                 }
8270d02842fSSascha Wildner             }
8280d02842fSSascha Wildner 
8290d02842fSSascha Wildner SkipLine:
8300d02842fSSascha Wildner 
8310d02842fSSascha Wildner             /* Find end of the line */
8320d02842fSSascha Wildner 
8330d02842fSSascha Wildner             NewLine = FALSE;
8340d02842fSSascha Wildner             while (!NewLine && *SubString)
8350d02842fSSascha Wildner             {
8360d02842fSSascha Wildner                 if (*SubString == '\n' && *(SubString - 1) != '\\')
8370d02842fSSascha Wildner                 {
8380d02842fSSascha Wildner                     NewLine = TRUE;
8390d02842fSSascha Wildner                 }
840820c5b08SSascha Wildner 
8410d02842fSSascha Wildner                 SubString++;
8420d02842fSSascha Wildner             }
8430d02842fSSascha Wildner 
8440d02842fSSascha Wildner             /* Find end of the line */
8450d02842fSSascha Wildner 
8460d02842fSSascha Wildner             if (*SubString == '#' || *SubString == '\n')
8470d02842fSSascha Wildner             {
8480d02842fSSascha Wildner                 goto SkipLine;
8490d02842fSSascha Wildner             }
8500d02842fSSascha Wildner 
8510d02842fSSascha Wildner             SubBuffer = SubString;
8520d02842fSSascha Wildner 
8530d02842fSSascha Wildner             /* Find start of the non-space */
8540d02842fSSascha Wildner 
8550d02842fSSascha Wildner             while (*SubString == ' ')
8560d02842fSSascha Wildner             {
8570d02842fSSascha Wildner                 SubString++;
8580d02842fSSascha Wildner             }
8590d02842fSSascha Wildner 
8600d02842fSSascha Wildner             /* Find end of the line */
8610d02842fSSascha Wildner 
8620d02842fSSascha Wildner             if (*SubString == '#' || *SubString == '\n')
8630d02842fSSascha Wildner             {
8640d02842fSSascha Wildner                 goto SkipLine;
8650d02842fSSascha Wildner             }
8660d02842fSSascha Wildner 
8670d02842fSSascha Wildner             /* Find end of the line */
8680d02842fSSascha Wildner 
8690d02842fSSascha Wildner             if (*SubString == '/' || *SubString == '*')
8700d02842fSSascha Wildner             {
8710d02842fSSascha Wildner                 CommentEnd = strstr (SubString, "*/");
8720d02842fSSascha Wildner                 if (CommentEnd)
8730d02842fSSascha Wildner                 {
8740d02842fSSascha Wildner                     SubString = CommentEnd + 2;
8750d02842fSSascha Wildner                     goto SkipLine;
8760d02842fSSascha Wildner                 }
8770d02842fSSascha Wildner             }
8780d02842fSSascha Wildner 
8790d02842fSSascha Wildner             SubString = AsRemoveData (SubBuffer, SubString);
8800d02842fSSascha Wildner         }
8810d02842fSSascha Wildner     }
8820d02842fSSascha Wildner }
883