# | Line 39 | Line 39 | |
---|---|---|
39 | * such damages. | |
40 | */ | |
41 | #include <algorithm> | |
42 | + | #include <stack> |
43 | #include "io/SectionParserManager.hpp" | |
44 | #include "utils/Trim.hpp" | |
45 | + | #include "utils/simError.h" |
46 | ||
47 | namespace oopse { | |
48 | ||
# | Line 63 | Line 65 | void SectionParserManager::parse(std::istream& input, | |
65 | const int bufferSize = 65535; | |
66 | char buffer[bufferSize]; | |
67 | int lineNo = 0; | |
68 | + | std::stack<std::string> sectionNameStack; |
69 | //scan through the input stream and find section names | |
70 | while(input.getline(buffer, bufferSize)) { | |
71 | ++lineNo; | |
72 | ||
73 | std::string line = trimLeftCopy(buffer); | |
74 | < | //a line begins with "//" is comment |
74 | > | //a line begins with "//" is a comment line |
75 | if ( line.empty() || (line.size() >= 2 && line[0] == '/' && line[1] == '/')) { | |
76 | continue; | |
77 | } else { | |
# | Line 78 | Line 81 | void SectionParserManager::parse(std::istream& input, | |
81 | } else { | |
82 | std::string keyword = tokenizer.nextToken(); | |
83 | ||
84 | < | if (keyword != "begin") { |
85 | < | continue; |
86 | < | } |
84 | > | if (keyword == "begin") { |
85 | > | std::string section = tokenizer.nextToken(); |
86 | > | sectionNameStack.push(section); |
87 | ||
88 | < | std::string section = tokenizer.nextToken(); |
89 | < | |
90 | < | i = std::find_if(sectionParsers_.begin(), sectionParsers_.end(), SameSectionParserFunctor(section)); |
91 | < | if (i == sectionParsers_.end()){ |
92 | < | //can not find corresponding section parser |
93 | < | std::cerr << "Can not find corresponding section parser for section: " << section << std::endl; |
88 | > | i = std::find_if(sectionParsers_.begin(), sectionParsers_.end(), SameSectionParserFunctor(section)); |
89 | > | if (i == sectionParsers_.end()){ |
90 | > | sprintf(painCave.errMsg, "SectionParserManager Error: Can not find corresponding section parser for %s\n", |
91 | > | section.c_str()); |
92 | > | painCave.isFatal = 1; |
93 | > | simError(); |
94 | > | } else { |
95 | > | if (i->isActive) { |
96 | > | sprintf(painCave.errMsg, "SectionParserManager Error:find multiple %s section\n", |
97 | > | section.c_str()); |
98 | > | painCave.isFatal = 1; |
99 | > | simError(); |
100 | > | } else { |
101 | > | i->isActive = true; |
102 | > | i->lineNo = lineNo; |
103 | > | i->offset = input.tellg(); |
104 | > | } |
105 | > | } |
106 | > | } else if (keyword == "end") { |
107 | > | std::string section = tokenizer.nextToken(); |
108 | > | if (sectionNameStack.top() == section) { |
109 | > | sectionNameStack.pop(); |
110 | > | } else { |
111 | > | sprintf(painCave.errMsg, "SectionParserManager Error: begin %s and end %s does not match at line %d\n", |
112 | > | sectionNameStack.top().c_str(), section.c_str(), lineNo); |
113 | > | painCave.isFatal = 1; |
114 | > | simError(); |
115 | > | } |
116 | > | |
117 | } else { | |
118 | < | i->isActive = true; |
93 | < | i->lineNo = lineNo; |
94 | < | i->offset = input.tellg(); |
118 | > | continue; |
119 | } | |
96 | – | |
120 | } | |
121 | } | |
99 | – | |
122 | ||
123 | } | |
124 | ||
125 | + | if (!sectionNameStack.empty()) { |
126 | + | sprintf(painCave.errMsg, "SectionParserManager Error: stack is not empty\n"); |
127 | + | painCave.isFatal = 1; |
128 | + | simError(); |
129 | + | } |
130 | + | |
131 | //invoke parser | |
132 | for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) { | |
133 | if (i->isActive) { |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |