Re: [PATCH v2 1/2] Preserve datatype information when parsing dts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



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


[Index of Archives]     [Device Tree]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux