X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=parse-xml.c;h=eac05228f1448d8ad2478f4ef8907e3c3f63ff31;hb=c5de9e3e53800a63a035b511dad9c577925867a0;hp=efc7bb3569df0117bfec656c2739d283deb48c30;hpb=a997c6cf917d592722d9850bbf63437d4ba1487e;p=pspp diff --git a/parse-xml.c b/parse-xml.c index efc7bb3569..eac05228f1 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -4,43 +4,94 @@ #include static void -print_containment (xmlNode * a_node) +print_containment (xmlNode *node) { - for (xmlNode *node = a_node; node; node = node->next) + for (; node; node = node->next) { - const xmlNode *parent = node->parent; - if (parent->type == XML_ELEMENT_NODE) - printf ("%s ", parent->name); - else - printf (" "); - if (node->type == XML_ELEMENT_NODE) - printf ("%s", node->name); - else if (node->type == XML_TEXT_NODE) - printf(""); - else if (node->type == XML_CDATA_SECTION_NODE) - printf(""); - else - printf(""); + { + printf ("%s", node->name); + for (xmlNode *child = node->children; child; child = child->next) + { + putchar (' '); + if (child->type == XML_ELEMENT_NODE) + { + printf ("%s", child->name); - putchar('\n'); + int n = 0; + while (child->next + && child->next->type == XML_ELEMENT_NODE + && !strcmp((char *) child->name, (char *) child->next->name)) + { + child = child->next; + n++; + } + if (n > 0) + putchar ('+'); + } + else if (child->type == XML_TEXT_NODE) + printf (""); + else if (child->type == XML_CDATA_SECTION_NODE) + printf (""); + else + printf ("<%d>", child->type); + } + putchar ('\n'); + } print_containment (node->children); } } +static void +print_labels (xmlNode *node) +{ + for (; node; node = node->next) + { + if (node->type == XML_ELEMENT_NODE + && !strcmp((char *) node->name, "label") + && node->parent->type == XML_ELEMENT_NODE + && !strcmp((char *) node->parent->name, "container")) + { + for (xmlNode *child = node->children; child; child = child->next) + if (child->type == XML_TEXT_NODE) + puts ((char *) child->content); + } + + print_labels (node->children); + } +} + static void print_attributes (xmlNode * a_node) { for (xmlNode *node = a_node; node; node = node->next) { - for (xmlAttr *attr = node->properties; attr; attr = attr->next) - printf ("%s %s\n", node->name, attr->name); + if (node->type == XML_ELEMENT_NODE) + { + printf ("%s", node->name); + for (xmlAttr *attr = node->properties; attr; attr = attr->next) + printf (" %s", attr->name); + putchar ('\n'); + } print_attributes (node->children); } } +static void +print_attribute (xmlNode *node, const char *attr) +{ + for (; node; node = node->next) + { + const char *s = (char *) xmlGetProp (node, (xmlChar *) attr); + if (s) + printf ("%s %s\n", node->name, s); + + print_attribute (node->children, attr); + } +} + static void usage (void) { @@ -69,6 +120,10 @@ main (int argc, char **argv) print_containment (root); else if (!strcmp(argv[2], "attributes")) print_attributes (root); + else if (!strncmp(argv[2], "attr:", 5)) + print_attribute (root, argv[2] + 5); + else if (!strcmp(argv[2], "labels")) + print_labels (root); else usage ();