mrpd: parse module, add len to parameter list and add 04x format
authorAndrew Elder <aelder@audioscience.com>
Fri, 28 Sep 2012 14:36:39 +0000 (10:36 -0400)
committerAndrew Elder <aelder@audioscience.com>
Fri, 5 Oct 2012 10:48:14 +0000 (06:48 -0400)
daemons/common/parse.c
daemons/common/parse.h

index b001157..24b752f 100644 (file)
 
 #include "parse.h"
 
-int parse(const char *s, struct parse_param *specs, int *err_index)
+int parse(char *s, int len, struct parse_param *specs, int *err_index)
 {
        int err = 0;
        char *param;
        char *data;
        char *delimiter;
-       char *guard;
-       int v_int;
+       const char *guard;
        unsigned int v_uint;
        uint64_t v_uint64;
        int result;
        int count = 0;
 
+       /* make sure string is null terminated */
+       s[len-1] = 0;
        guard = s + strlen(s);
 
        while (specs->name && !err) {
                param = strstr(s, specs->name);
+               if (NULL == param) {
+                       *err_index = count + 1;
+                       return -1;
+               }
                data = param + strlen(specs->name);
 
                /* temporarily terminate string at next delimiter */
                delimiter = data;
                while ((*delimiter != PARSE_DELIMITER) && (delimiter < guard))
-                       *delimiter++;
+                       delimiter++;
                if (delimiter < guard)
                        *delimiter = 0;
 
@@ -71,6 +76,12 @@ int parse(const char *s, struct parse_param *specs, int *err_index)
                        if (result == 1)
                                *(uint8_t *) specs->v = (uint8_t) v_uint;
                        break;
+               case parse_u16_04x:
+                       result = sscanf(data, "%04x", &v_uint);
+                       if (result == 1)
+                               *(uint16_t *) specs->v = (uint16_t) v_uint;
+                       break;
+                       break;
                case parse_u16:
                        result = sscanf(data, "%d", &v_uint);
                        if (result == 1)
@@ -121,8 +132,10 @@ int parse(const char *s, struct parse_param *specs, int *err_index)
                        return -1;
                }
 
-               if (delimiter < guard)
+               if (delimiter < guard) {
+                       *delimiter = PARSE_DELIMITER;
                        s = delimiter + 1;
+               }
                specs++;
                count++;
        }
index 740c45d..d808886 100644 (file)
@@ -37,6 +37,7 @@ enum parse_types {
        parse_null,
        parse_u8,       /* uint8_t v */
        parse_u16,      /* uint16_t v */
+       parse_u16_04x,  /* uint16_t v as 0002 (hex string of 4 digits) */
        parse_u32,      /* uint32_t v */
        parse_u64,      /* uint64_t v */
        parse_h64,      /* uint64_t v */
@@ -53,6 +54,6 @@ struct parse_param {
        void *v;
 };
 
-int parse(const char *s, struct parse_param *specs, int *err_index);
+int parse(char *s, int len, struct parse_param *specs, int *err_index);
 
 #endif                         /* PARSE_H_ */