return 0;
} /* int parse_value */
-int parse_values(char *buffer, value_list_t *vl, const data_set_t *ds) {
- size_t i;
- char *dummy;
- char *ptr;
- char *saveptr;
-
- if ((buffer == NULL) || (vl == NULL) || (ds == NULL))
+int parse_values(char const *s, value_list_t *vl, const data_set_t *ds) {
+ if ((s == NULL) || (vl == NULL) || (ds == NULL))
return EINVAL;
- i = 0;
- dummy = buffer;
- saveptr = NULL;
+ char *buffer = sstrdup(s);
+
+ size_t i = 0;
+ char *dummy = buffer;
+ char *saveptr = NULL;
vl->time = 0;
+
+ char *ptr;
while ((ptr = strtok_r(dummy, ":", &saveptr)) != NULL) {
dummy = NULL;
errno = 0;
tmp = strtod(ptr, &endptr);
- if ((errno != 0) /* Overflow */
- || (endptr == ptr) /* Invalid string */
- || (endptr == NULL) /* This should not happen */
- || (*endptr != 0)) /* Trailing chars */
+ if ((errno != 0) /* Overflow */
+ || (endptr == ptr) /* Invalid string */
+ || (endptr == NULL) /* This should not happen */
+ || (*endptr != 0)) { /* Trailing chars */
+ sfree(buffer);
return -1;
+ }
vl->time = DOUBLE_TO_CDTIME_T(tmp);
}
continue;
}
- if ((strcmp("U", ptr) == 0) && (ds->ds[i].type == DS_TYPE_GAUGE))
+ if ((strcmp("U", ptr) == 0) && (ds->ds[i].type == DS_TYPE_GAUGE)) {
vl->values[i].gauge = NAN;
- else if (0 != parse_value(ptr, &vl->values[i], ds->ds[i].type))
+ } else if (0 != parse_value(ptr, &vl->values[i], ds->ds[i].type)) {
+ sfree(buffer);
return -1;
+ }
i++;
} /* while (strtok_r) */
- if ((ptr != NULL) || (i == 0))
+ sfree(buffer);
+ if ((ptr != NULL) || (i == 0)) {
return -1;
+ }
return 0;
} /* int parse_values */
char **ret_type_instance, char *default_host);
int parse_identifier_vl(const char *str, value_list_t *vl);
int parse_value(const char *value, value_t *ret_value, int ds_type);
-int parse_values(char *buffer, value_list_t *vl, const data_set_t *ds);
+int parse_values(char const *s, value_list_t *vl, const data_set_t *ds);
/* parse_value_file reads "path" and parses its content as an integer or
* floating point, depending on "ds_type". On success, the value is stored in
.meta = NULL,
};
+ size_t buf_sz = strlen(cases[i].buffer)+1;
+ char buf[buf_sz];
+ strncpy(buf, cases[i].buffer, buf_sz);
+
int status = parse_values(cases[i].buffer, &vl, &ds);
EXPECT_EQ_INT(cases[i].status, status);
+
+ /* Ensure cases[i].buffer remains unmodified. */
+ EXPECT_EQ_STR(buf, cases[i].buffer);
+
if (status != 0)
continue;