ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/src/io/SectionParserManager.cpp
(Generate patch)

Comparing trunk/OOPSE-2.0/src/io/SectionParserManager.cpp (file contents):
Revision 1930 by gezelter, Wed Jan 12 22:41:40 2005 UTC vs.
Revision 2238 by tim, Sun May 22 21:05:15 2005 UTC

# Line 1 | Line 1
1 < /*
1 > /*
2   * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3   *
4   * The University of Notre Dame grants you ("Licensee") a
# 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  
49 < SectionParserManager::~SectionParserManager() {
49 >  SectionParserManager::~SectionParserManager() {
50      SectionParserManager::iterator i;
51      for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) {
52 <        delete (i->sectionParser);
52 >      delete (i->sectionParser);
53      }
54      sectionParsers_.clear();
55 < }
55 >  }
56  
57 < void SectionParserManager::parse(std::istream& input, ForceField& ff) {
57 >  void SectionParserManager::parse(std::istream& input, ForceField& ff) {
58  
59      //reset active flags
60      SectionParserManager::iterator i;
61      for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) {
62 <        i->isActive = false;
62 >      i->isActive = false;
63      }
64  
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;
71 >      ++lineNo;
72          
73 <        std::string line = trimLeftCopy(buffer);
74 <        //a line begins with "//" is comment
75 <        if ( line.empty() || (line.size() >= 2 && line[0] == '/' && line[1] == '/')) {
76 <            continue;
77 <        } else {        
78 <            StringTokenizer tokenizer(line);
79 <            if (tokenizer.countTokens() < 2) {
80 <                continue;
81 <            } else {
82 <                std::string keyword = tokenizer.nextToken();
73 >      std::string line = trimLeftCopy(buffer);
74 >      //a line begins with "//" is a comment line
75 >      if ( line.empty() || (line.size() >= 2 && line[0] == '/'
76 >                            && line[1] == '/') ) {
77 >        continue;
78 >      } else {        
79 >        StringTokenizer tokenizer(line);
80 >        if (tokenizer.countTokens() < 2) {
81 >          continue;
82 >        } else {
83 >          std::string keyword = tokenizer.nextToken();
84  
85 <                if (keyword != "begin") {
86 <                    continue;
87 <                }
88 <
89 <                std::string section = tokenizer.nextToken();
90 <
91 <                i = std::find_if(sectionParsers_.begin(), sectionParsers_.end(), SameSectionParserFunctor(section));
92 <                if (i == sectionParsers_.end()){
93 <                    //can not find corresponding section parser
94 <                    std::cerr << "Can not find corresponding section parser for section: " << section << std::endl;
95 <                } else {
96 <                    i->isActive = true;
97 <                    i->lineNo = lineNo;
98 <                    i->offset = input.tellg();
99 <                }
100 <                
101 <            }
102 <        }
103 <
104 <        
85 >          if (keyword == "begin") {
86 >            std::string section = tokenizer.nextToken();
87 >            sectionNameStack.push(section);
88 >
89 >            i = std::find_if(sectionParsers_.begin(), sectionParsers_.end(),
90 >                       SameSectionParserFunctor(section));
91 >            if (i == sectionParsers_.end()){
92 >              sprintf(painCave.errMsg,
93 >                "SectionParserManager Error: Can not find corresponding "
94 >                "section parser for %s\n",
95 >                section.c_str());
96 >              painCave.isFatal = 1;
97 >              simError();                        
98 >            } else {
99 >              if (i->isActive) {
100 >          sprintf(painCave.errMsg, "SectionParserManager Error:find multiple %s "
101 >                  "section\n",
102 >                  section.c_str());
103 >          painCave.isFatal = 1;
104 >          simError();                        
105 >              } else {                        
106 >          i->isActive = true;
107 >          i->lineNo = lineNo;
108 >          i->offset = input.tellg();
109 >              }
110 >            }
111 >          } else if (keyword == "end") {
112 >            std::string section = tokenizer.nextToken();
113 >            if (sectionNameStack.top() == section) {
114 >              sectionNameStack.pop();
115 >            } else {
116 >              sprintf(painCave.errMsg, "SectionParserManager Error: begin %s and end %s does not match at line %d\n",
117 >                sectionNameStack.top().c_str(), section.c_str(), lineNo);
118 >              painCave.isFatal = 1;
119 >              simError();
120 >            }
121 >      
122 >          } else {
123 >            continue;
124 >          }
125 >        }
126 >      }
127 >      
128      }
129 <
129 >    
130 >    if (!sectionNameStack.empty()) {
131 >      sprintf(painCave.errMsg, "SectionParserManager Error: stack is not empty\n");
132 >      painCave.isFatal = 1;
133 >      simError();
134 >    }
135 >    
136      //invoke parser
137      for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) {
138 <        if (i->isActive) {
139 <            //C++ standard does not guarantee seekg  reset EOF, in that case, seekg will fail
140 <            //It is always a good idea to call clear() before seek
141 <            input.clear();            
142 <            input.seekg(i->offset);
143 <            (i->sectionParser)->parse(input, ff, i->lineNo);
144 <        }
138 >      if (i->isActive) {
139 >        //C++ standard does not guarantee seekg  reset EOF, in that case, seekg will fail
140 >        //It is always a good idea to call clear() before seek
141 >        input.clear();            
142 >        input.seekg(i->offset);
143 >        (i->sectionParser)->parse(input, ff, i->lineNo);
144 >      }
145      }
146      
147 < }
148 <
149 < void SectionParserManager::push_front(SectionParser* sp) {
147 >  }
148 >  
149 >  void SectionParserManager::push_front(SectionParser* sp) {
150      SectionParserManager::iterator i;
151      i = findSectionParser(sp->getSectionName());
152      if (i != sectionParsers_.end()) {
153 <        std::cerr << sp->getSectionName() << " section parser is alway existed" << std::endl;
154 <        return;
153 >      std::cerr << sp->getSectionName() << " section parser is alway existed"
154 >      << std::endl;
155 >      return;
156      }
157      
158      SectionParserContext context;
159      
160      if (sectionParsers_.empty()) {
161 <        context.priority = beginPriority_;
161 >      context.priority = beginPriority_;
162      } else {
163 <        context.priority = sectionParsers_.front().priority - priorityDifference_;
163 >      context.priority = sectionParsers_.front().priority - priorityDifference_;
164      }
165 <
165 >    
166      context.sectionParser = sp;
167      context.lineNo = 0;
168      context.offset = 0;
169      context.isActive = false;
170  
171      sectionParsers_.push_front(context);
172 < }
172 >  }
173  
174 < void SectionParserManager::push_back(SectionParser* sp) {
174 >  void SectionParserManager::push_back(SectionParser* sp) {
175      SectionParserManager::iterator i;
176      i = findSectionParser(sp->getSectionName());
177      if (i != sectionParsers_.end()) {
178 <        std::cerr << sp->getSectionName() << " section parser is alway existed" << std::endl;
179 <        return;
178 >      std::cerr << sp->getSectionName() << " section parser is alway existed"
179 >      << std::endl;
180 >      return;
181      }
182  
183      SectionParserContext context;    
184      if (sectionParsers_.empty()) {
185 <        context.priority = beginPriority_;
185 >      context.priority = beginPriority_;
186      } else {
187 <        context.priority = sectionParsers_.back().priority + priorityDifference_;
187 >      context.priority = sectionParsers_.back().priority + priorityDifference_;
188      }
189  
190      context.sectionParser = sp;
# Line 159 | Line 194 | void SectionParserManager::push_back(SectionParser* sp
194  
195      sectionParsers_.push_back(context);
196  
197 < }
197 >  }
198  
199 < void SectionParserManager::insert(SectionParser* sp, int priority) {
199 >  void SectionParserManager::insert(SectionParser* sp, int priority) {
200      SectionParserManager::iterator i;
201      i = findSectionParser(sp->getSectionName());
202      if (i != sectionParsers_.end()) {
203 <        std::cerr << sp->getSectionName() << " section parser is alway existed" << std::endl;
203 >      std::cerr << sp->getSectionName() << " section parser is already existed"
204 >      << std::endl;
205      }
206  
207      SectionParserContext context;    
# Line 176 | Line 212 | void SectionParserManager::insert(SectionParser* sp, i
212      context.isActive = false;
213  
214      if (sectionParsers_.empty()) {
215 <        sectionParsers_.push_back(context);
215 >      sectionParsers_.push_back(context);
216      } else {
217  
218 <        for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) {
219 <            if (i->priority == priority) {
220 <                 std::cerr << "Priority " << priority << " already used" << std::endl;
221 <                 return;
222 <            } else if (i->priority > priority) {
223 <                sectionParsers_.insert(i, context);
224 <                break;
225 <            }
218 >      for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) {
219 >        if (i->priority == priority) {
220 >          std::cerr << "Priority " << priority << " already used" << std::endl;
221 >          return;
222 >        } else if (i->priority > priority) {
223 >          sectionParsers_.insert(i, context);
224 >          break;
225 >        }
226              
227 <        }
227 >      }
228      }
229  
230 < }
230 >  }
231  
232  
233 < SectionParserManager::iterator SectionParserManager::findSectionParser(const std::string& sectionName) {
233 >  SectionParserManager::iterator SectionParserManager::findSectionParser(const std::string& sectionName) {
234      SectionParserManager::iterator i;
235      for (i = sectionParsers_.begin(); i != sectionParsers_.end(); ++i) {
236 <        if (i->sectionParser->getSectionName() == sectionName) {
237 <            break;
238 <        }
236 >      if (i->sectionParser->getSectionName() == sectionName) {
237 >        break;
238 >      }
239      }
240  
241      return i;
242 < }
242 >  }
243  
244   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines