void TextureAtlasLoader::LoadAtlas (const std::string& filename, TextureAtlas* texAtlas) { std::string lineType; std::ifstream file (filename.c_str ()); if (!file.is_open ()) { Console::LogError ("Unable to open atlas file \"" + filename + "\" !"); exit (1); } while (file >> lineType) { if (lineType == "#") { ProcessComment (file); } else if (lineType == "Area") { ProcessArea (file, texAtlas); } else { ProcessComment (file); } } file.close (); }
int MyRequest::Lexer(char *buf, int length) { int consumed = 0; if(length == 0) { valid = methodValid && urlValid && httpVersionValid; if(data.size() == contentLength) done = lexerState != LEXER_init; return 0; } if(parserState == PARSER_body) { consumed = AppendData(buf, length); return consumed; } for(int i = 0; i < length; i++, consumed++) { if(parserState == PARSER_body) { consumed += AppendData(buf + i, length - i); break; } char ch = buf[i]; rawHeader.push_back(ch); again: if(parserState == PARSER_body) { consumed += AppendData(buf + i, length - i); break; } if(lexerState > LEXER_error) { aborted = true; break; } switch(lexerState) { case LEXER_init: if((isctl(ch) || isseparator(ch) || ch == ' ' || ch == '\t') && !lexerToken.empty()) { ProcessTokenIfAvailable(); goto again; } if(ch == '\r') lexerState = LEXER_cr_read; else if(ch == '\n') ProcessLF(); else if(opaqueEnabled) { lexerOpaqueString.clear(); lexerState = LEXER_opaque; goto again; } else if(parseURLEnabled && !isspace(ch)) { lexerUrl.clear(); lexerState = LEXER_url; goto again; } else if(ch == '"' && quotedStringsEnabled) { lexerQuotedString.clear(); lexerState = LEXER_quoted_string; } else if(ch == '(' && commentsEnabled) { lexerComment.clear(); lexerComment.push_back(ch); lexerState = LEXER_comment; lexerCommentNesting = 1; } else if(ch == ' ' || ch == '\t') lexerState = LEXER_LWS_read; else if(isseparator(ch)) ProcessSeparator(ch); else if(!isctl(ch)) lexerToken.push_back(ch); else lexerState = LEXER_token_text_error; break; case LEXER_opaque: ProcessTokenIfAvailable(); if(ch == '\r') { if(foldingEnabled) lexerState = LEXER_opaque_cr_read; else { ProcessOpaque(lexerOpaqueString); lexerState = LEXER_init; goto again; } } else lexerOpaqueString.push_back(ch); break; case LEXER_opaque_cr_read: ProcessTokenIfAvailable(); if(ch == '\n') lexerState = LEXER_opaque_newline_read; else { ProcessOpaque(lexerOpaqueString); lexerState = LEXER_init; goto again; } break; case LEXER_opaque_newline_read: if(ch == ' ' || ch == '\t') { lexerOpaqueString.push_back(' '); lexerState = LEXER_opaque; } else { ProcessOpaque(lexerOpaqueString); ProcessNewline(); lexerState = LEXER_init; goto again; } break; case LEXER_url: ProcessTokenIfAvailable(); if(isspace(ch)) { ProcessURL(lexerUrl); lexerState = LEXER_init; goto again; } else { if(ch == '%') lexerState = LEXER_url_encoded_1; else if(ch == '+') lexerUrl.push_back(' '); else lexerUrl.push_back(ch); } break; case LEXER_url_encoded_1: if(ch == '%') { lexerUrl.push_back('%'); lexerState = LEXER_url; } else if(isxdigit(ch)) { lexerTmpHex[0] = ch; lexerTmpHex[2] = '\0'; lexerState = LEXER_url_encoded_2; } else lexerState = LEXER_url_error; break; case LEXER_url_encoded_2: if(isxdigit(ch)) { lexerTmpHex[1] = ch; char newch = strtol(lexerTmpHex, NULL, 16); lexerUrl.push_back(newch); lexerState = LEXER_url; } else lexerState = LEXER_url_error; break; case LEXER_comment: ProcessTokenIfAvailable(); if(ch == '\\') lexerState = LEXER_quoted_pair_comment; else if(ch == '(') { lexerCommentNesting++; lexerComment.push_back(ch); } else if(ch == ')') { lexerCommentNesting--; lexerComment.push_back(ch); if(lexerCommentNesting == 0) { ProcessComment(lexerComment); lexerState = LEXER_init; } } else if(istext(ch)) { lexerComment.push_back(ch); } else lexerState = LEXER_comment_text_error; break; case LEXER_quoted_pair_comment: ProcessTokenIfAvailable(); lexerComment.push_back(ch); lexerState = LEXER_comment; break; case LEXER_quoted_string: ProcessTokenIfAvailable(); if(ch == '\\') lexerState = LEXER_quoted_pair; else if(ch == '"') { ProcessQuotedString(lexerQuotedString); lexerState = LEXER_init; } else if(istext(ch)) { lexerQuotedString.push_back(ch); } else lexerState = LEXER_quoted_string_text_error; break; case LEXER_quoted_pair: ProcessTokenIfAvailable(); lexerQuotedString.push_back(ch); lexerState = LEXER_quoted_string; break; case LEXER_cr_read: ProcessTokenIfAvailable(); if(ch == '\n') { if(foldingEnabled) lexerState = LEXER_newline_read; else { ProcessNewline(); lexerState = LEXER_init; } } else { ProcessCR(); lexerState = LEXER_init; goto again; } break; case LEXER_newline_read: // LWS folding state ProcessTokenIfAvailable(); if(ch == ' ' || ch == '\t') lexerState = LEXER_LWS_read; else { ProcessNewline(); lexerState = LEXER_init; goto again; } break; case LEXER_LWS_read: // partial LWS ProcessTokenIfAvailable(); if(ch == '\r') lexerState = LEXER_LWS_cr_read; else if(ch != ' ' && ch != '\t') { lexerState = LEXER_init; ProcessLWS(); goto again; } break; case LEXER_LWS_cr_read: ProcessTokenIfAvailable(); if(ch == '\n') { if(foldingEnabled) lexerState = LEXER_LWS_newline_read; else { ProcessLWS(); ProcessNewline(); lexerState = LEXER_init; } } else { ProcessCR(); lexerState = LEXER_init; goto again; } break; case LEXER_LWS_newline_read: ProcessTokenIfAvailable(); if(ch == ' ' || ch == '\t') lexerState = LEXER_LWS_read; else { ProcessLWS(); ProcessNewline(); lexerState = LEXER_init; goto again; } break; } } if(parserState == PARSER_body) { valid = methodValid && urlValid && httpVersionValid; if(data.size() == contentLength) done = true; } return consumed; }