# | Line 48 | Line 48 | |
---|---|---|
48 | #include "utils/StringTokenizer.hpp" | |
49 | #include "utils/Trim.hpp" | |
50 | #include "utils/OOPSEException.hpp" | |
51 | + | #include "utils/simError.h" |
52 | ||
53 | + | |
54 | /** | |
55 | * @class SimplePreprocessor | |
56 | * @brief A simple preprocessor. | |
57 | < | * @note only support #include #ifdef, #ifndef, #endif, #define and #undef, c-like multiple line |
58 | < | * comment is not support, macro substitude is not support. |
57 | > | * @note only supports #include #ifdef, #ifndef, #endif, #define and #undef, c-like multiple line |
58 | > | * comment is not supported, macro substitute is not supported. |
59 | */ | |
60 | namespace oopse { | |
61 | class SimplePreprocessor { | |
62 | public: | |
63 | < | bool preprocess(const std::string& filename, ostream& os) { |
63 | > | bool preprocess(std::istream& myStream, const std::string& filename, int startingLine, ostream& os) { |
64 | std::set<std::string> defineSet; | |
65 | std::stack<bool> ifStates; | |
66 | ||
67 | ifStates.push(true); | |
68 | < | return doPreprocess(filename, os, defineSet, ifStates); |
68 | > | return doPreprocess(myStream, filename, startingLine, os, defineSet, ifStates); |
69 | } | |
70 | ||
71 | private: | |
72 | < | bool doPreprocess(const std::string& filename, ostream& os, std::set<std::string>& defineSet, std::stack<bool>& ifStates) { |
73 | < | std::ifstream input(filename.c_str()); |
74 | < | if (!input.is_open()) { |
75 | < | std::stringstream ss; |
76 | < | ss << "Can not open " << filename << " for preprocessing\n"; |
77 | < | throw OOPSEException(ss.str()); |
78 | < | } |
79 | < | int lineNo =1; |
72 | > | bool doPreprocess(std::istream& myStream, const std::string& filename, int startingLine, ostream& os, std::set<std::string>& defineSet, std::stack<bool>& ifStates) { |
73 | > | //std::ifstream input(filename.c_str()); |
74 | > | //if (!input.is_open()) { |
75 | > | // std::stringstream ss; |
76 | > | // ss << "Can not open " << filename << " for preprocessing\n"; |
77 | > | // |
78 | > | // sprintf(painCave.errMsg, |
79 | > | // "Can not open (%s) for processing. \n" |
80 | > | // "\tPlease check md file name syntax.\n", filename.c_str()); |
81 | > | // |
82 | > | // painCave.isFatal = 1; |
83 | > | // simError(); |
84 | > | // |
85 | > | // throw OOPSEException(ss.str()); |
86 | > | //} |
87 | > | int lineNo = startingLine; |
88 | os << "#line " << lineNo << " \"" << filename << "\"\n"; | |
89 | < | while(input.getline(buffer, bufferSize)) { |
89 | > | const int bufferSize = 1024; |
90 | > | char buffer[bufferSize]; |
91 | > | while(myStream.getline(buffer, bufferSize)) { |
92 | ++lineNo; | |
93 | std::string line = trimLeftCopy(buffer); | |
94 | if (!line.empty() && line[0] == '#') { | |
# | Line 98 | Line 110 | class SimplePreprocessor { | |
110 | SimplePreprocessor subPreprocessor; | |
111 | std::string includeFilename = tokens[1]; | |
112 | includeFilename = includeFilename.substr(1, includeFilename.length() -2); | |
113 | < | bool ret = subPreprocessor.doPreprocess(includeFilename, os, defineSet, ifStates); |
113 | > | std::ifstream includeStream(includeFilename.c_str()); |
114 | > | if (!includeStream.is_open()) { |
115 | > | std::stringstream ss; |
116 | > | ss << "Can not open " << includeFilename << " for preprocessing\n"; |
117 | > | throw OOPSEException(ss.str()); |
118 | > | } |
119 | > | |
120 | > | bool ret = subPreprocessor.doPreprocess(includeStream, includeFilename, 1, os, defineSet, ifStates); |
121 | if (!ret) { | |
122 | std::cout << "Error in preprocessing\n"; | |
123 | return false; | |
# | Line 125 | Line 144 | class SimplePreprocessor { | |
144 | } | |
145 | os << std::endl; | |
146 | } else { | |
147 | < | std::cout << tokens[0] << " is not support" << std::endl; |
147 | > | std::cout << tokens[0] << " is not supported (yet)." << std::endl; |
148 | return false; | |
149 | } | |
150 | }else { | |
# | Line 142 | Line 161 | class SimplePreprocessor { | |
161 | } | |
162 | private: | |
163 | ||
145 | – | const static int bufferSize = 1024; |
146 | – | char buffer[bufferSize]; |
164 | }; | |
165 | ||
166 | } |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |