diff options
author | Burt P <pburt0@gmail.com> | 2017-07-19 20:46:36 -0500 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2017-07-21 05:14:20 -0700 |
commit | cb445b8b1458cc2e2e09bfe6b4f999f3ed8b684d (patch) | |
tree | 74d0d166ad56a6647c990b7232bda24920da95f7 /modules | |
parent | f843ee52fe2c230083a63a262ec120c94f97203a (diff) |
device tree: add helper function for appending elements
Cleans up code for lists of mixed-type elements.
appf() is like h_strdup_cprintf() but with a cute name,
logical param order and adds a space when the string is
not empty.
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'modules')
-rw-r--r-- | modules/devices/devicetree/dt_util.c | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/modules/devices/devicetree/dt_util.c b/modules/devices/devicetree/dt_util.c index 845ea8da..f5b791e6 100644 --- a/modules/devices/devicetree/dt_util.c +++ b/modules/devices/devicetree/dt_util.c @@ -551,34 +551,25 @@ char *dtr_list_str0(const char *data, uint32_t length) { char *dtr_list_override(dtr_obj *obj) { /* <phref, string "property:value"> ... */ - char *tmp, *ret; + char *ret = NULL; char *ph, *str; char *src; int l, consumed = 0; - ret = strdup(""); src = obj->data_str; while (consumed + 5 <= obj->length) { ph = dtr_elem_phref(obj->dt, *(dt_uint*)src, 1); src += 4; consumed += 4; l = strlen(src) + 1; /* consume the null */ str = dtr_list_str0(src, l); - tmp = g_strdup_printf("%s%s<%s -> %s>", - ret, strlen(ret) ? " " : "", - ph, str); + ret = appf(ret, "<%s -> %s>", ph, str); src += l; consumed += l; free(ph); free(str); - free(ret); - ret = tmp; } if (consumed < obj->length) { str = dtr_list_byte(src, obj->length - consumed); - tmp = g_strdup_printf("%s%s%s", - ret, strlen(ret) ? " " : "", - str); + ret = appf(ret, "%s", str); free(str); - free(ret); - ret = tmp; } return ret; } @@ -599,8 +590,7 @@ char *dtr_list_phref(dtr_obj *obj, char *ext_cell_prop) { int count = obj->length / 4; int i = 0, ext_cells = 0; char *ph_path; - char *ph, *ext, *tmp, *ret; - ret = g_strdup(""); + char *ph, *ext, *ret = NULL; while (i < count) { if (ext_cell_prop == NULL) ext_cells = 0; @@ -609,13 +599,10 @@ char *dtr_list_phref(dtr_obj *obj, char *ext_cell_prop) { ph = dtr_elem_phref(obj->dt, obj->data_int[i], 0); i++; if (ext_cells > count - i) ext_cells = count - i; ext = dtr_list_hex((obj->data_int + i), ext_cells); i+=ext_cells; - tmp = g_strdup_printf("%s%s<%s%s%s>", - ret, strlen(ret) ? ", " : "", + ret = appf(ret, "<%s%s%s>", ph, (ext_cells) ? " " : "", ext); - g_free(ret); g_free(ph); g_free(ext); - ret = tmp; } return ret; } @@ -826,3 +813,21 @@ char *dtr_maps_info(dtr *s) { return ret; } +char *appf(char *src, char *fmt, ...) { + gchar *buf, *ret; + va_list args; + + va_start(args, fmt); + buf = g_strdup_vprintf(fmt, args); + va_end(args); + + if (src != NULL) { + ret = g_strdup_printf("%s%s%s", src, sp_sep(src), buf); + g_free(buf); + g_free(src); + } else + ret = buf; + + return ret; +} + |