X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=parse-xml.c;h=2f6b33813eb43bc4aa050d3bee9fd415ff32ccf5;hb=c82a9402434b9fc310c85754a03cca114b69f04e;hp=ad1b41833d2908b4b4714cdfc8bd8342a058b782;hpb=b07cc00facf9d44f590fa9b2ef5b2b6ab9b08911;p=pspp diff --git a/parse-xml.c b/parse-xml.c index ad1b41833d..2f6b33813e 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -3,6 +3,32 @@ #include #include +static void +print_parents(xmlNode *node) +{ + for (; node; node = node->next) + { + if (node->type == XML_ELEMENT_NODE) + { + for (xmlNode *child = node->children; child; child = child->next) + { + if (child->type == XML_ELEMENT_NODE) + printf ("%s %s\n", node->name, child->name); + else if (child->type == XML_TEXT_NODE) + printf ("%s \n", node->name); + else if (child->type == XML_CDATA_SECTION_NODE) + printf ("%s \n", node->name); + else if (child->type == XML_COMMENT_NODE) + printf ("%s \n", node->name); + else + printf ("%s <%d>\n", node->name, child->type); + } + } + + print_parents (node->children); + } +} + static void print_containment (xmlNode *node) { @@ -10,33 +36,49 @@ print_containment (xmlNode *node) { if (node->type == XML_ELEMENT_NODE) { - printf ("%s", node->name); + const char *child_names[512]; + int child_name_cnt[512]; + int n_names = 0; for (xmlNode *child = node->children; child; child = child->next) { - putchar (' '); + const char *name; + 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 ('+'); - } + name = (char *) child->name; else if (child->type == XML_TEXT_NODE) - printf (""); + name = ""; else if (child->type == XML_CDATA_SECTION_NODE) - printf (""); + name = ""; + else if (child->type == XML_COMMENT_NODE) + { + name = ""; + //printf ("comment %s\n", (char *) child->content); + continue; + } else - printf ("<%d>", child->type); + name = ""; + + for (int i = 0; i < n_names; i++) + if (!strcmp(name, child_names[i])) + { + child_name_cnt[i]++; + goto next; + } + child_names[n_names] = name; + child_name_cnt[n_names] = 1; + n_names++; + + next:; } - putchar ('\n'); + + printf ("%s", node->name); + for (int i = 0; i < n_names; i++) + { + printf (" %s", child_names[i]); + if (child_name_cnt[i] > 1) + printf ("+"); + } + printf ("\n"); } print_containment (node->children); @@ -67,7 +109,7 @@ print_attributes (xmlNode * a_node) { for (xmlNode *node = a_node; node; node = node->next) { - if (node->properties && node->parent->type != XML_DOCUMENT_NODE) + if (node->type == XML_ELEMENT_NODE) { printf ("%s", node->name); for (xmlAttr *attr = node->properties; attr; attr = attr->next) @@ -79,6 +121,31 @@ print_attributes (xmlNode * a_node) } } +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) { @@ -86,12 +153,48 @@ print_attribute (xmlNode *node, const char *attr) { const char *s = (char *) xmlGetProp (node, (xmlChar *) attr); if (s) - puts (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) { @@ -107,7 +210,7 @@ main (int argc, char **argv) LIBXML_TEST_VERSION; - xmlDoc *doc = xmlReadFile(argv[1], NULL, 0); + xmlDoc *doc = xmlReadFile(argv[1], NULL, XML_PARSE_NOBLANKS); if (doc == NULL) { fprintf (stderr, "error: could not parse file %s\n", argv[1]); @@ -116,10 +219,24 @@ main (int argc, char **argv) xmlNode *root = xmlDocGetRootElement(doc); - if (!strcmp(argv[2], "containment")) +#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], "parents")) + print_parents (root); + else 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"))