From 77ce61644b414fc4c6596321764aa586b923178a Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Mon, 29 Aug 2011 17:51:54 -0700 Subject: [PATCH] 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 --- Makefile | 2 +- parse.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 64 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index fea7d03..f77a9fa 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 6277a90..ffb01d2 100644 --- a/parse.c +++ b/parse.c @@ -1,23 +1,77 @@ #include +#include +#include #include #include -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(); } -- 2.43.0