X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=parse-xml.c;h=9faa946f45a7ac64574312b8505d139d4e07f2ee;hb=0921b1b712bd855defb41171764f27c4ce6fb4b1;hp=c0445052ed017f6ea80111568dc581884c69d4e1;hpb=0f833bb108ef5a1d78be8ee31b2fe2855f6bd03b;p=pspp diff --git a/parse-xml.c b/parse-xml.c index c0445052ed..9faa946f45 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -1,33 +1,170 @@ #include +#include #include #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) { if (node->type == XML_ELEMENT_NODE) { - const xmlNode *parent = node->parent; - if (parent->type == XML_ELEMENT_NODE) - printf ("%s %s\n", parent->name, node->name); - else if (parent->type == XML_DOCUMENT_NODE) - printf (" %s\n", node->name); + printf ("%s", node->name); + for (xmlNode *child = node->children; child; child = child->next) + { + putchar (' '); + if (child->type == XML_ELEMENT_NODE) + { + printf ("%s", child->name); + + 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); } } -int -main (int argc, char **argv) +static void +print_labels (xmlNode *node) { - if (argc != 2) + for (; node; node = node->next) { - fprintf (stderr, "usage: %s FILE.xml\n", argv[0]); - exit (1); + 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) + { + 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_string(xmlChar *s) +{ + for (char *p = (char *) s; *p; p++) + if (*p == '\n') + printf ("\\n"); + else + putchar (*p); +} + +static void +print_cdata (xmlNode * a_node) +{ + for (xmlNode *node = a_node; node; node = node->next) + { + if (node->type == XML_CDATA_SECTION_NODE) + { + print_string (node->content); + putchar ('\n'); + } + + print_cdata (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=%s\n", node->name, attr, s); + + print_attribute (node->children, attr); + } +} + +static __attribute__((unused)) xmlNode * +find_page_setup (xmlNode *node) +{ + for (; node; node = node->next) + { + if (node->name && !strcmp ((char *) node->name, "pageSetup")) + return node; + + xmlNode *ps = find_page_setup (node->children); + if (ps) + return ps; + } + return NULL; +} + +static void +print_text (xmlNode *node) +{ + for (; node; node = node->next) + { + if (node->type == XML_ELEMENT_NODE) + { + printf ("%s", node->name); + for (xmlNode *child = node->children; child; child = child->next) + if (child->type == XML_TEXT_NODE) + { + putchar (' '); + print_string (child->content); + } + putchar ('\n'); + } + + print_text (node->children); + } +} + +static void +usage (void) +{ + fprintf (stderr, "usage: parse-xml FILE.xml containment|attributes\n"); + exit (1); +} + +int +main (int argc, char **argv) +{ + if (argc != 3) + usage (); LIBXML_TEST_VERSION; @@ -39,7 +176,30 @@ main (int argc, char **argv) } xmlNode *root = xmlDocGetRootElement(doc); - print_containment(root); + +#if 0 + /* Limit what we look at to pageSetup node and below. */ + root = find_page_setup(root); + if (!root) + return 0; + root->next = NULL; +#endif + + if (!strcmp(argv[2], "containment")) + print_containment (root); + else if (!strcmp(argv[2], "attributes")) + print_attributes (root); + else if (!strcmp(argv[2], "cdata")) + print_cdata (root); + else if (!strcmp(argv[2], "text")) + print_text (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 (); + xmlFreeDoc(doc); xmlCleanupParser();