The current code throws away all the data type and grouping information when parsing the DTS source file, which makes it difficult to reconstruct the data format when emitting a format that can express data types (ie. dts and yaml). Use the marker structure to mark the beginning of each integer array block (<> and []), and the datatype contained in each (8, 16, 32 & 64 bit widths). Signed-off-by: Grant Likely <grant.likely@xxxxxxx> --- data.c | 4 +++- dtc-parser.y | 15 ++++++++++----- dtc.h | 7 +++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/data.c b/data.c index aa37a16..0aef0b5 100644 --- a/data.c +++ b/data.c @@ -74,7 +74,8 @@ struct data data_copy_escape_string(const char *s, int len) struct data d; char *q; - d = data_grow_for(empty_data, len + 1); + d = data_add_marker(empty_data, MARKER_STRING, NULL); + d = data_grow_for(d, len + 1); q = d.val; while (i < len) { @@ -94,6 +95,7 @@ struct data data_copy_file(FILE *f, size_t maxlen) { struct data d = empty_data; + d = data_add_marker(d, MARKER_BLOB, NULL); while (!feof(f) && (d.len < maxlen)) { size_t chunksize, ret; diff --git a/dtc-parser.y b/dtc-parser.y index affc81a..6cd15f6 100644 --- a/dtc-parser.y +++ b/dtc-parser.y @@ -322,22 +322,27 @@ arrayprefix: DT_BITS DT_LITERAL '<' { unsigned long long bits; + enum markertype type = MARKER_UINT32; bits = $2; - if ((bits != 8) && (bits != 16) && - (bits != 32) && (bits != 64)) { + switch (bits) { + case 8: type = MARKER_UINT8; break; + case 16: type = MARKER_UINT16; break; + case 32: type = MARKER_UINT32; break; + case 64: type = MARKER_UINT64; break; + default: ERROR(&@2, "Array elements must be" " 8, 16, 32 or 64-bits"); bits = 32; } - $$.data = empty_data; + $$.data = data_add_marker(empty_data, type, NULL); $$.bits = bits; } | '<' { - $$.data = empty_data; + $$.data = data_add_marker(empty_data, MARKER_UINT32, NULL); $$.bits = 32; } | arrayprefix integer_prim @@ -481,7 +486,7 @@ integer_unary: bytestring: /* empty */ { - $$ = empty_data; + $$ = data_add_marker(empty_data, MARKER_UINT8, NULL); } | bytestring DT_BYTE { diff --git a/dtc.h b/dtc.h index 760f9e3..8734f47 100644 --- a/dtc.h +++ b/dtc.h @@ -76,7 +76,14 @@ enum markertype { REF_PHANDLE, REF_PATH, LABEL, + MARKER_UINT8, + MARKER_UINT16, + MARKER_UINT32, + MARKER_UINT64, + MARKER_BLOB, + MARKER_STRING, }; +extern const char *markername(enum markertype markertype); struct marker { enum markertype type; -- 2.11.0 -- To unsubscribe from this list: send the line "unsubscribe devicetree-compiler" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html