#include <xmltokenizer.h>
Inheritance diagram for cppdom::xmlstream_iterator:


Public Methods | |
| xmlstream_iterator (std::istream &in, XMLLocation &loc) | |
| ctor. More... | |
Protected Methods | |
| void | getNext () |
| bool | isLiteral (char c) |
| bool | isWhiteSpace (char c) |
| bool | isNewLine (char c) |
| bool | isStringDelimiter (char c) |
Protected Attributes | |
| bool | mCdataMode |
| cdata-mode doesn't care for whitespaces in generic strings. More... | |
| char | mPutbackChar |
| char which was put back internally. More... | |
Definition at line 166 of file xmltokenizer.h.
|
||||||||||||
|
ctor.
Definition at line 171 of file xmltokenizer.cpp.
00172 : XMLTokenizer(in, loc) 00173 , mCdataMode(false) 00174 , mPutbackChar(-1) 00175 {} |
|
|
Implements cppdom::XMLTokenizer. Definition at line 178 of file xmltokenizer.cpp. References isLiteral(), isNewLine(), isStringDelimiter(), isWhiteSpace(), mCdataMode, cppdom::XMLTokenizer::mCurToken, cppdom::XMLTokenizer::mInput, cppdom::XMLTokenizer::mLocation, mPutbackChar, cppdom::XMLTokenizer::mTokenStack, and cppdom::XMLLocation::step().
00179 {
00180 // first use the token stack if filled
00181 if (mTokenStack.size() != 0)
00182 {
00183 // get the token from the stack and return it
00184 XMLToken tok;
00185 mCurToken = mTokenStack.top();
00186 mTokenStack.pop();
00187
00188 return;
00189 }
00190
00191 bool finished = false;
00192
00193 std::string generic;
00194
00195 // get next char
00196 char c;
00197
00198 do
00199 {
00200 if (mPutbackChar == char(-1))
00201 {
00202 c = mInput.get();
00203 mLocation.step();
00204 }
00205 else
00206 {
00207 c = mPutbackChar;
00208 mPutbackChar = char(-1);
00209 mLocation.step();
00210 }
00211
00212 // do we have an eof?
00213 // TODO: check for instr.eof()
00214 if (c == char(EOF))
00215 {
00216 if (generic.length() != 0)
00217 {
00218 mCurToken = c;
00219 return;
00220 }
00221 else
00222 {
00223 break;
00224 }
00225 }
00226
00227 // is it a literal?
00228 if (isLiteral(c))
00229 {
00230 mCdataMode = false;
00231 if (generic.length() == 0)
00232 {
00233 mCurToken = c;
00234
00235 // quick fix for removing set_cdataMode() functionality
00236 if (c == '>')
00237 {
00238 mCdataMode = true;
00239 }
00240
00241 return;
00242 }
00243 mPutbackChar = c;
00244 mLocation.step(-1);
00245 break;
00246 }
00247
00248 // a string delimiter and not in cdata mode?
00249 if (isStringDelimiter(c) && !mCdataMode)
00250 {
00251 generic = c;
00252 char delim = c;
00253 do
00254 {
00255 c = mInput.get();
00256 mLocation.step();
00257 if (c == char(EOF))
00258 {
00259 break;
00260 }
00261 generic += c;
00262 }
00263 while (c != delim);
00264 break;
00265 }
00266
00267 // a whitespace?
00268 if (isWhiteSpace(c))
00269 {
00270 if (generic.length() == 0)
00271 {
00272 continue;
00273 }
00274 else
00275 {
00276 if (!mCdataMode)
00277 {
00278 break;
00279 }
00280 }
00281 }
00282
00283 // a newline char?
00284 if (isNewLine(c) )
00285 {
00286 if (mCdataMode && generic.length() != 0)
00287 {
00288 c = ' ';
00289 }
00290 else
00291 {
00292 continue;
00293 }
00294 }
00295
00296 // add to generic string
00297 generic += c;
00298 }
00299 while (!finished);
00300
00301 // set the generic string
00302 mCurToken = generic;
00303 }
|
|
|
Definition at line 306 of file xmltokenizer.cpp. Referenced by getNext().
00307 {
00308 switch(c)
00309 {
00310 case '?':
00311 case '=':
00312 case '!':
00313 case '/':
00314 if (mCdataMode)
00315 {
00316 return false;
00317 }
00318 case '<':
00319 case '>':
00320 return true;
00321 }
00322 return false;
00323 }
|
|
|
Definition at line 338 of file xmltokenizer.cpp. References cppdom::XMLTokenizer::mLocation, and cppdom::XMLLocation::newline(). Referenced by getNext().
00339 {
00340 switch(c)
00341 {
00342 case '\n':
00343 mLocation.newline();
00344 case '\r':
00345 return true;
00346 }
00347 return false;
00348 }
|
|
|
Definition at line 351 of file xmltokenizer.cpp. Referenced by getNext().
00352 {
00353 switch(c)
00354 {
00355 case '\"':
00356 case '\'':
00357 return true;
00358 }
00359 return false;
00360 }
|
|
|
Definition at line 326 of file xmltokenizer.cpp. Referenced by getNext().
00327 {
00328 switch(c)
00329 {
00330 case ' ':
00331 case '\t':
00332 return true;
00333 }
00334 return false;
00335 }
|
|
|
cdata-mode doesn't care for whitespaces in generic strings.
Definition at line 182 of file xmltokenizer.h. Referenced by getNext(). |
|
|
char which was put back internally.
Definition at line 185 of file xmltokenizer.h. Referenced by getNext(). |
1.2.15