From 74289592b74bb00b598bb88e4214aba8464decae Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Fri, 14 Jun 2013 08:45:33 -0300 Subject: [PATCH] Parse key/value message, extracting the values of its keys. --- rnet_message.c | 36 ++++++++++++++++++++++++++++++++++++ rnet_message.h | 3 +++ 2 files changed, 39 insertions(+) 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 -- 2.20.1