14c52cad2SJung-uk Kim /****************************************************************************** 24c52cad2SJung-uk Kim * 34c52cad2SJung-uk Kim * Module Name: preprocess.h - header for iASL Preprocessor 44c52cad2SJung-uk Kim * 54c52cad2SJung-uk Kim *****************************************************************************/ 64c52cad2SJung-uk Kim 74c52cad2SJung-uk Kim /* 8*313a0c13SJung-uk Kim * Copyright (C) 2000 - 2014, Intel Corp. 94c52cad2SJung-uk Kim * All rights reserved. 104c52cad2SJung-uk Kim * 114c52cad2SJung-uk Kim * Redistribution and use in source and binary forms, with or without 124c52cad2SJung-uk Kim * modification, are permitted provided that the following conditions 134c52cad2SJung-uk Kim * are met: 144c52cad2SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 154c52cad2SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 164c52cad2SJung-uk Kim * without modification. 174c52cad2SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 184c52cad2SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 194c52cad2SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 204c52cad2SJung-uk Kim * including a substantially similar Disclaimer requirement for further 214c52cad2SJung-uk Kim * binary redistribution. 224c52cad2SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 234c52cad2SJung-uk Kim * of any contributors may be used to endorse or promote products derived 244c52cad2SJung-uk Kim * from this software without specific prior written permission. 254c52cad2SJung-uk Kim * 264c52cad2SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 274c52cad2SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 284c52cad2SJung-uk Kim * Software Foundation. 294c52cad2SJung-uk Kim * 304c52cad2SJung-uk Kim * NO WARRANTY 314c52cad2SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 324c52cad2SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 334c52cad2SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 344c52cad2SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 354c52cad2SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 364c52cad2SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 374c52cad2SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 384c52cad2SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 394c52cad2SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 404c52cad2SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 414c52cad2SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 424c52cad2SJung-uk Kim */ 434c52cad2SJung-uk Kim 444c52cad2SJung-uk Kim #define __PREPROCESS_H__ 454c52cad2SJung-uk Kim 464c52cad2SJung-uk Kim #ifndef _PREPROCESS 474c52cad2SJung-uk Kim #define _PREPROCESS 484c52cad2SJung-uk Kim 494c52cad2SJung-uk Kim #undef PR_EXTERN 504c52cad2SJung-uk Kim 514c52cad2SJung-uk Kim #ifdef _DECLARE_PR_GLOBALS 524c52cad2SJung-uk Kim #define PR_EXTERN 534c52cad2SJung-uk Kim #define PR_INIT_GLOBAL(a,b) (a)=(b) 544c52cad2SJung-uk Kim #else 554c52cad2SJung-uk Kim #define PR_EXTERN extern 564c52cad2SJung-uk Kim #define PR_INIT_GLOBAL(a,b) (a) 574c52cad2SJung-uk Kim #endif 584c52cad2SJung-uk Kim 594c52cad2SJung-uk Kim 604c52cad2SJung-uk Kim /* 614c52cad2SJung-uk Kim * Configuration 624c52cad2SJung-uk Kim */ 634c52cad2SJung-uk Kim #define PR_MAX_MACRO_ARGS 32 /* Max number of macro args */ 644c52cad2SJung-uk Kim #define PR_MAX_ARG_INSTANCES 24 /* Max instances of any one arg */ 654c52cad2SJung-uk Kim #define PR_LINES_PER_BLOCK 4096 /* Max input source lines per block */ 664c52cad2SJung-uk Kim 674c52cad2SJung-uk Kim 684c52cad2SJung-uk Kim /* 694c52cad2SJung-uk Kim * Local defines and macros 704c52cad2SJung-uk Kim */ 714c52cad2SJung-uk Kim #define PR_TOKEN_SEPARATORS " ,(){}\t\n" 724c52cad2SJung-uk Kim #define PR_MACRO_SEPARATORS " ,(){}~!*/%+-<>=&^|\"\t\n" 734c52cad2SJung-uk Kim #define PR_MACRO_ARGUMENTS " ,\t\n" 744c52cad2SJung-uk Kim #define PR_EXPR_SEPARATORS " ,(){}~!*/%+-<>=&^|\"\t\n" 754c52cad2SJung-uk Kim 764c52cad2SJung-uk Kim #define PR_PREFIX_ID "Pr(%.4u) - " /* Used for debug output */ 774c52cad2SJung-uk Kim 784c52cad2SJung-uk Kim #define THIS_TOKEN_OFFSET(t) ((t-Gbl_MainTokenBuffer) + 1) 794c52cad2SJung-uk Kim 804c52cad2SJung-uk Kim 814c52cad2SJung-uk Kim /* 824c52cad2SJung-uk Kim * Preprocessor structures 834c52cad2SJung-uk Kim */ 844c52cad2SJung-uk Kim typedef struct pr_macro_arg 854c52cad2SJung-uk Kim { 864c52cad2SJung-uk Kim char *Name; 874c52cad2SJung-uk Kim UINT32 Offset[PR_MAX_ARG_INSTANCES]; 884c52cad2SJung-uk Kim UINT16 UseCount; 894c52cad2SJung-uk Kim 904c52cad2SJung-uk Kim } PR_MACRO_ARG; 914c52cad2SJung-uk Kim 924c52cad2SJung-uk Kim typedef struct pr_define_info 934c52cad2SJung-uk Kim { 944c52cad2SJung-uk Kim struct pr_define_info *Previous; 954c52cad2SJung-uk Kim struct pr_define_info *Next; 964c52cad2SJung-uk Kim char *Identifier; 974c52cad2SJung-uk Kim char *Replacement; 984c52cad2SJung-uk Kim char *Body; /* Macro body */ 994c52cad2SJung-uk Kim PR_MACRO_ARG *Args; /* Macro arg list */ 1004c52cad2SJung-uk Kim UINT16 ArgCount; /* Macro arg count */ 1014c52cad2SJung-uk Kim BOOLEAN Persist; /* Keep for entire compiler run */ 1024c52cad2SJung-uk Kim 1034c52cad2SJung-uk Kim } PR_DEFINE_INFO; 1044c52cad2SJung-uk Kim 1054c52cad2SJung-uk Kim typedef struct pr_directive_info 1064c52cad2SJung-uk Kim { 1074c52cad2SJung-uk Kim char *Name; /* Directive name */ 1084c52cad2SJung-uk Kim UINT8 ArgCount; /* Required # of args */ 1094c52cad2SJung-uk Kim 1104c52cad2SJung-uk Kim } PR_DIRECTIVE_INFO; 1114c52cad2SJung-uk Kim 1124c52cad2SJung-uk Kim typedef struct pr_operator_info 1134c52cad2SJung-uk Kim { 1144c52cad2SJung-uk Kim char *Op; 1154c52cad2SJung-uk Kim 1164c52cad2SJung-uk Kim } PR_OPERATOR_INFO; 1174c52cad2SJung-uk Kim 1184c52cad2SJung-uk Kim typedef struct pr_file_node 1194c52cad2SJung-uk Kim { 1204c52cad2SJung-uk Kim struct pr_file_node *Next; 1214c52cad2SJung-uk Kim FILE *File; 1224c52cad2SJung-uk Kim char *Filename; 1234c52cad2SJung-uk Kim UINT32 CurrentLineNumber; 1244c52cad2SJung-uk Kim 1254c52cad2SJung-uk Kim } PR_FILE_NODE; 1264c52cad2SJung-uk Kim 1278d744e47SJung-uk Kim #define MAX_ARGUMENT_LENGTH 24 1288d744e47SJung-uk Kim 1298d744e47SJung-uk Kim typedef struct directive_info 1308d744e47SJung-uk Kim { 1318d744e47SJung-uk Kim struct directive_info *Next; 1328d744e47SJung-uk Kim char Argument[MAX_ARGUMENT_LENGTH]; 1338d744e47SJung-uk Kim int Directive; 1348d744e47SJung-uk Kim BOOLEAN IgnoringThisCodeBlock; 1358d744e47SJung-uk Kim 1368d744e47SJung-uk Kim } DIRECTIVE_INFO; 1378d744e47SJung-uk Kim 1384c52cad2SJung-uk Kim 1394c52cad2SJung-uk Kim /* 1404c52cad2SJung-uk Kim * Globals 1414c52cad2SJung-uk Kim */ 142042ff955SJung-uk Kim #if 0 /* TBD for macros */ 143042ff955SJung-uk Kim PR_EXTERN char PR_INIT_GLOBAL (*XXXEvalBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */ 144042ff955SJung-uk Kim #endif 145042ff955SJung-uk Kim 146042ff955SJung-uk Kim PR_EXTERN char PR_INIT_GLOBAL (*Gbl_MainTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */ 147042ff955SJung-uk Kim PR_EXTERN char PR_INIT_GLOBAL (*Gbl_MacroTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */ 148042ff955SJung-uk Kim PR_EXTERN char PR_INIT_GLOBAL (*Gbl_ExpressionTokenBuffer, NULL); /* [ASL_LINE_BUFFER_SIZE]; */ 1494c52cad2SJung-uk Kim 1504c52cad2SJung-uk Kim PR_EXTERN UINT32 Gbl_PreprocessorLineNumber; 1514c52cad2SJung-uk Kim PR_EXTERN int Gbl_IfDepth; 1528d744e47SJung-uk Kim PR_EXTERN PR_FILE_NODE *Gbl_InputFileList; 1538d744e47SJung-uk Kim PR_EXTERN PR_DEFINE_INFO PR_INIT_GLOBAL (*Gbl_DefineList, NULL); 1544c52cad2SJung-uk Kim PR_EXTERN BOOLEAN PR_INIT_GLOBAL (Gbl_PreprocessorError, FALSE); 1558d744e47SJung-uk Kim PR_EXTERN BOOLEAN PR_INIT_GLOBAL (Gbl_IgnoringThisCodeBlock, FALSE); 1568d744e47SJung-uk Kim PR_EXTERN DIRECTIVE_INFO PR_INIT_GLOBAL (*Gbl_DirectiveStack, NULL); 1574c52cad2SJung-uk Kim 1584c52cad2SJung-uk Kim /* 1594c52cad2SJung-uk Kim * prscan - Preprocessor entry 1604c52cad2SJung-uk Kim */ 1614c52cad2SJung-uk Kim void 1624c52cad2SJung-uk Kim PrInitializePreprocessor ( 1634c52cad2SJung-uk Kim void); 1644c52cad2SJung-uk Kim 1654c52cad2SJung-uk Kim void 1664c52cad2SJung-uk Kim PrInitializeGlobals ( 1674c52cad2SJung-uk Kim void); 1684c52cad2SJung-uk Kim 1694c52cad2SJung-uk Kim void 1704c52cad2SJung-uk Kim PrTerminatePreprocessor ( 1714c52cad2SJung-uk Kim void); 1724c52cad2SJung-uk Kim 1738d744e47SJung-uk Kim void 1744c52cad2SJung-uk Kim PrDoPreprocess ( 1754c52cad2SJung-uk Kim void); 1764c52cad2SJung-uk Kim 1774c52cad2SJung-uk Kim UINT64 1784c52cad2SJung-uk Kim PrIsDefined ( 1794c52cad2SJung-uk Kim char *Identifier); 1804c52cad2SJung-uk Kim 1814c52cad2SJung-uk Kim UINT64 1824c52cad2SJung-uk Kim PrResolveDefine ( 1834c52cad2SJung-uk Kim char *Identifier); 1844c52cad2SJung-uk Kim 1854c52cad2SJung-uk Kim int 1864c52cad2SJung-uk Kim PrInitLexer ( 1874c52cad2SJung-uk Kim char *String); 1884c52cad2SJung-uk Kim 1894c52cad2SJung-uk Kim void 1904c52cad2SJung-uk Kim PrTerminateLexer ( 1914c52cad2SJung-uk Kim void); 1924c52cad2SJung-uk Kim 1934c52cad2SJung-uk Kim 1944c52cad2SJung-uk Kim /* 1954c52cad2SJung-uk Kim * prmacros - Support for #defines and macros 1964c52cad2SJung-uk Kim */ 1974c52cad2SJung-uk Kim void 1984c52cad2SJung-uk Kim PrDumpPredefinedNames ( 1994c52cad2SJung-uk Kim void); 2004c52cad2SJung-uk Kim 2014c52cad2SJung-uk Kim PR_DEFINE_INFO * 2024c52cad2SJung-uk Kim PrAddDefine ( 2034c52cad2SJung-uk Kim char *Token, 2044c52cad2SJung-uk Kim char *Token2, 2054c52cad2SJung-uk Kim BOOLEAN Persist); 2064c52cad2SJung-uk Kim 2074c52cad2SJung-uk Kim void 2084c52cad2SJung-uk Kim PrRemoveDefine ( 2094c52cad2SJung-uk Kim char *DefineName); 2104c52cad2SJung-uk Kim 2114c52cad2SJung-uk Kim PR_DEFINE_INFO * 2124c52cad2SJung-uk Kim PrMatchDefine ( 2134c52cad2SJung-uk Kim char *MatchString); 2144c52cad2SJung-uk Kim 2154c52cad2SJung-uk Kim void 2164c52cad2SJung-uk Kim PrAddMacro ( 2174c52cad2SJung-uk Kim char *Name, 2184c52cad2SJung-uk Kim char **Next); 2194c52cad2SJung-uk Kim 2204c52cad2SJung-uk Kim void 2214c52cad2SJung-uk Kim PrDoMacroInvocation ( 2224c52cad2SJung-uk Kim char *TokenBuffer, 2234c52cad2SJung-uk Kim char *MacroStart, 2244c52cad2SJung-uk Kim PR_DEFINE_INFO *DefineInfo, 2254c52cad2SJung-uk Kim char **Next); 2264c52cad2SJung-uk Kim 2274c52cad2SJung-uk Kim 2284c52cad2SJung-uk Kim /* 2294c52cad2SJung-uk Kim * prexpress - #if expression support 2304c52cad2SJung-uk Kim */ 2314c52cad2SJung-uk Kim ACPI_STATUS 2324c52cad2SJung-uk Kim PrResolveIntegerExpression ( 2334c52cad2SJung-uk Kim char *Line, 2344c52cad2SJung-uk Kim UINT64 *ReturnValue); 2354c52cad2SJung-uk Kim 2364c52cad2SJung-uk Kim char * 2374c52cad2SJung-uk Kim PrPrioritizeExpression ( 2384c52cad2SJung-uk Kim char *OriginalLine); 2394c52cad2SJung-uk Kim 2404c52cad2SJung-uk Kim /* 2414c52cad2SJung-uk Kim * prparser - lex/yacc expression parser 2424c52cad2SJung-uk Kim */ 2434c52cad2SJung-uk Kim UINT64 2444c52cad2SJung-uk Kim PrEvaluateExpression ( 2454c52cad2SJung-uk Kim char *ExprString); 2464c52cad2SJung-uk Kim 2474c52cad2SJung-uk Kim 2484c52cad2SJung-uk Kim /* 2494c52cad2SJung-uk Kim * prutils - Preprocesor utilities 2504c52cad2SJung-uk Kim */ 2514c52cad2SJung-uk Kim char * 2524c52cad2SJung-uk Kim PrGetNextToken ( 2534c52cad2SJung-uk Kim char *Buffer, 2544c52cad2SJung-uk Kim char *MatchString, 2554c52cad2SJung-uk Kim char **Next); 2564c52cad2SJung-uk Kim 2574c52cad2SJung-uk Kim void 2584c52cad2SJung-uk Kim PrError ( 2594c52cad2SJung-uk Kim UINT8 Level, 260*313a0c13SJung-uk Kim UINT16 MessageId, 2614c52cad2SJung-uk Kim UINT32 Column); 2624c52cad2SJung-uk Kim 2634c52cad2SJung-uk Kim void 2644c52cad2SJung-uk Kim PrReplaceData ( 2654c52cad2SJung-uk Kim char *Buffer, 2664c52cad2SJung-uk Kim UINT32 LengthToRemove, 2674c52cad2SJung-uk Kim char *BufferToAdd, 2684c52cad2SJung-uk Kim UINT32 LengthToAdd); 2694c52cad2SJung-uk Kim 2704c52cad2SJung-uk Kim void 2714c52cad2SJung-uk Kim PrOpenIncludeFile ( 2724c52cad2SJung-uk Kim char *Filename); 2734c52cad2SJung-uk Kim 2744c52cad2SJung-uk Kim FILE * 2754c52cad2SJung-uk Kim PrOpenIncludeWithPrefix ( 2764c52cad2SJung-uk Kim char *PrefixDir, 2774c52cad2SJung-uk Kim char *Filename); 2784c52cad2SJung-uk Kim 2794c52cad2SJung-uk Kim void 2804c52cad2SJung-uk Kim PrPushInputFileStack ( 2814c52cad2SJung-uk Kim FILE *InputFile, 2824c52cad2SJung-uk Kim char *Filename); 2834c52cad2SJung-uk Kim 2844c52cad2SJung-uk Kim BOOLEAN 2854c52cad2SJung-uk Kim PrPopInputFileStack ( 2864c52cad2SJung-uk Kim void); 2874c52cad2SJung-uk Kim 2884c52cad2SJung-uk Kim #endif 289