Skip to content

Commit

Permalink
treesource: Restore string list output when no type markers
Browse files Browse the repository at this point in the history
When the DTS output has no type markers, we have to guess the type. Prior
to commit 32b9c61 ("Preserve datatype markers when emitting dts
format"), instances of string lists would be delimited. Since then, a
single string with embedded "\0"s are emitted. An embedded "\0" is valid
for DTS files, but that's a rare exception and lists of strings are the
overwhelming majority. Restore the prior behavior.

stringlist.dts is reused for testing this, but needs a couple of tweaks
in order to match the dts output.

Reported-by: Geert Uytterhoeven <[email protected]>
Signed-off-by: Rob Herring <[email protected]>
Message-ID: <[email protected]>
Signed-off-by: David Gibson <[email protected]>
  • Loading branch information
robherring authored and dgibson committed Nov 4, 2023
1 parent 2283dd7 commit 95c74d7
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 2 deletions.
4 changes: 4 additions & 0 deletions tests/run_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -634,6 +634,10 @@ dtc_tests () {
done

# Check -Odts preserving type information
run_dtc_test -I dts -O dtb -o stringlist.test.dtb "$SRCDIR/stringlist.dts"
run_dtc_test -I dtb -O dts -o stringlist.test.dts stringlist.test.dtb
run_wrap_test cmp "$SRCDIR/stringlist.dts" stringlist.test.dts

for tree in type-preservation.dts; do
run_dtc_test -I dts -O dts -o $tree.test.dts "$SRCDIR/$tree"
run_dtc_test -I dts -O dts $tree.test.dts
Expand Down
4 changes: 2 additions & 2 deletions tests/stringlist.dts
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

/ {
compatible = "test-strings";
#address-cells = <2>;
#size-cells = <2>;
#address-cells = <0x02>;
#size-cells = <0x02>;

device {
compatible = "foo", "bar";
Expand Down
24 changes: 24 additions & 0 deletions treesource.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,28 @@ static const char *delim_end[] = {
[TYPE_STRING] = "",
};

static void add_string_markers(struct property *prop)
{
int l, len = prop->val.len;
const char *p = prop->val.val;

for (l = strlen(p) + 1; l < len; l += strlen(p + l) + 1) {
struct marker *m, **nextp;

m = xmalloc(sizeof(*m));
m->offset = l;
m->type = TYPE_STRING;
m->ref = NULL;
m->next = NULL;

/* Find the end of the markerlist */
nextp = &prop->val.markers;
while (*nextp)
nextp = &((*nextp)->next);
*nextp = m;
}
}

static enum markertype guess_value_type(struct property *prop)
{
int len = prop->val.len;
Expand All @@ -164,6 +186,8 @@ static enum markertype guess_value_type(struct property *prop)

if ((p[len-1] == '\0') && (nnotstring == 0) && (nnul <= (len-nnul))
&& (nnotstringlbl == 0)) {
if (nnul > 1)
add_string_markers(prop);
return TYPE_STRING;
} else if (((len % sizeof(cell_t)) == 0) && (nnotcelllbl == 0)) {
return TYPE_UINT32;
Expand Down

0 comments on commit 95c74d7

Please sign in to comment.