diff options
author | David Gibson <david@gibson.dropbear.id.au> | 2008-02-12 11:58:31 +1100 |
---|---|---|
committer | Jon Loeliger <jdl@freescale.com> | 2008-02-12 09:11:40 -0600 |
commit | fc9769ac2bae8a32d5d277007d22414c4516b02b (patch) | |
tree | f59054c75a9397d6c2bd96653ac9a417e0d27e1f /libfdt/fdt.c | |
parent | 202863e4dd681d17c06a82943f49485bf7860633 (diff) | |
download | dtc-fc9769ac2bae8a32d5d277007d22414c4516b02b.zip dtc-fc9769ac2bae8a32d5d277007d22414c4516b02b.tar.gz dtc-fc9769ac2bae8a32d5d277007d22414c4516b02b.tar.bz2 |
libfdt: Add and use a node iteration helper function.
This patch adds an fdt_next_node() function which can be used to
iterate through nodes of the tree while keeping track of depth. This
function is used to simplify the iteration code in a lot of other
functions, and is also exported for use by library users.
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'libfdt/fdt.c')
-rw-r--r-- | libfdt/fdt.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/libfdt/fdt.c b/libfdt/fdt.c index 586a361..c61fb53 100644 --- a/libfdt/fdt.c +++ b/libfdt/fdt.c @@ -129,6 +129,47 @@ uint32_t fdt_next_tag(const void *fdt, int offset, int *nextoffset) return tag; } +int fdt_next_node(const void *fdt, int offset, int *depth) +{ + int nextoffset = 0; + uint32_t tag; + + if (offset >= 0) { + tag = fdt_next_tag(fdt, offset, &nextoffset); + if (tag != FDT_BEGIN_NODE) + return -FDT_ERR_BADOFFSET; + } + + do { + offset = nextoffset; + tag = fdt_next_tag(fdt, offset, &nextoffset); + + switch (tag) { + case FDT_PROP: + case FDT_NOP: + break; + + case FDT_BEGIN_NODE: + if (depth) + (*depth)++; + break; + + case FDT_END_NODE: + if (depth) + (*depth)--; + break; + + case FDT_END: + return -FDT_ERR_NOTFOUND; + + default: + return -FDT_ERR_BADSTRUCTURE; + } + } while (tag != FDT_BEGIN_NODE); + + return offset; +} + const char *_fdt_find_string(const char *strtab, int tabsize, const char *s) { int len = strlen(s) + 1; |