diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-29 17:51:54 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-29 17:51:54 -0700 |
commit | 77ce61644b414fc4c6596321764aa586b923178a (patch) | |
tree | d0e16128090cc4651ed57f8802420014df801864 | |
parent | fb214b2b3918120f0cd5aebe7c48a7482d1c1276 (diff) | |
download | subsurface-77ce61644b414fc4c6596321764aa586b923178a.tar.gz |
Turn the XML into something almost parseable.
Of course, now the problem is that the different XML files have
different node names, but at least we've turned it into a half-way sane
format, and have a nice callback place per value.
Soon we could use that to actually fill in useful information.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | parse.c | 72 |
2 files changed, 64 insertions, 10 deletions
@@ -1,2 +1,2 @@ parse: parse.c - gcc -g -o parse `xml2-config --cflags` parse.c `xml2-config --libs` + gcc -Wall -g -o parse `xml2-config --cflags` parse.c `xml2-config --libs` @@ -1,23 +1,77 @@ #include <stdio.h> +#include <ctype.h> +#include <string.h> #include <libxml/parser.h> #include <libxml/tree.h> -static void show_one_node(int i, xmlNode *node) +static const char *nodename(xmlNode *node, char *buf, int len) { - static const char indent[] = " .."; + /* Don't print out the node name if it is "text" */ + if (!strcmp(node->name, "text")) { + node = node->parent; + if (!node || !node->name) + return "root"; + } + + buf += len; + *--buf = 0; + len--; + + for(;;) { + const char *name = node->name; + int i = strlen(name); + while (--i >= 0) { + unsigned char c = name[i]; + *--buf = tolower(c); + if (!--len) + return buf; + } + node = node->parent; + if (!node || !node->name) + return buf; + *--buf = '.'; + if (!--len) + return buf; + } +} + +#define MAXNAME 64 + +static void show_one_node(xmlNode *node) +{ + int len; + const unsigned char *content; + char buffer[MAXNAME]; + const char *name; + + content = node->content; + if (!content) + return; + + /* Trim whitespace at beginning */ + while (isspace(*content)) + content++; + + /* Trim whitespace at end */ + len = strlen(content); + while (len && isspace(content[len-1])) + len--; + + if (!len) + return; + + name = nodename(node, buffer, sizeof(buffer)); - if (i >= sizeof(indent)) - i = sizeof(indent)-1; - printf("%.*snode '%s': %s\n", i, indent, node->name, node->content); + printf("%s: %.*s\n", name, len, content); } -static void show(int indent, xmlNode *node) +static void show(xmlNode *node) { xmlNode *n; for (n = node; n; n = n->next) { - show_one_node(indent, n); - show(indent+2, n->children); + show_one_node(n); + show(n->children); } } @@ -31,7 +85,7 @@ static void parse(const char *filename) return; } - show(0, xmlDocGetRootElement(doc)); + show(xmlDocGetRootElement(doc)); xmlFreeDoc(doc); xmlCleanupParser(); } |