From e2130b3eeecfd53b58cc3f1d5618cd9b93b95944 Mon Sep 17 00:00:00 2001 From: "tg(x)" <*@tg-x.net> Date: Wed, 9 Nov 2011 19:02:21 +0100 Subject: [PATCH] added support for state sync/reset packets --- src/match.c | 1 - src/packet.c | 6 +++--- src/parse.c | 22 ++++++++++++---------- src/render.c | 25 +++++++++++++------------ src/uniform.c | 2 +- test/packets/00-no-body | 6 ++++++ test/packets/00-state-reset | 7 +++++++ test/packets/00-state-sync | 5 +++++ 8 files changed, 47 insertions(+), 27 deletions(-) create mode 100644 test/packets/00-no-body create mode 100644 test/packets/00-state-reset create mode 100644 test/packets/00-state-sync diff --git a/src/match.c b/src/match.c index de34c1f..56ec8ce 100644 --- a/src/match.c +++ b/src/match.c @@ -109,7 +109,6 @@ void * psyc_dict_lookup (const PsycDict *dict, size_t size, { size_t cursor = 1; uint8_t i, m = 0; - //memset(&matching, -1, sizeof matching); if (keylen < 2 || key[0] != '_') return 0; diff --git a/src/packet.c b/src/packet.c index 9862be6..8b305b6 100644 --- a/src/packet.c +++ b/src/packet.c @@ -63,9 +63,9 @@ void psyc_list_init (PsycList *list, PsycString *elems, size_t num_elems, inline size_t psyc_modifier_length (PsycModifier *m) { - size_t length = 1 + // oper - m->name.length + 1 + // name\t - m->value.length + 1; // value\n + size_t length = 2; // oper\n + if (m->name.length > 0) + length += m->name.length + 1 + m->value.length; // name\tvalue if (m->flag == PSYC_MODIFIER_NEED_LENGTH) // add length of length if needed length += psyc_num_length(m->value.length) + 1; // SP length diff --git a/src/parse.c b/src/parse.c index 42459e3..fef2429 100644 --- a/src/parse.c +++ b/src/parse.c @@ -21,7 +21,7 @@ typedef enum { PARSE_INSUFFICIENT = 1, PARSE_COMPLETE = 100, PARSE_INCOMPLETE = 101, -} parseRC; +} ParseRC; /** * Parse variable name or method name. @@ -29,7 +29,7 @@ typedef enum { * @return PARSE_ERROR or PARSE_SUCCESS */ static inline -parseRC psyc_parse_keyword (PsycParseState *state, PsycString *name) +ParseRC psyc_parse_keyword (PsycParseState *state, PsycString *name) { name->data = state->buffer.data + state->cursor; name->length = 0; @@ -54,8 +54,8 @@ parseRC psyc_parse_keyword (PsycParseState *state, PsycString *name) * @return PARSE_COMPLETE or PARSE_INCOMPLETE */ static inline -parseRC psyc_parse_binary_value (PsycParseState *state, PsycString *value, - size_t *length, size_t *parsed) +ParseRC psyc_parse_binary_value (PsycParseState *state, PsycString *value, + size_t *length, size_t *parsed) { size_t remaining = *length - *parsed; value->data = state->buffer.data + state->cursor; @@ -81,13 +81,16 @@ parseRC psyc_parse_binary_value (PsycParseState *state, PsycString *value, * @return PARSE_ERROR or PARSE_SUCCESS */ static inline -parseRC psyc_parse_modifier (PsycParseState *state, char *oper, - PsycString *name, PsycString *value) +ParseRC psyc_parse_modifier (PsycParseState *state, char *oper, + PsycString *name, PsycString *value) { *oper = *(state->buffer.data + state->cursor); ADVANCE_CURSOR_OR_RETURN(PSYC_PARSE_INSUFFICIENT); - parseRC ret = psyc_parse_keyword(state, name); + if (state->part == PSYC_PART_CONTENT && state->buffer.data[state->cursor] == '\n') + return PARSE_SUCCESS; // only oper is present, used for state sync/reset + + ParseRC ret = psyc_parse_keyword(state, name); if (ret == PARSE_ERROR) return PSYC_PARSE_ERROR_MOD_NAME; else if (ret != PARSE_SUCCESS) @@ -162,7 +165,7 @@ PsycParseRC psyc_parse (PsycParseState *state, char *oper, PP(("Invalid flag combination")) #endif - parseRC ret; // a return value + ParseRC ret; // a return value size_t pos = state->cursor; // a cursor position // Start position of the current line in the buffer @@ -326,8 +329,6 @@ PsycParseRC psyc_parse (PsycParseState *state, char *oper, { ADVANCE_CURSOR_OR_RETURN(PSYC_PARSE_INSUFFICIENT); } - - // fall thru } else // No method, which means the packet should end now. { @@ -335,6 +336,7 @@ PsycParseRC psyc_parse (PsycParseState *state, char *oper, state->startc = state->cursor; goto PSYC_PART_END; } + // fall thru case PSYC_PART_DATA: PSYC_PART_DATA: diff --git a/src/render.c b/src/render.c index 68f2fd9..bd26745 100644 --- a/src/render.c +++ b/src/render.c @@ -46,24 +46,25 @@ static inline size_t psyc_render_modifier (PsycModifier *mod, char *buffer) { size_t cur = 0; - buffer[cur++] = mod->oper; - memcpy(buffer + cur, mod->name.data, mod->name.length); - cur += mod->name.length; - if (cur <= 1) - return cur; // error, name can't be empty - if (mod->flag == PSYC_MODIFIER_NEED_LENGTH) + if (mod->name.length > 0) { - buffer[cur++] = ' '; - cur += itoa(mod->value.length, buffer + cur, 10); + memcpy(buffer + cur, mod->name.data, mod->name.length); + cur += mod->name.length; + + if (mod->flag == PSYC_MODIFIER_NEED_LENGTH) + { + buffer[cur++] = ' '; + cur += itoa(mod->value.length, buffer + cur, 10); + } + + buffer[cur++] = '\t'; + memcpy(buffer + cur, mod->value.data, mod->value.length); + cur += mod->value.length; } - buffer[cur++] = '\t'; - memcpy(buffer + cur, mod->value.data, mod->value.length); - cur += mod->value.length; buffer[cur++] = '\n'; - return cur; } diff --git a/src/uniform.c b/src/uniform.c index d888423..74c3098 100644 --- a/src/uniform.c +++ b/src/uniform.c @@ -77,7 +77,7 @@ int psyc_uniform_parse (PsycUniform *uni, char *str, size_t length) break; case PSYC_UNIFORM_PORT: - if (psyc_is_numeric(c)) { + if (psyc_is_numeric(c) || (uni->port.length == 0 && c == '-')) { uni->port.length++; break; } diff --git a/test/packets/00-no-body b/test/packets/00-no-body new file mode 100644 index 0000000..a3c91ea --- /dev/null +++ b/test/packets/00-no-body @@ -0,0 +1,6 @@ +:_source psyc://foo.example.com/ +:_target psyc://bar.example.com/ + +:_foo bar +:_baz qux +| diff --git a/test/packets/00-state-reset b/test/packets/00-state-reset new file mode 100644 index 0000000..eca0239 --- /dev/null +++ b/test/packets/00-state-reset @@ -0,0 +1,7 @@ +:_source psyc://foo.example.com/ +:_target psyc://bar.example.com/ + += +=_foo bar +=_baz qux +| diff --git a/test/packets/00-state-sync b/test/packets/00-state-sync new file mode 100644 index 0000000..8c59a25 --- /dev/null +++ b/test/packets/00-state-sync @@ -0,0 +1,5 @@ +:_source psyc://foo.example.com/ +:_target psyc://bar.example.com/ + +? +|