69 bool preprocess(std::istream& myStream,
const std::string& filename,
int startingLine, ostream& os) {
70 std::set<std::string> defineSet;
71 std::stack<bool> ifStates;
74 return doPreprocess(myStream, filename, startingLine, os, defineSet, ifStates);
78 bool doPreprocess(std::istream& myStream,
const std::string& filename,
int startingLine, ostream& os, std::set<std::string>& defineSet, std::stack<bool>& ifStates) {
93 int lineNo = startingLine;
94 os <<
"#line " << lineNo <<
" \"" << filename <<
"\"\n";
95 const int bufferSize = 8192;
96 char buffer[bufferSize];
97 while(myStream.getline(buffer, bufferSize)) {
99 std::string line = Utils::trimLeftCopy(buffer);
100 if (!line.empty() && line[0] ==
'#') {
102 std::vector<std::string> tokens = tokenizer.
getAllTokens();
103 if (tokens.empty()) {
106 if (tokens[0] ==
"endif") {
108 if (ifStates.empty()) {
109 std::cout <<
"Error in preprocessing: endif \n";
113 }
else if (tokens.size() == 2) {
114 if (tokens[0] ==
"include") {
116 std::string includeFilename = tokens[1];
117 includeFilename = includeFilename.substr(1, includeFilename.length() -2);
118 std::ifstream includeStream(includeFilename.c_str());
119 if (!includeStream.is_open()) {
120 std::stringstream ss;
121 ss <<
"Can not open " << includeFilename <<
" for preprocessing\n";
125 bool ret = subPreprocessor.doPreprocess(includeStream, includeFilename, 1, os, defineSet, ifStates);
127 std::cout <<
"Error in preprocessing\n";
130 os <<
"#line " << lineNo <<
" \"" << filename <<
"\"\n";
131 }
else if (tokens[0] ==
"define") {
132 defineSet.insert(tokens[1]);
134 }
else if (tokens[0] ==
"undef") {
135 defineSet.erase(tokens[1]);
137 }
else if (tokens[0] ==
"ifdef") {
138 if (defineSet.find(tokens[1]) != defineSet.end() ) {
141 ifStates.push(
false);
144 }
else if (tokens[0] ==
"ifndef") {
145 if (defineSet.find(tokens[1]) == defineSet.end() ) {
148 ifStates.push(
false);
152 std::cout << tokens[0] <<
" is not supported (yet)." << std::endl;
159 }
else if (ifStates.top()){
160 os << buffer << std::endl;