void XmlLexer::devourWhiteSpace() { bool foundWhiteSpace = true; report( " Consuming white space." ); while( foundWhiteSpace ) { int peek = file.peek(); if( !file.good() ) { break; } switch( peek ) { case ' ': case '\t': { file.get(); break; } case '\n': { _token.column = 0; ++_token.line; file.get(); peekline( _token.lineText ); break; } default: { foundWhiteSpace = false; break; } } } }
int readheader(Header *hdr) { char *line, *sep; line = peekline(); if(line == nil) return 0; sep = strstr(line, ":"); if(sep == nil || sep[1] == '\0') return 0; readline(); *sep = '\0'; // okay so here we're smashing some stacks. Scp(hdr->key, line, sizeof(hdr->key)); Scp(hdr->value, sep + 2, sizeof(hdr->value)); return 1; }
XmlLexer::XmlLexer( const std::string& fileName ) { file.open( fileName.c_str() ); _fileName = fileName; if( !file.is_open() ) { throw Exception ("Could not open XML file " + fileName); } _token.column = 0; _token.line = 0; peekline( _token.lineText ); _token.string = ""; _token.type = Token::INVALID; while( devourComment() ); }
int readfirstline(Request *r) { char *line, *fld; int pos; long n; line = peekline(); if(line == nil) return 0; /* XXX: note that we modify a peek'd line, which is not good behavior. however, our caller will always skip any failed line. obviously this does not generalize */ pos = 0; while((fld = strsep(&line, " ")) != nil){ if(*fld == '\0') continue; n = strlen(fld) + 1; switch(pos++){ case 0: if(!isvalidaction(fld)) return 0; strcpy(r->action, fld); break; case 1: if (n > sizeof(r->uri)) return 0; memcpy(r->uri, fld, n); break; case 2: if (n > sizeof(r->httpversion)) return 0; memcpy(r->httpversion, fld, n); break; default: return 0; } } if(pos == 3){ readline(); return 1; }else return 0; }