htsmsg: add routine to convert a list to a CSV string
Note: this will not work with all lists, only lists of basic types.
This commit is contained in:
parent
251f5e8296
commit
dc598f8521
2 changed files with 44 additions and 0 deletions
43
src/htsmsg.c
43
src/htsmsg.c
|
@ -875,5 +875,48 @@ htsmsg_get_cdata(htsmsg_t *m, const char *field)
|
|||
return htsmsg_get_str_multi(m, field, "cdata", NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert list to CSV string
|
||||
*
|
||||
* Note: this will NOT work for lists of complex types
|
||||
*/
|
||||
char *
|
||||
htsmsg_list_2_csv(htsmsg_t *m)
|
||||
{
|
||||
int alloc, used, first = 1;
|
||||
char *ret;
|
||||
htsmsg_field_t *f;
|
||||
const char *sep = ", ";
|
||||
if (!m->hm_islist) return NULL;
|
||||
|
||||
#define MAX(a,b) ((a) < (b)) ? (a) : (b)
|
||||
#define REALLOC(l)\
|
||||
if ((alloc - used) < l) {\
|
||||
alloc = MAX((l)*2, alloc*2);\
|
||||
ret = realloc(ret, alloc);\
|
||||
}\
|
||||
|
||||
ret = malloc(alloc = 512);
|
||||
*ret = 0;
|
||||
used = 0;
|
||||
HTSMSG_FOREACH(f, m) {
|
||||
if (f->hmf_type == HMF_STR) {
|
||||
REALLOC(2 + strlen(f->hmf_str));
|
||||
used += sprintf(ret+used, "%s%s", !first ? sep : "", f->hmf_str);
|
||||
} else if (f->hmf_type == HMF_S64) {
|
||||
REALLOC(34); // max length is actually 20 chars + 2
|
||||
used += sprintf(ret+used, "%s%"PRId64, !first ? sep : "", f->hmf_s64);
|
||||
} else if (f->hmf_type == HMF_BOOL) {
|
||||
REALLOC(2); // max length is actually 20 chars + 2
|
||||
used += sprintf(ret+used, "%s%d", !first ? sep : "", f->hmf_bool);
|
||||
} else {
|
||||
// TODO: handle doubles
|
||||
free(ret);
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -351,3 +351,4 @@ htsmsg_t *htsmsg_get_map_by_field_if_name(htsmsg_field_t *f, const char *name);
|
|||
|
||||
const char *htsmsg_get_cdata(htsmsg_t *m, const char *field);
|
||||
|
||||
char *htsmsg_list_2_csv(htsmsg_t *m);
|
||||
|
|
Loading…
Add table
Reference in a new issue