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