From: Thadeu Lima de Souza Cascardo Date: Fri, 14 Jun 2013 11:45:33 +0000 (-0300) Subject: Parse key/value message, extracting the values of its keys. X-Git-Tag: v0.1~4 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Flibreceita.git;a=commitdiff_plain;h=74289592b74bb00b598bb88e4214aba8464decae Parse key/value message, extracting the values of its keys. --- diff --git a/rnet_message.c b/rnet_message.c index e9a6345..52edf14 100644 --- a/rnet_message.c +++ b/rnet_message.c @@ -131,3 +131,39 @@ int rnet_message_add_buffer(struct rnet_message **msg, char *key, { return add_field(msg, key, strlen(key), buffer, len); } + +int rnet_message_parse(struct rnet_message *msg, char *skey, + char** value, int *vlen) +{ + char * buffer = msg->buffer; + size_t len = msg->len; + int i = 0; + unsigned int j; + int b; + char *key; + int klen; + char *kcopy; + /* skip first byte */ + i++; + while (i < len) { + j = buffer[i]; + b = j & 0x80; + if (b) + ; + j = j & 0x7f; + i++; + key = buffer + i; + klen = j; + i += j; + j = buffer[i]; + i++; + if (b) + j = j << 8 | buffer[i++]; + *value = buffer + i; + *vlen = j; + i += j; + if (strlen(skey) == klen && !strncasecmp(key, skey, klen)) + return 0; + } + return 1; +} diff --git a/rnet_message.h b/rnet_message.h index 9fef77a..7e82e80 100644 --- a/rnet_message.h +++ b/rnet_message.h @@ -40,4 +40,7 @@ int rnet_message_add_u64(struct rnet_message **msg, char *key, uint64_t val); int rnet_message_add_buffer(struct rnet_message **msg, char *key, char *buffer, size_t len); +int rnet_message_parse(struct rnet_message *msg, char *skey, + char** value, int *vlen); + #endif