Parse key/value message, extracting the values of its keys.
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.info>
Fri, 14 Jun 2013 11:45:33 +0000 (08:45 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.info>
Fri, 14 Jun 2013 11:45:33 +0000 (08:45 -0300)
rnet_message.c
rnet_message.h

index e9a6345..52edf14 100644 (file)
@@ -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;
+}
index 9fef77a..7e82e80 100644 (file)
@@ -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