| 58 | |
| 59 | |
| 60 | class Preprocessor { |
| 61 | public: |
| 62 | Preprocessor() |
| 63 | : curLine_(1), lineLine_(0), curCond_(true) { |
| 64 | // Add predefined |
| 65 | Init(); |
| 66 | } |
| 67 | |
| 68 | ~Preprocessor() {} |
| 69 | void Finalize(TokenSequence os); |
| 70 | void Process(const std::string& src, const std::string& fname, TokenSequence& os); |
| 71 | void Expand(TokenSequence& os, TokenSequence is, bool inCond = false); |
| 72 | void Subst(TokenSequence& os, TokenSequence is, |
| 73 | bool leadingWS, const HideSet& hs, ParamMap& params); |
| 74 | void Glue(TokenSequence& os, TokenSequence is); |
| 75 | void Glue(TokenSequence& os, const Token* tok); |
| 76 | const Token* Stringize(TokenSequence is); |
| 77 | void Stringize(std::string& str, TokenSequence is); |
| 78 | const Token* ParseActualParam(TokenSequence& is, Macro* macro, ParamMap& paramMap); |
| 79 | int GetDirective(TokenSequence& is); |
| 80 | const Token* EvalDefOp(TokenSequence& is); |
| 81 | void ReplaceIdent(TokenSequence& is); |
| 82 | void ParseDirective(TokenSequence& os, TokenSequence& is, int directive); |
| 83 | void ParseIf(TokenSequence ls); |
| 84 | void ParseIfdef(TokenSequence ls); |
| 85 | void ParseIfndef(TokenSequence ls); |
| 86 | void ParseElif(TokenSequence ls); |
| 87 | void ParseElse(TokenSequence ls); |
| 88 | void ParseEndif(TokenSequence ls); |
| 89 | void ParseInclude(TokenSequence& is, TokenSequence ls); |
| 90 | void ParseDef(TokenSequence ls); |
| 91 | void ParseUndef(TokenSequence ls); |
| 92 | void ParseVersion(TokenSequence ls); |
| 93 | void ParseLine(TokenSequence ls); |
| 94 | void ParseError(TokenSequence ls); |
| 95 | void ParsePragma(TokenSequence ls); |
| 96 | void IncludeFile(TokenSequence& is, const std::string* filename); |
| 97 | void IncludeSource(TokenSequence& is, const std::string* src, const std::string* filename); |
| 98 | bool ParseIdentList(ParamList& params, TokenSequence& is); |
| 99 | |
| 100 | inline const MacroMap& GetMacroList() { return macroMap_; } |
| 101 | |
| 102 | Macro* FindMacro(const std::string& name) { |
| 103 | auto res = macroMap_.find(name); |
| 104 | if (res == macroMap_.end()) |
| 105 | return nullptr; |
| 106 | return &res->second; |
| 107 | } |
| 108 | |
| 109 | void AddMacro(const std::string& name, |
| 110 | std::string* text, bool preDef = false); |
| 111 | |
| 112 | void AddMacro(const std::string& name, const Macro& macro) { |
| 113 | auto res = macroMap_.find(name); |
| 114 | if (res != macroMap_.end()) { |
| 115 | // TODO(wgtdkp): give warning |
| 116 | macroMap_.erase(res); |
| 117 | } |
nothing calls this directly
no outgoing calls
no test coverage detected