aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-08-29 17:51:54 -0700
committerGravatar Linus Torvalds <torvalds@linux-foundation.org>2011-08-29 17:51:54 -0700
commit77ce61644b414fc4c6596321764aa586b923178a (patch)
treed0e16128090cc4651ed57f8802420014df801864
parentfb214b2b3918120f0cd5aebe7c48a7482d1c1276 (diff)
downloadsubsurface-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--Makefile2
-rw-r--r--parse.c72
2 files changed, 64 insertions, 10 deletions
diff --git a/Makefile b/Makefile
index fea7d03d8..f77a9faa4 100644
--- a/Makefile
+++ b/Makefile
@@ -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`
diff --git a/parse.c b/parse.c
index 6277a9021..ffb01d2ea 100644
--- a/parse.c
+++ b/parse.c
@@ -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();
}