summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorBurt P <pburt0@gmail.com>2017-07-19 20:46:36 -0500
committerLeandro A. F. Pereira <leandro@hardinfo.org>2017-07-21 05:14:20 -0700
commitcb445b8b1458cc2e2e09bfe6b4f999f3ed8b684d (patch)
tree74d0d166ad56a6647c990b7232bda24920da95f7 /modules
parentf843ee52fe2c230083a63a262ec120c94f97203a (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.c41
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;
+}
+