Branch data Line data Source code
1 : : /*********************************************
2 : : Reactor Geometry Generator
3 : : Argonne National Laboratory
4 : :
5 : : Contains CParser class implementation.
6 : : *********************************************/
7 : : #include <cctype>
8 : : #include "meshkit/parser.hpp"
9 : : #include <stdlib.h>
10 : :
11 : 120 : CParser::CParser ()
12 : : // ---------------------------------------------------------------------------
13 : : // Function: default constructor
14 : : // Input: none
15 : : // Output: none
16 : : // ---------------------------------------------------------------------------
17 : : {
18 : 120 : }
19 : :
20 : 120 : CParser::~CParser ()
21 : : // ---------------------------------------------------------------------------
22 : : // Function: destructor
23 : : // Input: none
24 : : // Output: none
25 : : // ---------------------------------------------------------------------------
26 : : {
27 : 120 : }
28 : :
29 : 1404 : bool CParser::ReadNextLine (std::ifstream& FileInput, int& nLineNum,
30 : : std::string& szInputString, const int MAXCHARS,
31 : : const std::string& szComment, bool bLowerCase)
32 : : // ---------------------------------------------------------------------------
33 : : // Function: reads the next line skipping over the comment lines
34 : : // and converts all alphabets to lower case if requested
35 : : // Input: file istream, line #, string to hold the input line,
36 : : // max. # of characters expected in each input line,
37 : : // comment character(s) at the beginning of a comment line,
38 : : // lowercase conversion option
39 : : // Output: updated values of line # and the string
40 : : // return value is true if successful
41 : : // false if an error state is encountered
42 : : // Restriction: Cannot read a line over 256 characters
43 : : // ---------------------------------------------------------------------------
44 : : {
45 : 1404 : int flag = 0;
46 : 1404 : int flag1 =0;
47 : 1404 : bool bWhSpc = false;
48 : 1404 : int tokenfound = 1;
49 : 1404 : const int MAXCH = 10000;
50 : : char szInp[MAXCH];
51 : : char szTemp [MAXCH];
52 [ + - ]: 1404 : std::vector<std::string> tokens;
53 : :
54 : : // enough capacity to read and store?
55 [ - + ]: 1404 : if (MAXCHARS > MAXCH)
56 : 0 : return false;
57 : :
58 : : // comment character(s)
59 : 1404 : int nCLen = static_cast<int>(szComment.length());
60 : : // read the line (skip over comment lines)
61 : : for(;;)
62 : : {
63 : 1656 : ++nLineNum;
64 [ + - ]: 1656 : FileInput.getline (szInp, MAXCHARS);
65 : : // // end-of-file?
66 : : // if (FileInput.eof())
67 : : // return false;
68 [ + - ][ - + ]: 1656 : if (FileInput.fail())
69 [ # # ][ # # ]: 0 : FileInput.clear (FileInput.rdstate() & ~std::ios::failbit);
[ # # ][ # # ]
70 : : // unrecoverable error?
71 [ + - ][ - + ]: 1656 : if (FileInput.bad())
72 : 0 : return false;
73 : :
74 : : // successful read
75 [ + - ]: 1656 : szInputString = szInp;
76 [ + - ][ + - ]: 1656 : GetTokens(szInputString, " ", tokens);
77 [ + - ]: 1656 : bWhSpc = EatWhiteSpace(szInputString);
78 [ + - ][ + - ]: 1656 : if ((szInputString.substr(0,nCLen) != szComment)&& (bWhSpc ==false)){
[ + + ][ + - ]
[ + - ]
[ + + # # ]
79 [ + - ]: 1404 : szInputString = szInp;
80 [ + - ][ + - ]: 1404 : GetTokens(szInputString, " ", tokens);
81 [ + + ]: 6168 : for(unsigned int i=0; i< tokens.size(); i++){
82 [ + - ]: 4764 : std::string const& temptoken = tokens[i];
83 [ + - ][ - + ]: 4764 : if (temptoken == "&")
84 : 0 : flag1 = 1;
85 : : }
86 : :
87 : : //Filter the comment tokens
88 : : // FilterComment(szInputString, szComment);
89 : :
90 : : //if "&" is found continue to read the next line
91 [ + - ]: 1404 : std::string szTempString = szInputString;
92 : :
93 : : // check if line is continued &
94 [ - + ][ # # ]: 1404 : while(flag1 ==1 && tokenfound == 1){
95 [ # # ][ # # ]: 0 : GetTokens(szTempString, " ", tokens);
96 [ # # ]: 0 : for(unsigned int i=1; i<=tokens.size(); i++){
97 [ # # ]: 0 : std::string const& temptoken = tokens[i-1];
98 [ # # ][ # # ]: 0 : if (temptoken == "&"){
99 : 0 : tokenfound = 1;
100 : 0 : flag = 1;
101 : : }
102 : : else{
103 [ # # ]: 0 : if(flag==1)
104 : 0 : flag = 1;//do nothing token already found
105 : : else
106 : 0 : tokenfound = 0;
107 : : }
108 : : }
109 [ # # ]: 0 : if(tokenfound ==1){
110 : 0 : ++nLineNum;
111 [ # # ]: 0 : RemoveToken(szInputString);
112 : : //- getting more tokens and add to the existing
113 [ # # ]: 0 : FileInput.getline (szTemp, MAXCHARS);
114 : : // end-of-file?
115 [ # # ][ # # ]: 0 : if (FileInput.eof())
116 : 0 : return false;
117 [ # # ][ # # ]: 0 : if (FileInput.fail())
118 [ # # ][ # # ]: 0 : FileInput.clear (FileInput.rdstate() & ~std::ios::failbit);
[ # # ][ # # ]
119 : : // unrecoverable error?
120 [ # # ][ # # ]: 0 : if (FileInput.bad())
121 : 0 : return false;
122 : : // successful read
123 [ # # ]: 0 : szTempString = szTemp;
124 [ # # ]: 0 : FilterComment(szTempString, szComment);
125 [ # # ]: 0 : szInputString+=" ";
126 [ # # ]: 0 : szInputString+=szTemp;
127 : : }
128 : : else{
129 : 0 : break;//while loop ents
130 : : }
131 : 0 : flag = 0;
132 : : }
133 : : // while loop ends
134 : : // convert to lower case?
135 [ + - ]: 1404 : if (bLowerCase){
136 [ + + ]: 26748 : for (int i=0; i < static_cast<int>(szInputString.length()); i++)
137 [ + - ][ + - ]: 25344 : szInputString[i] = tolower(szInputString[i]);
138 : : }
139 [ - + ]: 1404 : break;
140 : : }
141 : 252 : }
142 : 1404 : return true;
143 : : }
144 : :
145 : 4716 : void CParser::GetTokens (const std::string& input,
146 : : const std::string& delims,
147 : : std::vector<std::string>& tokens)
148 : : // ----------------------------------------------------------------------------
149 : : // Function: Parses the input line and gets the tokens
150 : : // Input: string, delimiters
151 : : // Output: vector containing the tokens
152 : : // ----------------------------------------------------------------------------
153 : : {
154 : : std::string::size_type beg_index, end_index;
155 : :
156 : : // clear the vector that will store the tokens
157 : 4716 : tokens.clear();
158 : :
159 : : // get location of the first character that is not a delimiter
160 : 4716 : beg_index = input.find_first_not_of(delims);
161 : :
162 : : // loop while the beginning index is not the end of string
163 [ + + ]: 19632 : while (beg_index != std::string::npos)
164 : : {
165 : : // get location of the next delimiter
166 : 14916 : end_index = input.find_first_of (delims, beg_index);
167 : :
168 : : // if this location is the end of string then adjust the value
169 : : // as string length
170 [ + + ]: 14916 : if (end_index == std::string::npos) end_index = input.length();
171 : :
172 : : // save the string between beg_index and end_index
173 [ + - ]: 14916 : tokens.push_back (input.substr(beg_index,end_index-beg_index));
174 : :
175 : : // get location of the next character that is not a delimiter
176 : 14916 : beg_index = input.find_first_not_of (delims, end_index);
177 : : }
178 : 4716 : }
179 : :
180 : :
181 : 0 : void CParser:: FilterComment (std::string& input, const std::string& szComment)
182 : :
183 : : // ----------------------------------------------------------------------------
184 : : // Function: Parses the input line and gets the tokens
185 : : // Input: string, delimiters
186 : : // Output: vector containing the tokens
187 : : // ----------------------------------------------------------------------------
188 : : {
189 : : // remove comment from the line obtained
190 : : unsigned int i;
191 [ # # ]: 0 : std::vector<std::string> tokens;
192 [ # # ]: 0 : std::string tempInput;
193 [ # # ][ # # ]: 0 : GetTokens(input, " ", tokens);
194 [ # # ]: 0 : for(i=0; i<tokens.size(); i++){
195 [ # # ]: 0 : std::string const& temptoken = tokens[i];
196 [ # # ][ # # ]: 0 : if(temptoken == szComment){
197 : 0 : break;
198 : : }
199 : : else{
200 [ # # ]: 0 : tempInput+=temptoken;
201 [ # # ]: 0 : if(i!=(tokens.size()-1)){ //indent{
202 [ # # ][ # # ]: 0 : if (tokens[i+1]!=szComment)
[ # # ]
203 [ # # ]: 0 : tempInput+=" ";
204 : : }
205 : : else{
206 [ # # ]: 0 : tempInput+=""; // no indent
207 : : }
208 : : }
209 : : }
210 [ # # ]: 0 : input = tempInput.c_str();
211 : 0 : }
212 : :
213 : 0 : void CParser:: RemoveToken (std::string& input)
214 : :
215 : : // ----------------------------------------------------------------------------
216 : : // Function: Parses the input line and gets the tokens
217 : : // Input: string, delimiters
218 : : // Output: vector containing the tokens
219 : : // ----------------------------------------------------------------------------
220 : : {
221 : : // remove comment from the line obtained
222 : : unsigned int i;
223 [ # # ]: 0 : std::vector<std::string> tokens;
224 [ # # ]: 0 : std::string tempInput;
225 [ # # ][ # # ]: 0 : GetTokens(input, " ", tokens);
226 [ # # ]: 0 : for(i=0; i<tokens.size(); i++){
227 [ # # ]: 0 : std::string const& temptoken = tokens[i];
228 [ # # ][ # # ]: 0 : if(temptoken == "&"){
229 : 0 : break;
230 : : }
231 : : else{
232 [ # # ]: 0 : tempInput+=temptoken;
233 [ # # ]: 0 : if(i!=(tokens.size()-1)){ //indent{
234 [ # # ][ # # ]: 0 : if (tokens[i+1]!="&")
[ # # ]
235 [ # # ]: 0 : tempInput+=" ";
236 : : }
237 : : else{
238 [ # # ]: 0 : tempInput+=""; // no indent
239 : : }
240 : : }
241 : : }
242 [ # # ]: 0 : input = tempInput.c_str();
243 : 0 : }
244 : :
245 : 1656 : bool CParser:: EatWhiteSpace (std::string& input)
246 : :
247 : : // ----------------------------------------------------------------------------
248 : : // Function: Parses the input line and gets the tokens
249 : : // Input: string, delimiters
250 : : // Output: vector containing the tokens
251 : : // ----------------------------------------------------------------------------
252 : : {
253 : : // remove comment from the line obtained
254 : : unsigned int i;
255 [ + - ]: 1656 : std::vector<std::string> tokens;
256 [ + - ]: 3312 : std::string tempInput;
257 [ + - ][ + - ]: 1656 : GetTokens(input, " ", tokens);
258 [ + - ]: 1656 : for(i=0; i<tokens.size(); i++){
259 [ + - ]: 1656 : std::string const& temptoken = tokens[i];
260 [ + - ][ + - ]: 1656 : if(temptoken != " " && temptoken !="!"){
[ + - ][ + + ]
[ + + ]
261 : 1416 : return false;
262 : : break;
263 : : }
264 [ + - ][ + - ]: 240 : else if(temptoken =="!"){
265 : 240 : return true;
266 : : break;
267 : : }
268 : : }
269 : 1656 : return false;
270 [ + - ][ + - ]: 1872 : }
|