This function requires a bit of typemap effort to get the depth parameter to work correctly. Add support for it, along with a test. Signed-off-by: Simon Glass <sjg@xxxxxxxxxxxx> --- Changes in v2: - Correct documentation for fdt_next_node() pylibfdt/libfdt.i | 33 +++++++++++++++++++++++++++++++++ tests/pylibfdt_tests.py | 18 ++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/pylibfdt/libfdt.i b/pylibfdt/libfdt.i index ab3b226..94c3d00 100644 --- a/pylibfdt/libfdt.i +++ b/pylibfdt/libfdt.i @@ -203,6 +203,25 @@ class Fdt: """ return bytearray(self._fdt) + def next_node(self, nodeoffset, depth, quiet=()): + """Find the next subnode + + Args: + nodeoffset: Node offset of previous node + depth: The depth of the node at nodeoffset. This is used to + calculate the depth of the returned node + quiet: Errors to ignore (empty to raise on all errors) + + Returns: + Typle: + Offset of the next node, if any, else a -ve error + Depth of the returned node, if any, else undefined + + Raises: + FdtException if no more nodes found or other error occurs + """ + return check_err(fdt_next_node(self._fdt, nodeoffset, depth), quiet) + def first_subnode(self, nodeoffset, quiet=()): """Find the first subnode of a parent node @@ -485,6 +504,7 @@ typedef int fdt32_t; fdt = fdt; /* avoid unused variable warning */ } +/* typemap used for fdt_get_property_by_offset() */ %typemap(out) (struct fdt_property *) { PyObject *buff; @@ -507,6 +527,19 @@ typedef int fdt32_t; $result = Py_BuildValue("s#", $1, *arg4); } +/* typemaps used for fdt_next_node() */ +%typemap(in, numinputs=1) int *depth (int depth) { + depth = (int) PyInt_AsLong($input); + $1 = &depth; +} + +%typemap(argout) int *depth { + PyObject *val = Py_BuildValue("i", *arg$argnum); + resultobj = SWIG_Python_AppendOutput(resultobj, val); +} + +%apply int *depth { int *depth }; + /* We have both struct fdt_property and a function fdt_property() */ %warnfilter(302) fdt_property; diff --git a/tests/pylibfdt_tests.py b/tests/pylibfdt_tests.py index c8c6da6..cd19fa7 100644 --- a/tests/pylibfdt_tests.py +++ b/tests/pylibfdt_tests.py @@ -221,6 +221,24 @@ class PyLibfdtTests(unittest.TestCase): self.assertEquals(libfdt.strerror(-libfdt.NOTFOUND), 'FDT_ERR_NOTFOUND') + def testNextNodeOffset(self): + """Check that we can walk through nodes""" + node_list = [] + node = 0 + depth = 0 + while depth >= 0: + node_list.append([depth, self.fdt.get_name(node)]) + node, depth = self.fdt.next_node(node, depth, (libfdt.BADOFFSET,)) + self.assertEquals(node_list, [ + [0, ''], + [1, 'subnode@1'], + [2, 'subsubnode'], + [2, 'ss1'], + [1, 'subnode@2'], + [2, 'subsubnode@0'], + [2, 'ss2'], + ]) + def testFirstNextSubnodeOffset(self): """Check that we can walk through subnodes""" node_list = [] -- 2.17.1.1185.g55be947832-goog -- 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