diff --git a/tests/label01.dts b/tests/label01.dts index ad1f1e4..372b17a 100644 --- a/tests/label01.dts +++ b/tests/label01.dts @@ -36,10 +36,11 @@ memrsv2: /memreserve/ 2000000000000000-20ffffffffffffff; }; node: randomnode { - prop: string = data: "\xff\0stuffstuff\t\t\t\n\n\n" data_end: ; - blob = [byte: 0a 0b 0c 0d de ea ad be ef byte_end: ]; - ref = < cell: &/memory@0 cell_end: >; + prop: string = str: "foo", str_mid: "stuffstuff\t\t\t\n\n\n" str_end: ; + blob = [byte: 0a 0b 0c 0d byte_mid: de ea ad be ef byte_end: ]; + ref = < cell: &/memory@0 0 cell_mid: ffffffff cell_end: >; mixed = "abc", pre: [1234] post: , gap: < aligned: a b c>; + tricky1 = [61 lt1: 62 63 00]; subnode: child { }; /* subnode_end: is auto-generated by node emit */ diff --git a/treesource.c b/treesource.c index 0a4367a..0752280 100644 --- a/treesource.c +++ b/treesource.c @@ -60,13 +60,24 @@ static void write_propval_string(FILE *f, struct data val) { char *str = val.val; int i; + int newchunk = 1; + struct fixup *l = val.labels; assert(str[val.len-1] == '\0'); - fprintf(f, "\""); for (i = 0; i < (val.len-1); i++) { char c = str[i]; + if (newchunk) { + while (l && (l->offset <= i)) { + assert(l->offset == i); + fprintf(f, "%s: ", l->ref); + l = l->next; + } + fprintf(f, "\""); + newchunk = 0; + } + switch (c) { case '\a': fprintf(f, "\\a"); @@ -96,7 +107,8 @@ static void write_propval_string(FILE *f, struct data val) fprintf(f, "\\\""); break; case '\0': - fprintf(f, "\", \""); + fprintf(f, "\", "); + newchunk = 1; break; default: if (isprint(c)) @@ -106,20 +118,41 @@ static void write_propval_string(FILE *f, struct data val) } } fprintf(f, "\""); + + /* Wrap up any labels at the end of the value */ + while (l) { + assert (l->offset == val.len); + fprintf(f, " %s:", l->ref); + l = l->next; + } } static void write_propval_cells(FILE *f, struct data val) { void *propend = val.val + val.len; cell_t *cp = (cell_t *)val.val; + struct fixup *l = val.labels; fprintf(f, "<"); for (;;) { + while (l && (l->offset <= ((char *)cp - val.val))) { + assert(l->offset == ((char *)cp - val.val)); + fprintf(f, "%s: ", l->ref); + l = l->next; + } + fprintf(f, "%x", be32_to_cpu(*cp++)); if ((void *)cp >= propend) break; fprintf(f, " "); } + + /* Wrap up any labels at the end of the value */ + while (l) { + assert (l->offset == val.len); + fprintf(f, " %s:", l->ref); + l = l->next; + } fprintf(f, ">"); } @@ -127,14 +160,27 @@ static void write_propval_bytes(FILE *f, struct data val) { void *propend = val.val + val.len; char *bp = val.val; + struct fixup *l = val.labels; fprintf(f, "["); for (;;) { + while (l && (l->offset == (bp-val.val))) { + fprintf(f, "%s: ", l->ref); + l = l->next; + } + fprintf(f, "%02hhx", *bp++); if ((void *)bp >= propend) break; fprintf(f, " "); } + + /* Wrap up any labels at the end of the value */ + while (l) { + assert (l->offset == val.len); + fprintf(f, " %s:", l->ref); + l = l->next; + } fprintf(f, "]"); } @@ -142,7 +188,9 @@ static void write_propval(FILE *f, struct property *prop) { int len = prop->val.len; char *p = prop->val.val; + struct fixup *l; int nnotstring = 0, nnul = 0; + int nnotstringlbl = 0, nnotcelllbl = 0; int i; if (len == 0) { @@ -157,15 +205,23 @@ static void write_propval(FILE *f, struct property *prop) nnul++; } - fprintf(f, " = "); + for (l = prop->val.labels; l; l = l->next) { + if ((l->offset > 0) && (prop->val.val[l->offset - 1] != '\0')) + nnotstringlbl++; + if ((l->offset % sizeof(cell_t)) != 0) + nnotcelllbl++; + } - if ((p[len-1] == '\0') && (nnotstring == 0) && (nnul < (len-nnul))) { + fprintf(f, " = "); + if ((p[len-1] == '\0') && (nnotstring == 0) && (nnul < (len-nnul)) + && (nnotstringlbl == 0)) { write_propval_string(f, prop->val); - } else if (((len % sizeof(cell_t)) == 0)) { + } else if (((len % sizeof(cell_t)) == 0) && (nnotcelllbl == 0)) { write_propval_cells(f, prop->val); } else { write_propval_bytes(f, prop->val); } + fprintf(f, ";\n"); }