From af619d664dce9c858b14e44eda6a450e194fa933 Mon Sep 17 00:00:00 2001 From: "tg(x)" <*@tg-x.net> Date: Sat, 30 Apr 2011 16:42:03 +0200 Subject: [PATCH] parser: fixes for header only parsing --- include/psyc/parser.h | 2 +- src/parser.c | 12 +++++++----- test/testParser.c | 13 +++++++++++-- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/include/psyc/parser.h b/include/psyc/parser.h index 984ae84..ada7b91 100644 --- a/include/psyc/parser.h +++ b/include/psyc/parser.h @@ -24,7 +24,7 @@ typedef enum /// Parse only the header PSYC_PARSE_HEADER_ONLY = 1, /// Expects only the content part of a packet. The length of the content must fit exactly in this case - PSYC_PARSE_BEGIN_AT_CONTENT = 2, + PSYC_PARSE_BEGIN_AT_CONTENT = 2, } psycParseFlag; /** diff --git a/src/parser.c b/src/parser.c index 6e84964..bf75347 100644 --- a/src/parser.c +++ b/src/parser.c @@ -136,10 +136,6 @@ inline psycParseRC psyc_parseName(psycParseState* state, psycString* name) */ inline psycParseRC psyc_parseBinaryValue(psycParseState* state, psycString* value, size_t* length, size_t* parsed) { - if (state->flags & PSYC_PARSE_HEADER_ONLY && - state->flags & PSYC_PARSE_BEGIN_AT_CONTENT) - return PSYC_PARSE_ERROR_INVALID_FLAGS; - size_t remaining = *length - *parsed; value->ptr = state->buffer.ptr + state->cursor; @@ -300,8 +296,13 @@ psycParseRC psyc_parse(psycParseState* state, char* oper, psycString* name, psyc { // If we need to parse the header only and we know the content length, // then skip content parsing. - if (state->flags & PSYC_PARSE_HEADER_ONLY && state->contentLengthFound) + if (state->flags & PSYC_PARSE_HEADER_ONLY) + { state->part = PSYC_PART_DATA; + if (++(state->cursor) >= state->buffer.length) + return PSYC_PARSE_INSUFFICIENT; + goto PSYC_PART_DATA; + } else state->part = PSYC_PART_CONTENT; } @@ -397,6 +398,7 @@ psycParseRC psyc_parse(psycParseState* state, char* oper, psycString* name, psyc } case PSYC_PART_DATA: + PSYC_PART_DATA: value->ptr = state->buffer.ptr + state->cursor; value->length = 0; diff --git a/test/testParser.c b/test/testParser.c index fc30905..662ba77 100644 --- a/test/testParser.c +++ b/test/testParser.c @@ -7,7 +7,7 @@ int main(int argc, char **argv) { - int idx, ret, verbose = argc > 2; + int idx, ret, header_only = argc > 2, verbose = argc > 3; char buffer[2048], oper; psycString name, value, elem; psycParseState state; @@ -23,14 +23,23 @@ int main(int argc, char **argv) write(1, buffer, idx); write(1, ">> PARSE\n", 9); } - psyc_initParseState(&state); + if (header_only) + psyc_initParseState2(&state, PSYC_PARSE_HEADER_ONLY); + else + psyc_initParseState(&state); psyc_nextParseBuffer(&state, psyc_newString(buffer, idx)); // try parsing that now // while ((ret = psyc_parse(&state, &oper, &name, &value))) // { do { + oper = 0; + name.length = 0; + value.length = 0; + ret = psyc_parse(&state, &oper, &name, &value); + if (verbose) + printf(">> ret = %d\n", ret); switch (ret) { case PSYC_PARSE_ROUTING: