diff options
author | Mike Buland <eichlan@xagasoft.com> | 2012-01-06 01:08:53 -0700 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2012-01-06 01:08:53 -0700 |
commit | 46ccdb146476f8ac140af75ab2decccbce800db2 (patch) | |
tree | 7349b40681db46b38998096d26b7ddb74fe14072 | |
parent | 3af6cc33ff246d31513b9a645403a9ece58983a0 (diff) | |
download | stage-46ccdb146476f8ac140af75ab2decccbce800db2.tar.gz stage-46ccdb146476f8ac140af75ab2decccbce800db2.tar.bz2 stage-46ccdb146476f8ac140af75ab2decccbce800db2.tar.xz stage-46ccdb146476f8ac140af75ab2decccbce800db2.zip |
smlToConsole is now non-recursive.
It's a lot better this way overall, it's one self-contained function, it
doesn't require as much setup, and it works wonderfully overall.
-rw-r--r-- | src/options.cpp | 233 |
1 files changed, 140 insertions, 93 deletions
diff --git a/src/options.cpp b/src/options.cpp index 0f84e1c..319532e 100644 --- a/src/options.cpp +++ b/src/options.cpp | |||
@@ -118,129 +118,176 @@ void smlToHtml( const SmlNode *pNode ) | |||
118 | } | 118 | } |
119 | } | 119 | } |
120 | 120 | ||
121 | void appendToken( Bu::String &sCurLine, Bu::String &sNextToken, int &iLineLen ) | 121 | void appendToken( Bu::String &sCurLine, Bu::String &sNextToken, int &iLineLen, |
122 | int &iNextLen ) | ||
122 | { | 123 | { |
123 | if( iLineLen + sNextToken.getSize() + 1 >= 78 ) | 124 | if( iLineLen + iNextLen + 1 >= 78 ) |
124 | { | 125 | { |
125 | sio << sCurLine << sio.nl; | 126 | sio << sCurLine << sio.nl; |
126 | iLineLen = 0; | 127 | iLineLen = 0; |
127 | sCurLine = sNextToken; | 128 | sCurLine = sNextToken; |
128 | |||
129 | } | 129 | } |
130 | else | 130 | else |
131 | { | 131 | { |
132 | sCurLine += sNextToken; | 132 | sCurLine += sNextToken; |
133 | } | 133 | } |
134 | iLineLen += sNextToken.getSize() + 1; | 134 | iLineLen += iNextLen + 1; |
135 | sCurLine += " "; | 135 | sCurLine += " "; |
136 | iNextLen = 0; | ||
136 | sNextToken.clear(); | 137 | sNextToken.clear(); |
137 | } | 138 | } |
138 | 139 | ||
139 | void smlToConsole( const SmlNode *pNode, Bu::String &sCurLine, | 140 | void smlToConsole( const SmlNode *pNode ) |
140 | Bu::String &sNextToken, int &iLineLen, int &iState ) | ||
141 | { | 141 | { |
142 | // sio << "Begin: iState = " << iState << sio.nl; | 142 | Bu::String sCurLine; |
143 | switch( pNode->getType() ) | 143 | Bu::String sNextToken; |
144 | int iLineLen = 0; | ||
145 | int iNextLen = 0; | ||
146 | int iState = 0; | ||
147 | typedef Bu::List<SmlNode::SmlNodeList::const_iterator> NodeStack; | ||
148 | NodeStack sNode; | ||
149 | |||
150 | sNode.push( pNode->getChildren().begin() ); | ||
151 | |||
152 | for(;;) | ||
144 | { | 153 | { |
145 | case SmlNode::typeRoot: | 154 | if( !sNode.peek() ) |
146 | for( SmlNode::SmlNodeList::const_iterator i = | 155 | { |
147 | pNode->getChildren().begin(); i; i++ ) | 156 | sNode.pop(); |
157 | if( sNode.isEmpty() ) | ||
158 | break; | ||
159 | if( sNode.peek() ) | ||
148 | { | 160 | { |
149 | smlToConsole( *i, sCurLine, sNextToken, iLineLen, iState ); | 161 | // sio << "Pop'd: " << (*sNode.peek())->getText() << sio.nl; |
162 | Bu::String sTag = (*sNode.peek())->getText(); | ||
163 | if( sTag == "green" || sTag == "red" ) | ||
164 | { | ||
165 | sNextToken += "\x1B[0m"; | ||
166 | } | ||
167 | sNode.peek()++; | ||
168 | continue; | ||
150 | } | 169 | } |
170 | } | ||
171 | if( sNode.isEmpty() ) | ||
172 | { | ||
151 | break; | 173 | break; |
152 | 174 | } | |
153 | case SmlNode::typeText: | 175 | const SmlNode *pNode = (*sNode.peek()); |
154 | { | 176 | switch( pNode->getType() ) |
155 | Bu::String::const_iterator iBgn = pNode->getText().begin(); | 177 | { |
156 | Bu::String::const_iterator iEnd = iBgn; | 178 | case SmlNode::typeRoot: |
157 | for(;iBgn;) | 179 | throw Bu::ExceptionBase("Invalid root."); |
180 | |||
181 | case SmlNode::typeText: | ||
158 | { | 182 | { |
159 | // sio << iState << ": [" << (iBgn?*iBgn:'-') << ":" | 183 | // sio << "Process text node: " << pNode->getText() << |
160 | // << (iEnd?*iEnd:'-') << "]" | 184 | // sio.nl; |
161 | // << sio.nl; | 185 | Bu::String::const_iterator iBgn = pNode->getText().begin(); |
186 | Bu::String::const_iterator iEnd = iBgn; | ||
162 | int iTmpLen = 0; | 187 | int iTmpLen = 0; |
163 | switch( iState ) | 188 | for(;iBgn;) |
164 | { | 189 | { |
165 | case 0: // begining of paragraph | 190 | switch( iState ) |
166 | if( iBgn && ( *iBgn == ' ' || *iBgn == '\n' || | 191 | { |
167 | *iBgn == '\r' || *iBgn == '\t' ) ) | 192 | case 0: // begining of paragraph |
168 | { | 193 | if( iBgn && ( *iBgn == ' ' || *iBgn == '\n' || |
169 | iBgn++; | 194 | *iBgn == '\r' || *iBgn == '\t' ) ) |
170 | } | 195 | { |
171 | else | 196 | iBgn++; |
172 | { | 197 | } |
173 | // Here is where you would indent paragraphs | 198 | else |
174 | iEnd = iBgn; | 199 | { |
175 | iState = 1; | 200 | // Here is where you would indent paragraphs |
176 | } | 201 | iEnd = iBgn; |
177 | break; | 202 | iState = 1; |
178 | 203 | } | |
179 | case 1: // non-whitespace | 204 | break; |
180 | if( !iEnd ) | 205 | |
181 | { | 206 | case 1: // non-whitespace |
182 | sNextToken.append( iBgn, iEnd ); | 207 | if( !iEnd ) |
183 | iBgn = iEnd; | 208 | { |
184 | } | 209 | sNextToken.append( iBgn, iEnd ); |
185 | else if( *iEnd == ' ' || *iEnd == '\n' || | 210 | iBgn = iEnd; |
186 | *iEnd == '\r' || *iEnd == '\t' ) | 211 | } |
187 | { | 212 | else if( *iEnd == ' ' || *iEnd == '\n' || |
188 | sNextToken.append( iBgn, iEnd ); | 213 | *iEnd == '\r' || *iEnd == '\t' ) |
189 | iState = 2; | 214 | { |
190 | iBgn = iEnd; | 215 | sNextToken.append( iBgn, iEnd ); |
191 | } | 216 | iNextLen += iTmpLen; |
192 | else | 217 | iTmpLen = 0; |
193 | { | 218 | iState = 2; |
194 | iEnd++; | 219 | iBgn = iEnd; |
195 | iTmpLen++; | 220 | } |
196 | } | 221 | else |
197 | break; | 222 | { |
198 | 223 | iEnd++; | |
199 | case 2: // Whitespace | 224 | iTmpLen++; |
200 | if( iBgn && (*iBgn == ' ' || *iBgn == '\n' || | 225 | } |
201 | *iBgn == '\r' || *iBgn == '\t') ) | 226 | break; |
202 | { | 227 | |
203 | iBgn++; | 228 | case 2: // Whitespace |
204 | } | 229 | if( iBgn && (*iBgn == ' ' || *iBgn == '\n' || |
205 | else | 230 | *iBgn == '\r' || *iBgn == '\t') ) |
206 | { | 231 | { |
207 | iEnd = iBgn; | 232 | iBgn++; |
208 | iState = 1; | 233 | } |
209 | appendToken( sCurLine, sNextToken, iLineLen ); | 234 | else |
210 | } | 235 | { |
211 | break; | 236 | iEnd = iBgn; |
237 | iState = 1; | ||
238 | appendToken( sCurLine, sNextToken, | ||
239 | iLineLen, iNextLen ); | ||
240 | } | ||
241 | break; | ||
242 | } | ||
212 | } | 243 | } |
213 | } | 244 | } |
214 | } | 245 | break; |
215 | break; | ||
216 | 246 | ||
217 | case SmlNode::typeTag: | 247 | case SmlNode::typeTag: |
218 | if( pNode->getChildren().isEmpty() ) | 248 | if( pNode->getChildren().isEmpty() ) |
219 | { | ||
220 | if( pNode->getText() == "break" ) | ||
221 | { | 249 | { |
222 | appendToken( sCurLine, sNextToken, iLineLen ); | 250 | if( pNode->getText() == "break" ) |
223 | if( !sCurLine.isEmpty() ) | 251 | { |
224 | sio << sCurLine << sio.nl; | 252 | appendToken( sCurLine, sNextToken, iLineLen, iNextLen ); |
225 | sCurLine.clear(); | 253 | if( !sCurLine.isEmpty() ) |
226 | iLineLen = 0; | 254 | sio << sCurLine << sio.nl; |
227 | iState = 0; | 255 | sCurLine.clear(); |
256 | iLineLen = 0; | ||
257 | iState = 0; | ||
258 | } | ||
228 | } | 259 | } |
229 | } | 260 | else |
230 | else | ||
231 | { | ||
232 | for( SmlNode::SmlNodeList::const_iterator i = | ||
233 | pNode->getChildren().begin(); i; i++ ) | ||
234 | { | 261 | { |
235 | smlToConsole( *i, sCurLine, sNextToken, iLineLen, iState ); | 262 | // sio << "Push'd: " << pNode->getText() << sio.nl; |
263 | Bu::String sTag = pNode->getText(); | ||
264 | if( sTag == "green" ) | ||
265 | { | ||
266 | sNextToken += "\x1B[1;32m"; | ||
267 | } | ||
268 | else if( sTag == "red" ) | ||
269 | { | ||
270 | sNextToken += "\x1B[1;31m"; | ||
271 | } | ||
272 | sNode.push( pNode->getChildren().begin() ); | ||
273 | continue; | ||
274 | /* for( SmlNode::SmlNodeList::const_iterator i = | ||
275 | pNode->getChildren().begin(); i; i++ ) | ||
276 | { | ||
277 | s | ||
278 | smlToConsole( *i, sCurLine, sNextToken, iLineLen, iState ); | ||
279 | } | ||
280 | */ | ||
236 | } | 281 | } |
237 | } | 282 | break; |
238 | break; | 283 | } |
284 | sNode.peek()++; | ||
239 | } | 285 | } |
240 | 286 | if( !sNextToken.isEmpty() ) | |
241 | // sio << "Green? \x1b[1mhello\x1b[0m huh" << sio.nl; | 287 | appendToken( sCurLine, sNextToken, iLineLen, iNextLen ); |
288 | sio << sCurLine << sio.nl; | ||
242 | } | 289 | } |
243 | 290 | /* | |
244 | void smlToConsole( const SmlNode *pNode ) | 291 | void smlToConsole( const SmlNode *pNode ) |
245 | { | 292 | { |
246 | Bu::String sBuf, sBuf2; | 293 | Bu::String sBuf, sBuf2; |
@@ -248,7 +295,7 @@ void smlToConsole( const SmlNode *pNode ) | |||
248 | smlToConsole( pNode, sBuf, sBuf2, i1, i2 ); | 295 | smlToConsole( pNode, sBuf, sBuf2, i1, i2 ); |
249 | appendToken( sBuf, sBuf2, i1 ); | 296 | appendToken( sBuf, sBuf2, i1 ); |
250 | sio << sBuf << sBuf2 << sio.nl; | 297 | sio << sBuf << sBuf2 << sio.nl; |
251 | } | 298 | }*/ |
252 | 299 | ||
253 | int Options::smlTest( Bu::Array<Bu::String> aArgs ) | 300 | int Options::smlTest( Bu::Array<Bu::String> aArgs ) |
254 | { | 301 | { |