1233237Sjkim/******************************************************************************
2233237Sjkim *
3233237Sjkim * Module Name: preprocess.h - header for iASL Preprocessor
4233237Sjkim *
5233237Sjkim *****************************************************************************/
6233237Sjkim
7233237Sjkim/*
8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp.
9233237Sjkim * All rights reserved.
10233237Sjkim *
11233237Sjkim * Redistribution and use in source and binary forms, with or without
12233237Sjkim * modification, are permitted provided that the following conditions
13233237Sjkim * are met:
14233237Sjkim * 1. Redistributions of source code must retain the above copyright
15233237Sjkim *    notice, this list of conditions, and the following disclaimer,
16233237Sjkim *    without modification.
17233237Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18233237Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19233237Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20233237Sjkim *    including a substantially similar Disclaimer requirement for further
21233237Sjkim *    binary redistribution.
22233237Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23233237Sjkim *    of any contributors may be used to endorse or promote products derived
24233237Sjkim *    from this software without specific prior written permission.
25233237Sjkim *
26233237Sjkim * Alternatively, this software may be distributed under the terms of the
27233237Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28233237Sjkim * Software Foundation.
29233237Sjkim *
30233237Sjkim * NO WARRANTY
31233237Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32233237Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33233237Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34233237Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35233237Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36233237Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37233237Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38233237Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39233237Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40233237Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41233237Sjkim * POSSIBILITY OF SUCH DAMAGES.
42233237Sjkim */
43233237Sjkim
44233237Sjkim#define __PREPROCESS_H__
45233237Sjkim
46233237Sjkim#ifndef _PREPROCESS
47233237Sjkim#define _PREPROCESS
48233237Sjkim
49233237Sjkim#undef PR_EXTERN
50233237Sjkim
51233237Sjkim#ifdef _DECLARE_PR_GLOBALS
52233237Sjkim#define PR_EXTERN
53233237Sjkim#define PR_INIT_GLOBAL(a,b)         (a)=(b)
54233237Sjkim#else
55233237Sjkim#define PR_EXTERN                   extern
56233237Sjkim#define PR_INIT_GLOBAL(a,b)         (a)
57233237Sjkim#endif
58233237Sjkim
59233237Sjkim
60233237Sjkim/*
61233237Sjkim * Configuration
62233237Sjkim */
63233237Sjkim#define PR_MAX_MACRO_ARGS       32              /* Max number of macro args */
64233237Sjkim#define PR_MAX_ARG_INSTANCES    24              /* Max instances of any one arg */
65233237Sjkim#define PR_LINES_PER_BLOCK      4096            /* Max input source lines per block */
66233237Sjkim
67233237Sjkim
68233237Sjkim/*
69233237Sjkim * Local defines and macros
70233237Sjkim */
71233237Sjkim#define PR_TOKEN_SEPARATORS     " ,(){}\t\n"
72233237Sjkim#define PR_MACRO_SEPARATORS     " ,(){}~!*/%+-<>=&^|\"\t\n"
73233237Sjkim#define PR_MACRO_ARGUMENTS      " ,\t\n"
74233237Sjkim#define PR_EXPR_SEPARATORS      " ,(){}~!*/%+-<>=&^|\"\t\n"
75233237Sjkim
76233237Sjkim#define PR_PREFIX_ID            "Pr(%.4u) - "             /* Used for debug output */
77233237Sjkim
78233237Sjkim#define THIS_TOKEN_OFFSET(t)    ((t-Gbl_MainTokenBuffer) + 1)
79233237Sjkim
80233237Sjkim
81233237Sjkim/*
82233237Sjkim * Preprocessor structures
83233237Sjkim */
84233237Sjkimtypedef struct pr_macro_arg
85233237Sjkim{
86233237Sjkim    char                        *Name;
87233237Sjkim    UINT32                      Offset[PR_MAX_ARG_INSTANCES];
88233237Sjkim    UINT16                      UseCount;
89233237Sjkim
90233237Sjkim} PR_MACRO_ARG;
91233237Sjkim
92233237Sjkimtypedef struct pr_define_info
93233237Sjkim{
94233237Sjkim    struct pr_define_info       *Previous;
95233237Sjkim    struct pr_define_info       *Next;
96233237Sjkim    char                        *Identifier;
97233237Sjkim    char                        *Replacement;
98233237Sjkim    char                        *Body;          /* Macro body */
99233237Sjkim    PR_MACRO_ARG                *Args;          /* Macro arg list */
100233237Sjkim    UINT16                      ArgCount;       /* Macro arg count */
101233237Sjkim    BOOLEAN                     Persist;        /* Keep for entire compiler run */
102233237Sjkim
103233237Sjkim} PR_DEFINE_INFO;
104233237Sjkim
105233237Sjkimtypedef struct pr_directive_info
106233237Sjkim{
107233237Sjkim    char                        *Name;          /* Directive name */
108233237Sjkim    UINT8                       ArgCount;       /* Required # of args */
109233237Sjkim
110233237Sjkim} PR_DIRECTIVE_INFO;
111233237Sjkim
112233237Sjkimtypedef struct pr_operator_info
113233237Sjkim{
114233237Sjkim    char                        *Op;
115233237Sjkim
116233237Sjkim} PR_OPERATOR_INFO;
117233237Sjkim
118233237Sjkimtypedef struct pr_file_node
119233237Sjkim{
120233237Sjkim    struct pr_file_node         *Next;
121233237Sjkim    FILE                        *File;
122233237Sjkim    char                        *Filename;
123233237Sjkim    UINT32                      CurrentLineNumber;
124233237Sjkim
125233237Sjkim} PR_FILE_NODE;
126233237Sjkim
127252279Sjkim#define MAX_ARGUMENT_LENGTH     24
128233237Sjkim
129252279Sjkimtypedef struct directive_info
130252279Sjkim{
131252279Sjkim    struct directive_info       *Next;
132252279Sjkim    char                        Argument[MAX_ARGUMENT_LENGTH];
133252279Sjkim    int                         Directive;
134252279Sjkim    BOOLEAN                     IgnoringThisCodeBlock;
135252279Sjkim
136252279Sjkim} DIRECTIVE_INFO;
137252279Sjkim
138252279Sjkim
139233237Sjkim/*
140233237Sjkim * Globals
141233237Sjkim */
142240716Sjkim#if 0 /* TBD for macros */
143240716SjkimPR_EXTERN char                  PR_INIT_GLOBAL (*XXXEvalBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
144240716Sjkim#endif
145233237Sjkim
146240716SjkimPR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_MainTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
147240716SjkimPR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_MacroTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
148240716SjkimPR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_ExpressionTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
149240716Sjkim
150252279SjkimPR_EXTERN UINT32                Gbl_PreprocessorLineNumber;
151252279SjkimPR_EXTERN int                   Gbl_IfDepth;
152233237SjkimPR_EXTERN PR_FILE_NODE          *Gbl_InputFileList;
153233237SjkimPR_EXTERN PR_DEFINE_INFO        PR_INIT_GLOBAL (*Gbl_DefineList, NULL);
154233237SjkimPR_EXTERN BOOLEAN               PR_INIT_GLOBAL (Gbl_PreprocessorError, FALSE);
155252279SjkimPR_EXTERN BOOLEAN               PR_INIT_GLOBAL (Gbl_IgnoringThisCodeBlock, FALSE);
156252279SjkimPR_EXTERN DIRECTIVE_INFO        PR_INIT_GLOBAL (*Gbl_DirectiveStack, NULL);
157233237Sjkim
158233237Sjkim/*
159233237Sjkim * prscan - Preprocessor entry
160233237Sjkim */
161233237Sjkimvoid
162233237SjkimPrInitializePreprocessor (
163233237Sjkim    void);
164233237Sjkim
165233237Sjkimvoid
166233237SjkimPrInitializeGlobals (
167233237Sjkim    void);
168233237Sjkim
169233237Sjkimvoid
170233237SjkimPrTerminatePreprocessor (
171233237Sjkim    void);
172233237Sjkim
173252279Sjkimvoid
174233237SjkimPrDoPreprocess (
175233237Sjkim    void);
176233237Sjkim
177233237SjkimUINT64
178233237SjkimPrIsDefined (
179233237Sjkim    char                    *Identifier);
180233237Sjkim
181233237SjkimUINT64
182233237SjkimPrResolveDefine (
183233237Sjkim    char                    *Identifier);
184233237Sjkim
185233237Sjkimint
186233237SjkimPrInitLexer (
187233237Sjkim    char                    *String);
188233237Sjkim
189233237Sjkimvoid
190233237SjkimPrTerminateLexer (
191233237Sjkim    void);
192233237Sjkim
193233237Sjkim
194233237Sjkim/*
195233237Sjkim * prmacros - Support for #defines and macros
196233237Sjkim */
197233237Sjkimvoid
198233237SjkimPrDumpPredefinedNames (
199233237Sjkim    void);
200233237Sjkim
201233237SjkimPR_DEFINE_INFO *
202233237SjkimPrAddDefine (
203233237Sjkim    char                    *Token,
204233237Sjkim    char                    *Token2,
205233237Sjkim    BOOLEAN                 Persist);
206233237Sjkim
207233237Sjkimvoid
208233237SjkimPrRemoveDefine (
209233237Sjkim    char                    *DefineName);
210233237Sjkim
211233237SjkimPR_DEFINE_INFO *
212233237SjkimPrMatchDefine (
213233237Sjkim    char                    *MatchString);
214233237Sjkim
215233237Sjkimvoid
216233237SjkimPrAddMacro (
217233237Sjkim    char                    *Name,
218233237Sjkim    char                    **Next);
219233237Sjkim
220233237Sjkimvoid
221233237SjkimPrDoMacroInvocation (
222233237Sjkim    char                    *TokenBuffer,
223233237Sjkim    char                    *MacroStart,
224233237Sjkim    PR_DEFINE_INFO          *DefineInfo,
225233237Sjkim    char                    **Next);
226233237Sjkim
227233237Sjkim
228233237Sjkim/*
229233237Sjkim * prexpress - #if expression support
230233237Sjkim */
231233237SjkimACPI_STATUS
232233237SjkimPrResolveIntegerExpression (
233233237Sjkim    char                    *Line,
234233237Sjkim    UINT64                  *ReturnValue);
235233237Sjkim
236233237Sjkimchar *
237233237SjkimPrPrioritizeExpression (
238233237Sjkim    char                    *OriginalLine);
239233237Sjkim
240233237Sjkim/*
241233237Sjkim * prparser - lex/yacc expression parser
242233237Sjkim */
243233237SjkimUINT64
244233237SjkimPrEvaluateExpression (
245233237Sjkim    char                    *ExprString);
246233237Sjkim
247233237Sjkim
248233237Sjkim/*
249233237Sjkim * prutils - Preprocesor utilities
250233237Sjkim */
251233237Sjkimchar *
252233237SjkimPrGetNextToken (
253233237Sjkim    char                    *Buffer,
254233237Sjkim    char                    *MatchString,
255233237Sjkim    char                    **Next);
256233237Sjkim
257233237Sjkimvoid
258233237SjkimPrError (
259233237Sjkim    UINT8                   Level,
260233237Sjkim    UINT8                   MessageId,
261233237Sjkim    UINT32                  Column);
262233237Sjkim
263233237Sjkimvoid
264233237SjkimPrReplaceData (
265233237Sjkim    char                    *Buffer,
266233237Sjkim    UINT32                  LengthToRemove,
267233237Sjkim    char                    *BufferToAdd,
268233237Sjkim    UINT32                  LengthToAdd);
269233237Sjkim
270233237Sjkimvoid
271233237SjkimPrOpenIncludeFile (
272233237Sjkim    char                    *Filename);
273233237Sjkim
274233237SjkimFILE *
275233237SjkimPrOpenIncludeWithPrefix (
276233237Sjkim    char                    *PrefixDir,
277233237Sjkim    char                    *Filename);
278233237Sjkim
279233237Sjkimvoid
280233237SjkimPrPushInputFileStack (
281233237Sjkim    FILE                    *InputFile,
282233237Sjkim    char                    *Filename);
283233237Sjkim
284233237SjkimBOOLEAN
285233237SjkimPrPopInputFileStack (
286233237Sjkim    void);
287233237Sjkim
288233237Sjkim#endif
289