On Wed, Mar 21, 2018 at 11:45:30AM +0800, Grant Likely wrote: > 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> Apart from seconding the suggestion to change the new marker names, Reviewed-by: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx> > --- > 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; -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
Attachment:
signature.asc
Description: PGP signature