/* Parse a string for summary fields. Separator is usually '\n' or ',' */ struct rmsummary *rmsummary_parse_from_str(const char *buffer, const char separator) { char key[MAX_LINE], value[MAX_LINE]; char *token, *saveptr; if(!buffer) return NULL; // strtok does not work with const char. char *buffer_copy = xxstrdup(buffer); const char delim[] = { separator, '\n', '\0'}; struct rmsummary *s = make_rmsummary(-1); /* if source have no last_error, we do not want the -1 from above */ s->last_error = 0; token = strtok_r(buffer_copy, delim, &saveptr); while(token) { if(sscanf(token, "%[^:]:%*[ \t]%[^\n]", key, value) >= 2) { char *key_trim = string_trim_spaces(key); char *value_trim = string_trim_spaces(value); /* remove units if present */ if(strcmp("limits_exceeded", key_trim) != 0) { char *space = strchr(value_trim, ' '); if(space) *space = '\0'; } rmsummary_assign_field(s, key_trim, value_trim); } token = strtok_r(NULL, delim, &saveptr); } free(buffer_copy); return s; }
struct rmsummary *rmsummary_parse_single(char *buffer, char separator) { char key[MAX_LINE], value[MAX_LINE]; char *token, *saveptr; if(!buffer) return NULL; buffer = xxstrdup(buffer); const char delim[] = { separator, '\n', '\0'}; struct rmsummary *s = make_rmsummary(-1); token = strtok_r(buffer, delim, &saveptr); while(token) { if(sscanf(token, "%[^:]:%*[ \t]%[^\n]", key, value) >= 2) { char *key_trim = string_trim_spaces(key); char *value_trim = string_trim_spaces(value); /* remove units if present */ if(strcmp("limits_exceeded", key_trim) != 0) { char *space = strchr(value_trim, ' '); if(space) *space = '\0'; } rmsummary_assign_field(s, key_trim, value_trim); } token = strtok_r(NULL, delim, &saveptr); } free(buffer); return s; }