diff options
-rw-r--r-- | includes/dt_util.h | 6 | ||||
-rw-r--r-- | modules/devices/devicetree/dt_util.c | 41 |
2 files changed, 29 insertions, 18 deletions
diff --git a/includes/dt_util.h b/includes/dt_util.h index bf56c293..4bd72133 100644 --- a/includes/dt_util.h +++ b/includes/dt_util.h @@ -72,4 +72,10 @@ char *dtr_maps_info(dtr *); /* returns hardinfo shell section */ const char *dtr_find_device_tree_root(void); +#define sp_sep(STR) (strlen(STR) ? " " : "") +/* appends an element to a string, adding a space if + * the string is not empty. + * ex: ret = appf(ret, "%s=%s\n", name, value); */ +char *appf(char *src, char *fmt, ...); + #endif 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; +} + |