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 2097 by tim, Wed Mar 9 17:30:29 2005 UTC vs.
Revision 2211 by chrisfen, Thu Apr 21 14:12:19 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 46 | Line 46 | SectionParserManager::~SectionParserManager() {
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;
# Line 68 | Line 68 | void SectionParserManager::parse(std::istream& input,
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 a comment line
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 <                    std::string section = tokenizer.nextToken();
87 <                    sectionNameStack.push(section);
88 <
89 <                    i = std::find_if(sectionParsers_.begin(), sectionParsers_.end(), SameSectionParserFunctor(section));
90 <                    if (i == sectionParsers_.end()){
91 <                        sprintf(painCave.errMsg, "SectionParserManager Error: Can not find corresponding section parser for %s\n",
92 <                                section.c_str());
93 <                        painCave.isFatal = 1;
94 <                        simError();                        
95 <                    } else {
96 <                        if (i->isActive) {
97 <                            sprintf(painCave.errMsg, "SectionParserManager Error:find multiple %s section\n",
98 <                                    section.c_str());
99 <                            painCave.isFatal = 1;
100 <                            simError();                        
101 <                        } else {                        
102 <                            i->isActive = true;
103 <                            i->lineNo = lineNo;
104 <                            i->offset = input.tellg();
105 <                        }
106 <                    }
107 <                } else if (keyword == "end") {
108 <                    std::string section = tokenizer.nextToken();
109 <                    if (sectionNameStack.top() == section) {
110 <                        sectionNameStack.pop();
111 <                    } else {
112 <                        sprintf(painCave.errMsg, "SectionParserManager Error: begin %s and end %s does not match at line %d\n",
113 <                                sectionNameStack.top().c_str(), section.c_str(), lineNo);
114 <                        painCave.isFatal = 1;
115 <                        simError();
116 <                    }
117 <                    
118 <                } else {
119 <                    continue;
120 <                }
121 <            }
122 <        }
123 <        
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();
131 >      sprintf(painCave.errMsg, "SectionParserManager Error: stack is not empty\n");
132 >      painCave.isFatal = 1;
133 >      simError();
134      }
135 <
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 187 | 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 alway existed"
204 >      << std::endl;
205      }
206  
207      SectionParserContext context;    
# Line 204 | 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