1 /******************************************************************************
   2  *
   3  * Module Name: preprocess.h - header for iASL Preprocessor
   4  *
   5  *****************************************************************************/
   6 
   7 /*
   8  * Copyright (C) 2000 - 2013, 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 MERCHANTIBILITY 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)    ((t-Gbl_MainTokenBuffer) + 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 #if 0 /* TBD for macros */
 143 PR_EXTERN char                  PR_INIT_GLOBAL (*XXXEvalBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
 144 #endif
 145 
 146 PR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_MainTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
 147 PR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_MacroTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
 148 PR_EXTERN char                  PR_INIT_GLOBAL (*Gbl_ExpressionTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */
 149 
 150 PR_EXTERN UINT32                Gbl_PreprocessorLineNumber;
 151 PR_EXTERN int                   Gbl_IfDepth;
 152 PR_EXTERN PR_FILE_NODE          *Gbl_InputFileList;
 153 PR_EXTERN PR_DEFINE_INFO        PR_INIT_GLOBAL (*Gbl_DefineList, NULL);
 154 PR_EXTERN BOOLEAN               PR_INIT_GLOBAL (Gbl_PreprocessorError, FALSE);
 155 PR_EXTERN BOOLEAN               PR_INIT_GLOBAL (Gbl_IgnoringThisCodeBlock, FALSE);
 156 PR_EXTERN DIRECTIVE_INFO        PR_INIT_GLOBAL (*Gbl_DirectiveStack, NULL);
 157 
 158 /*
 159  * prscan - Preprocessor entry
 160  */
 161 void
 162 PrInitializePreprocessor (
 163     void);
 164 
 165 void
 166 PrInitializeGlobals (
 167     void);
 168 
 169 void
 170 PrTerminatePreprocessor (
 171     void);
 172 
 173 void
 174 PrDoPreprocess (
 175     void);
 176 
 177 UINT64
 178 PrIsDefined (
 179     char                    *Identifier);
 180 
 181 UINT64
 182 PrResolveDefine (
 183     char                    *Identifier);
 184 
 185 int
 186 PrInitLexer (
 187     char                    *String);
 188 
 189 void
 190 PrTerminateLexer (
 191     void);
 192 
 193 
 194 /*
 195  * prmacros - Support for #defines and macros
 196  */
 197 void
 198 PrDumpPredefinedNames (
 199     void);
 200 
 201 PR_DEFINE_INFO *
 202 PrAddDefine (
 203     char                    *Token,
 204     char                    *Token2,
 205     BOOLEAN                 Persist);
 206 
 207 void
 208 PrRemoveDefine (
 209     char                    *DefineName);
 210 
 211 PR_DEFINE_INFO *
 212 PrMatchDefine (
 213     char                    *MatchString);
 214 
 215 void
 216 PrAddMacro (
 217     char                    *Name,
 218     char                    **Next);
 219 
 220 void
 221 PrDoMacroInvocation (
 222     char                    *TokenBuffer,
 223     char                    *MacroStart,
 224     PR_DEFINE_INFO          *DefineInfo,
 225     char                    **Next);
 226 
 227 
 228 /*
 229  * prexpress - #if expression support
 230  */
 231 ACPI_STATUS
 232 PrResolveIntegerExpression (
 233     char                    *Line,
 234     UINT64                  *ReturnValue);
 235 
 236 char *
 237 PrPrioritizeExpression (
 238     char                    *OriginalLine);
 239 
 240 /*
 241  * prparser - lex/yacc expression parser
 242  */
 243 UINT64
 244 PrEvaluateExpression (
 245     char                    *ExprString);
 246 
 247 
 248 /*
 249  * prutils - Preprocesor utilities
 250  */
 251 char *
 252 PrGetNextToken (
 253     char                    *Buffer,
 254     char                    *MatchString,
 255     char                    **Next);
 256 
 257 void
 258 PrError (
 259     UINT8                   Level,
 260     UINT8                   MessageId,
 261     UINT32                  Column);
 262 
 263 void
 264 PrReplaceData (
 265     char                    *Buffer,
 266     UINT32                  LengthToRemove,
 267     char                    *BufferToAdd,
 268     UINT32                  LengthToAdd);
 269 
 270 void
 271 PrOpenIncludeFile (
 272     char                    *Filename);
 273 
 274 FILE *
 275 PrOpenIncludeWithPrefix (
 276     char                    *PrefixDir,
 277     char                    *Filename);
 278 
 279 void
 280 PrPushInputFileStack (
 281     FILE                    *InputFile,
 282     char                    *Filename);
 283 
 284 BOOLEAN
 285 PrPopInputFileStack (
 286     void);
 287 
 288 #endif