aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/type-preservation.dts4
-rw-r--r--treesource.c45
2 files changed, 20 insertions, 29 deletions
diff --git a/tests/type-preservation.dts b/tests/type-preservation.dts
index 06d5778..3e380ba 100644
--- a/tests/type-preservation.dts
+++ b/tests/type-preservation.dts
@@ -9,12 +9,12 @@
reg = <0x01>;
int-array = <0x00 0x01>, int_value_label: <0x02 0x03>;
int8 = [56];
- int8-array = [00 12 34 56 label:];
+ int8-array = [00 12 34 56] label:;
int16 = /bits/ 16 <0x3210>;
int16-array = /bits/ 16 <0x1234 0x5678 0x90ab 0xcdef>;
int16-matrix = /bits/ 16 <0x1234 0x5678>, <0x90ab 0xcdef>;
int64 = /bits/ 64 <0x200000000>;
- int64-array = /bits/ 64 <0x100000000 0x00 int64_array_label_end:>;
+ int64-array = /bits/ 64 <0x100000000 0x00> int64_array_label_end:;
a-string-with-nulls = "foo\0bar", "baz";
subsub1: subsubnode {
diff --git a/treesource.c b/treesource.c
index 28cd135..c1fdb86 100644
--- a/treesource.c
+++ b/treesource.c
@@ -216,7 +216,7 @@ static void write_propval(FILE *f, struct property *prop)
return;
}
- fprintf(f, " = ");
+ fprintf(f, " =");
if (!next_type_marker(m)) {
/* data type information missing, need to guess */
@@ -227,32 +227,23 @@ static void write_propval(FILE *f, struct property *prop)
m = &dummy_marker;
}
- struct marker *m_label = prop->val.markers;
for_each_marker(m) {
- size_t chunk_len;
+ size_t chunk_len = (m->next ? m->next->offset : len) - m->offset;
+ size_t data_len = type_marker_length(m) ? : len - m->offset;
const char *p = &prop->val.val[m->offset];
- if (!has_data_type_information(m))
- continue;
-
- chunk_len = type_marker_length(m);
- if (!chunk_len)
- chunk_len = len - m->offset;
-
- if (emit_type != TYPE_NONE)
- fprintf(f, "%s, ", delim_end[emit_type]);
- emit_type = m->type;
-
- for_each_marker_of_type(m_label, LABEL) {
- if (m_label->offset > m->offset)
- break;
- fprintf(f, "%s: ", m_label->ref);
+ if (has_data_type_information(m)) {
+ emit_type = m->type;
+ fprintf(f, " %s", delim_start[emit_type]);
}
- fprintf(f, "%s", delim_start[emit_type]);
+ if (m->type == LABEL)
+ fprintf(f, " %s:", m->ref);
- if (chunk_len <= 0)
+ if (emit_type == TYPE_NONE) {
+ assert(chunk_len == 0);
continue;
+ }
switch(emit_type) {
case TYPE_UINT16:
@@ -270,15 +261,15 @@ static void write_propval(FILE *f, struct property *prop)
default:
write_propval_int(f, p, chunk_len, 1);
}
- }
- /* Wrap up any labels at the end of the value */
- for_each_marker_of_type(m_label, LABEL) {
- assert (m_label->offset == len);
- fprintf(f, " %s:", m_label->ref);
+ if (chunk_len == data_len) {
+ size_t pos = m->offset + chunk_len;
+ fprintf(f, pos == len ? "%s" : "%s,",
+ delim_end[emit_type] ? : "");
+ emit_type = TYPE_NONE;
+ }
}
-
- fprintf(f, "%s;\n", delim_end[emit_type] ? : "");
+ fprintf(f, ";\n");
}
static void write_tree_source_node(FILE *f, struct node *tree, int level)