Index: trunk/ippTools/src/pxtree.c
===================================================================
--- trunk/ippTools/src/pxtree.c	(revision 14489)
+++ trunk/ippTools/src/pxtree.c	(revision 14494)
@@ -57,2 +57,39 @@
     return node;
 }
+
+
+void pxNodePrint(FILE *stream, pxNode *node)
+{
+    fprintf(stream, "node name: %s\n", node->name);
+    fprintf(stream, "node parent's name: %s\n", node->parent
+                                              ?  node->parent->name
+                                              : NULL);
+    psListIterator *iter = psListIteratorAlloc(node->children, 0, false);                                          
+    pxNode *child = NULL;
+    while ((child = psListGetAndIncrement(iter))) {
+        fprintf(stream, "node child's name: %s\n", child->name);
+    }
+    psFree(iter);
+}
+
+
+bool pxTreeCrawl(pxNode *node, pxNodeFunc func)
+{
+    // if func() returns false, stop
+    if (!func(node)) {
+        return false;
+    }
+
+    psListIterator *iter = psListIteratorAlloc(node->children, 0, false);                                          
+    pxNode *child = NULL;
+    while ((child = psListGetAndIncrement(iter))) {
+        // if func() returns false, pxTreeCrawl() well return false, and we
+        // should stop
+        if (!pxTreeCrawl(child, func)) {
+            return false;
+        }
+    }
+    psFree(iter);
+
+    return true;
+}
