xref: /netbsd-src/sys/external/bsd/acpica/dist/compiler/preprocess.h (revision 046a29855e04359424fd074e8313af6b6be8cfb6)
1 /******************************************************************************
2  *
3  * Module Name: preprocess.h - header for iASL Preprocessor
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2023, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #define __PREPROCESS_H__
45 
46 #ifndef _PREPROCESS
47 #define _PREPROCESS
48 
49 #undef PR_EXTERN
50 
51 #ifdef _DECLARE_PR_GLOBALS
52 #define PR_EXTERN
53 #define PR_INIT_GLOBAL(a,b)         (a)=(b)
54 #else
55 #define PR_EXTERN                   extern
56 #define PR_INIT_GLOBAL(a,b)         (a)
57 #endif
58 
59 
60 /*
61  * Configuration
62  */
63 #define PR_MAX_MACRO_ARGS       32              /* Max number of macro args */
64 #define PR_MAX_ARG_INSTANCES    24              /* Max instances of any one arg */
65 #define PR_LINES_PER_BLOCK      4096            /* Max input source lines per block */
66 
67 
68 /*
69  * Local defines and macros
70  */
71 #define PR_TOKEN_SEPARATORS     " ,(){}\t\n"
72 #define PR_MACRO_SEPARATORS     " ,(){}~!*/%+-<>=&^|\"\t\n"
73 #define PR_MACRO_ARGUMENTS      " ,\t\n"
74 #define PR_EXPR_SEPARATORS      " ,(){}~!*/%+-<>=&^|\"\t\n"
75 
76 #define PR_PREFIX_ID            "Pr(%.4u) - "             /* Used for debug output */
77 
78 #define THIS_TOKEN_OFFSET(t)    ((AslGbl_MainTokenBuffer - t) + 1)
79 
80 
81 /*
82  * Preprocessor structures
83  */
84 typedef struct pr_macro_arg
85 {
86     char                        *Name;
87     UINT32                      Offset[PR_MAX_ARG_INSTANCES];
88     UINT16                      UseCount;
89 
90 } PR_MACRO_ARG;
91 
92 typedef struct pr_define_info
93 {
94     struct pr_define_info       *Previous;
95     struct pr_define_info       *Next;
96     char                        *Identifier;
97     char                        *Replacement;
98     char                        *Body;          /* Macro body */
99     PR_MACRO_ARG                *Args;          /* Macro arg list */
100     UINT16                      ArgCount;       /* Macro arg count */
101     BOOLEAN                     Persist;        /* Keep for entire compiler run */
102 
103 } PR_DEFINE_INFO;
104 
105 typedef struct pr_directive_info
106 {
107     char                        *Name;          /* Directive name */
108     UINT8                       ArgCount;       /* Required # of args */
109 
110 } PR_DIRECTIVE_INFO;
111 
112 typedef struct pr_operator_info
113 {
114     char                        *Op;
115 
116 } PR_OPERATOR_INFO;
117 
118 typedef struct pr_file_node
119 {
120     struct pr_file_node         *Next;
121     FILE                        *File;
122     char                        *Filename;
123     UINT32                      CurrentLineNumber;
124 
125 } PR_FILE_NODE;
126 
127 #define MAX_ARGUMENT_LENGTH     24
128 
129 typedef struct directive_info
130 {
131     struct directive_info       *Next;
132     char                        Argument[MAX_ARGUMENT_LENGTH];
133     int                         Directive;
134     BOOLEAN                     IgnoringThisCodeBlock;
135 
136 } DIRECTIVE_INFO;
137 
138 
139 /*
140  * Globals
141  */
142 PR_EXTERN char                  PR_INIT_GLOBAL (*AslGbl_MainTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
143 PR_EXTERN char                  PR_INIT_GLOBAL (*AslGbl_MacroTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
144 PR_EXTERN char                  PR_INIT_GLOBAL (*AslGbl_MacroTokenReplaceBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
145 PR_EXTERN char                  PR_INIT_GLOBAL (*AslGbl_ExpressionTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
146 
147 PR_EXTERN UINT32                AslGbl_PreprocessorLineNumber;
148 PR_EXTERN int                   AslGbl_IfDepth;
149 PR_EXTERN PR_FILE_NODE          *AslGbl_InputFileList;
150 PR_EXTERN BOOLEAN               PR_INIT_GLOBAL (AslGbl_PreprocessorError, FALSE);
151 PR_EXTERN BOOLEAN               PR_INIT_GLOBAL (AslGbl_IgnoringThisCodeBlock, FALSE);
152 PR_EXTERN PR_DEFINE_INFO        PR_INIT_GLOBAL (*AslGbl_DefineList, NULL);
153 PR_EXTERN DIRECTIVE_INFO        PR_INIT_GLOBAL (*AslGbl_DirectiveStack, NULL);
154 
155 #if 0 /* TBD for macros */
156 PR_EXTERN char                  PR_INIT_GLOBAL (*XXXEvalBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
157 #endif
158 
159 
160 /*
161  * prscan - Preprocessor entry
162  */
163 void
164 PrInitializePreprocessor (
165     void);
166 
167 void
168 PrInitializeGlobals (
169     void);
170 
171 void
172 PrTerminatePreprocessor (
173     void);
174 
175 void
176 PrDoPreprocess (
177     void);
178 
179 UINT64
180 PrIsDefined (
181     char                    *Identifier);
182 
183 UINT64
184 PrResolveDefine (
185     char                    *Identifier);
186 
187 int
188 PrInitLexer (
189     char                    *String);
190 
191 void
192 PrTerminateLexer (
193     void);
194 
195 
196 /*
197  * prmacros - Support for #defines and macros
198  */
199 void
200 PrDumpPredefinedNames (
201     void);
202 
203 PR_DEFINE_INFO *
204 PrAddDefine (
205     char                    *Token,
206     char                    *Token2,
207     BOOLEAN                 Persist);
208 
209 void
210 PrRemoveDefine (
211     char                    *DefineName);
212 
213 PR_DEFINE_INFO *
214 PrMatchDefine (
215     char                    *MatchString);
216 
217 void
218 PrAddMacro (
219     char                    *Name,
220     char                    **Next);
221 
222 void
223 PrDoMacroInvocation (
224     char                    *TokenBuffer,
225     char                    *MacroStart,
226     PR_DEFINE_INFO          *DefineInfo,
227     char                    **Next);
228 
229 
230 /*
231  * prexpress - #if expression support
232  */
233 ACPI_STATUS
234 PrResolveIntegerExpression (
235     char                    *Line,
236     UINT64                  *ReturnValue);
237 
238 char *
239 PrPrioritizeExpression (
240     char                    *OriginalLine);
241 
242 /*
243  * prparser - lex/yacc expression parser
244  */
245 UINT64
246 PrEvaluateExpression (
247     char                    *ExprString);
248 
249 
250 /*
251  * prutils - Preprocessor utilities
252  */
253 char *
254 PrGetNextToken (
255     char                    *Buffer,
256     char                    *MatchString,
257     char                    **Next);
258 
259 void
260 PrError (
261     UINT8                   Level,
262     UINT16                  MessageId,
263     UINT32                  Column);
264 
265 void
266 PrReplaceResizeSubstring(
267     PR_MACRO_ARG            *Args,
268     UINT32                  Diff1,
269     UINT32                  Diff2,
270     UINT32                  i,
271     char                    *Token);
272 
273 char *
274 PrReplaceData (
275     char                    *Buffer,
276     UINT32                  LengthToRemove,
277     char                    *BufferToAdd,
278     UINT32                  LengthToAdd);
279 
280 FILE *
281 PrOpenIncludeFile (
282     char                    *Filename,
283     char                    *OpenMode,
284     char                    **FullPathname);
285 
286 FILE *
287 PrOpenIncludeWithPrefix (
288     char                    *PrefixDir,
289     char                    *Filename,
290     char                    *OpenMode,
291     char                    **FullPathname);
292 
293 void
294 PrPushInputFileStack (
295     FILE                    *InputFile,
296     char                    *Filename);
297 
298 BOOLEAN
299 PrPopInputFileStack (
300     void);
301 
302 #endif
303