ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-3.0/src/io/SectionParserManager.cpp
Revision: 1840
Committed: Fri Dec 3 00:26:07 2004 UTC (19 years, 7 months ago) by tim
File size: 5993 byte(s)
Log Message:
Fixed a bug in countTokens in StringTokenizer

File Contents

# Content
1 /*
2 * Copyright (C) 2000-2004 Object Oriented Parallel Simulation Engine (OOPSE) project
3 *
4 * Contact: oopse@oopse.org
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * as published by the Free Software Foundation; either version 2.1
9 * of the License, or (at your option) any later version.
10 * All we ask is that proper credit is given for our work, which includes
11 * - but is not limited to - adding the above copyright notice to the beginning
12 * of your source code files, and to any copyright notice that you may distribute
13 * with programs based on this work.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 *
24 */
25
26 #include "io/SectionParserManager.hpp"
27 #include "utils/Trim.hpp"
28
29 namespace oopse {
30
31 SectionParserManager::~SectionParserManager() {
32 SectionParserManager::iterator i;
33 for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) {
34 delete (i->sectionParser);
35 }
36 sectionParsers_.clear();
37 }
38
39 void SectionParserManager::parse(std::istream& input, ForceField& ff) {
40
41 //reset active flags
42 SectionParserManager::iterator i;
43 for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) {
44 i->isActive = false;
45 }
46
47 const int bufferSize = 65535;
48 char buffer[bufferSize];
49 int lineNo = 0;
50 //scan through the input stream and find section names
51 while(input.getline(buffer, bufferSize)) {
52 ++lineNo;
53
54 std::string line = trimLeftCopy(buffer);
55 //a line begins with "//" is comment
56 if ( line.empty() || (line.size() >= 2 && line[0] == '/' && line[1] == '/')) {
57 continue;
58 } else {
59 StringTokenizer tokenizer(line);
60 if (tokenizer.countTokens() < 2) {
61 continue;
62 } else {
63 std::string keyword = tokenizer.nextToken();
64
65 if (keyword != "begin") {
66 continue;
67 }
68
69 std::string section = tokenizer.nextToken();
70
71 i = std::find_if(sectionParsers_.begin(), sectionParsers_.end(), SameSectionParserFunctor(section));
72 if (i == sectionParsers_.end()){
73 //can not find corresponding section parser
74 std::cerr << "Can not find corresponding section parser for section: " << section << std::endl;
75 } else {
76 i->isActive = true;
77 i->lineNo = lineNo;
78 i->offset = input.tellg();
79 }
80
81 }
82 }
83
84
85 }
86
87 //invoke parser
88 for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) {
89 if (i->isActive) {
90 input.seekg(i->offset);
91 (i->sectionParser)->parse(input, ff, i->lineNo);
92 }
93 }
94
95 }
96
97 void SectionParserManager::push_front(SectionParser* sp) {
98 SectionParserManager::iterator i;
99 i = findSectionParser(sp->getSectionName());
100 if (i != sectionParsers_.end()) {
101 std::cerr << sp->getSectionName() << " section parser is alway existed" << std::endl;
102 return;
103 }
104
105 SectionParserContext context;
106
107 if (sectionParsers_.empty()) {
108 context.priority = beginPriority_;
109 } else {
110 context.priority = sectionParsers_.front().priority - priorityDifference_;
111 }
112
113 context.sectionParser = sp;
114 context.lineNo = 0;
115 context.offset = 0;
116 context.isActive = false;
117
118 sectionParsers_.push_front(context);
119 }
120
121 void SectionParserManager::push_back(SectionParser* sp) {
122 SectionParserManager::iterator i;
123 i = findSectionParser(sp->getSectionName());
124 if (i != sectionParsers_.end()) {
125 std::cerr << sp->getSectionName() << " section parser is alway existed" << std::endl;
126 return;
127 }
128
129 SectionParserContext context;
130 if (sectionParsers_.empty()) {
131 context.priority = beginPriority_;
132 } else {
133 context.priority = sectionParsers_.back().priority + priorityDifference_;
134 }
135
136 context.sectionParser = sp;
137 context.lineNo = 0;
138 context.offset = 0;
139 context.isActive = false;
140
141 sectionParsers_.push_back(context);
142
143 }
144
145 void SectionParserManager::insert(SectionParser* sp, int priority) {
146 SectionParserManager::iterator i;
147 i = findSectionParser(sp->getSectionName());
148 if (i != sectionParsers_.end()) {
149 std::cerr << sp->getSectionName() << " section parser is alway existed" << std::endl;
150 }
151
152 SectionParserContext context;
153 context.priority = priority;
154 context.sectionParser = sp;
155 context.lineNo = 0;
156 context.offset = 0;
157 context.isActive = false;
158
159 if (sectionParsers_.empty()) {
160 sectionParsers_.push_back(context);
161 } else {
162
163 for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) {
164 if (i->priority == priority) {
165 std::cerr << "Priority " << priority << " already used" << std::endl;
166 return;
167 } else if (i->priority > priority) {
168 sectionParsers_.insert(i, context);
169 break;
170 }
171
172 }
173 }
174
175 }
176
177
178 SectionParserManager::iterator SectionParserManager::findSectionParser(const std::string& sectionName) {
179 SectionParserManager::iterator i;
180 for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) {
181 if (i->sectionParser->getSectionName() == sectionName) {
182 break;
183 }
184 }
185
186 return i;
187 }
188
189 }