1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the tools applications of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT 21 ** included in the packaging of this file. Please review the following 22 ** information to ensure the GNU General Public License requirements will 23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html. 24 ** 25 ** $QT_END_LICENSE$ 26 ** 27 ****************************************************************************/ 28 29 #ifndef PREPROCESSOR_H 30 #define PREPROCESSOR_H 31 32 #include "parser.h" 33 #include <qlist.h> 34 #include <qset.h> 35 #include <stdio.h> 36 37 QT_BEGIN_NAMESPACE 38 39 struct Macro 40 { MacroMacro41 Macro() : isFunction(false), isVariadic(false) {} 42 bool isFunction; 43 bool isVariadic; 44 Symbols arguments; 45 Symbols symbols; 46 }; 47 48 #ifdef USE_LEXEM_STORE 49 typedef QByteArray MacroName; 50 #else 51 typedef SubArray MacroName; 52 #endif 53 typedef QHash<MacroName, Macro> Macros; 54 55 class QFile; 56 57 class Preprocessor : public Parser 58 { 59 public: Preprocessor()60 Preprocessor(){} 61 static bool preprocessOnly; 62 QList<QByteArray> frameworks; 63 QSet<QByteArray> preprocessedIncludes; 64 QHash<QByteArray, QByteArray> nonlocalIncludePathResolutionCache; 65 Macros macros; 66 QByteArray resolveInclude(const QByteArray &filename, const QByteArray &relativeTo); 67 Symbols preprocessed(const QByteArray &filename, QFile *device); 68 69 void parseDefineArguments(Macro *m); 70 71 void skipUntilEndif(); 72 bool skipBranch(); 73 74 void substituteUntilNewline(Symbols &substituted); 75 static Symbols macroExpandIdentifier(Preprocessor *that, SymbolStack &symbols, int lineNum, QByteArray *macroName); 76 static void macroExpand(Symbols *into, Preprocessor *that, const Symbols &toExpand, int &index, int lineNum, bool one, 77 const QSet<QByteArray> &excludeSymbols = QSet<QByteArray>()); 78 79 int evaluateCondition(); 80 81 enum TokenizeMode { TokenizeCpp, TokenizePreprocessor, PreparePreprocessorStatement, TokenizePreprocessorStatement, TokenizeInclude, PrepareDefine, TokenizeDefine }; 82 static Symbols tokenize(const QByteArray &input, int lineNum = 1, TokenizeMode mode = TokenizeCpp); 83 84 private: 85 void until(Token); 86 87 void preprocess(const QByteArray &filename, Symbols &preprocessed); 88 }; 89 90 QT_END_NAMESPACE 91 92 #endif // PREPROCESSOR_H 93