From 72965bda2ea93d56e8e0b443826304192e22b5cc Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Wed, 2 Jun 2010 02:24:55 +0200 Subject: Attempting to use text writer instead of building an XML tree and writing it. --- export_xml.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 98 insertions(+), 28 deletions(-) diff --git a/export_xml.c b/export_xml.c index 7bc9c3d..daebe14 100644 --- a/export_xml.c +++ b/export_xml.c @@ -1,37 +1,50 @@ -#include -#include +#include #include #include "export_xml.h" #include "word.h" -#if !defined(LIBXML_TREE_ENABLED) -#error "libxml must be compiled with tree support" +#if !defined(LIBXML_WRITER_ENABLED) +#error "libxml must be compiled with text writer support" #endif int export_xml(struct channel_t *channel, struct user_t *users) { /* Create document and set root node. */ - xmlDocPtr doc = xmlNewDoc((const xmlChar*)"1.0"); + /*xmlDocPtr doc = xmlNewDoc((const xmlChar*)"1.0"); xmlNodePtr root_node = xmlNewNode(NULL, (const xmlChar*)"channel"); - xmlDocSetRootElement(doc, root_node); + xmlDocSetRootElement(doc, root_node);*/ + xmlTextWriterPtr writer = xmlNewTextWriterFilename(channel->xmlpath, 0); + xmlTextWriterStartDocument(writer, "1.0", "UTF-8", NULL); + xmlTextWriterStartElement(writer, (const xmlChar*)"channel"); /* Set the channel name. */ - xmlNewChild(root_node, NULL, (const xmlChar*)"name", (const xmlChar*)channel->name); + //xmlNewChild(root_node, NULL, (const xmlChar*)"name", (const xmlChar*)channel->name); + xmlTextWriterStartElement(writer, (const xmlChar*)"name"); + xmlTextWriterWriteString(writer, (const xmlChar*)channel->name); + xmlTextWriterEndElement(writer); /* Add lines. */ - xmlNodePtr lines_node = xmlNewChild(root_node, NULL, (const xmlChar*)"lines", NULL); + //xmlNodePtr lines_node = xmlNewChild(root_node, NULL, (const xmlChar*)"lines", NULL); + xmlTextWriterStartElement(writer, (const xmlChar*)"lines"); for(int h = 0; h < 24; h++) { - xmlNodePtr hour_node = xmlNewChild(lines_node, NULL, (const xmlChar*)"hour", NULL); + //xmlNodePtr hour_node = xmlNewChild(lines_node, NULL, (const xmlChar*)"hour", NULL); + xmlTextWriterStartElement(writer, (const xmlChar*)"hour"); for(int q = 0; q < 4; q++) { - char s[0xf]; + /*char s[0xf]; snprintf(s, 0xf, "%lu", channel->hours[h*4 + q]); - xmlNewChild(hour_node, NULL, (const xmlChar*)"quarter", (const xmlChar*)s); + xmlNewChild(hour_node, NULL, (const xmlChar*)"quarter", (const xmlChar*)s);*/ + xmlTextWriterStartElement(writer, (const xmlChar*)"quarter"); + xmlTextWriterWriteFormatString(writer, "%lu", channel->hours[h*4 + q]); + xmlTextWriterEndElement(writer); } + xmlTextWriterEndElement(writer); } + xmlTextWriterEndElement(writer); /* Add users. */ - xmlNodePtr users_node = xmlNewChild(root_node, NULL, (const xmlChar*)"users", NULL); + //xmlNodePtr users_node = xmlNewChild(root_node, NULL, (const xmlChar*)"users", NULL); + xmlTextWriterStartElement(writer, (const xmlChar*)"users"); for(int u = 0; u < USERS_MAX; u++) { struct user_t *user = &users[u]; /* Iterate while we have a user (nick is non-NULL). */ @@ -41,10 +54,39 @@ int export_xml(struct channel_t *channel, struct user_t *users) { user = user->next; continue; } - char s[0xf]; - xmlNodePtr user_node = xmlNewChild(users_node, NULL, (const xmlChar*)"user", NULL); + //char s[0xf]; + //xmlNodePtr user_node = xmlNewChild(users_node, NULL, (const xmlChar*)"user", NULL); + xmlTextWriterStartElement(writer, (const xmlChar*)"user"); - xmlNewChild(user_node, NULL, (const xmlChar*)"nick", (xmlChar*)user->nick); + xmlTextWriterStartElement(writer, (const xmlChar*)"nick"); + xmlTextWriterWriteString(writer, (const xmlChar*)user->nick); + xmlTextWriterEndElement(writer); + + xmlTextWriterStartElement(writer, (const xmlChar*)"words"); + xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterEndElement(writer); + + xmlTextWriterStartElement(writer, (const xmlChar*)"characters"); + xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterEndElement(writer); + + xmlTextWriterStartElement(writer, (const xmlChar*)"kicks"); + xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterEndElement(writer); + + xmlTextWriterStartElement(writer, (const xmlChar*)"kicked"); + xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterEndElement(writer); + + xmlTextWriterStartElement(writer, (const xmlChar*)"monolog_lines"); + xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterEndElement(writer); + + xmlTextWriterStartElement(writer, (const xmlChar*)"monologs"); + xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterEndElement(writer); + + /*xmlNewChild(user_node, NULL, (const xmlChar*)"nick", (xmlChar*)user->nick); snprintf(s, 0xf, "%llu", user->words); xmlNewChild(user_node, NULL, (const xmlChar*)"words", (const xmlChar*)s); snprintf(s, 0xf, "%llu", user->characters); @@ -56,38 +98,60 @@ int export_xml(struct channel_t *channel, struct user_t *users) { snprintf(s, 0xf, "%llu", user->monolog_lines); xmlNewChild(user_node, NULL, (const xmlChar*)"monolog_lines", (const xmlChar*)s); snprintf(s, 0xf, "%llu", user->monologs); - xmlNewChild(user_node, NULL, (const xmlChar*)"monologs", (const xmlChar*)s); + xmlNewChild(user_node, NULL, (const xmlChar*)"monologs", (const xmlChar*)s);*/ /* Add lines for this user. */ - xmlNodePtr lines_node = xmlNewChild(user_node, NULL, (const xmlChar*)"lines", NULL); + //xmlNodePtr lines_node = xmlNewChild(user_node, NULL, (const xmlChar*)"lines", NULL); + xmlTextWriterStartElement(writer, (const xmlChar*)"lines"); for(int h = 0; h < 24; h++) { - xmlNodePtr hour_node = xmlNewChild(lines_node, NULL, (const xmlChar*)"hour", NULL); + //xmlNodePtr hour_node = xmlNewChild(lines_node, NULL, (const xmlChar*)"hour", NULL); + xmlTextWriterStartElement(writer, (const xmlChar*)"hour"); for(int q = 0; q < 4; q++) { - snprintf(s, 0xf, "%lu", user->lines[h*4 + q]); - xmlNewChild(hour_node, NULL, (const xmlChar*)"quarter", (const xmlChar*)s); + //snprintf(s, 0xf, "%lu", user->lines[h*4 + q]); + //xmlNewChild(hour_node, NULL, (const xmlChar*)"quarter", (const xmlChar*)s); + xmlTextWriterStartElement(writer, (const xmlChar*)"quarter"); + xmlTextWriterWriteFormatString(writer, "%lu", channel->hours[h*4 + q]); + xmlTextWriterEndElement(writer); } + xmlTextWriterEndElement(writer); } + xmlTextWriterEndElement(writer); user = user->next; + + xmlTextWriterEndElement(writer); } } + xmlTextWriterEndElement(writer); /* Add words. */ - xmlNodePtr words_node = xmlNewChild(root_node, NULL, (const xmlChar*)"words", NULL); + //xmlNodePtr words_node = xmlNewChild(root_node, NULL, (const xmlChar*)"words", NULL); + xmlTextWriterStartElement(writer, (const xmlChar*)"words"); for(int w = 0; w < WORDS_MAX; w++) { struct word_t *word = &words[w]; while(word && word->name) { - char s[0xf]; - xmlNodePtr word_node = xmlNewChild(words_node, NULL, (const xmlChar*)"word", NULL); + //char s[0xf]; + //xmlNodePtr word_node = xmlNewChild(words_node, NULL, (const xmlChar*)"word", NULL); + xmlTextWriterStartElement(writer, (const xmlChar*)"word"); + + //xmlNewChild(word_node, NULL, (const xmlChar*)"name", (const xmlChar*)word->name); + //snprintf(s, 0xf, "%llu", word->count); + //xmlNewChild(word_node, NULL, (const xmlChar*)"count", (const xmlChar*)s); + xmlTextWriterStartElement(writer, (const xmlChar*)"name"); + xmlTextWriterWriteString(writer, (const xmlChar*)word->name); + xmlTextWriterEndElement(writer); - xmlNewChild(word_node, NULL, (const xmlChar*)"name", (const xmlChar*)word->name); - snprintf(s, 0xf, "%llu", word->count); - xmlNewChild(word_node, NULL, (const xmlChar*)"count", (const xmlChar*)s); + xmlTextWriterStartElement(writer, (const xmlChar*)"name"); + xmlTextWriterWriteFormatString(writer, "%llu", word->count); + xmlTextWriterEndElement(writer); word = word->next; + + xmlTextWriterEndElement(writer); } } + xmlTextWriterEndElement(writer); - xmlSaveCtxtPtr save_context = xmlSaveToFilename(channel->xmlpath, "UTF-8", 0); + /*xmlSaveCtxtPtr save_context = xmlSaveToFilename(channel->xmlpath, "UTF-8", 0); if(!save_context) { xmlErrorPtr error = xmlGetLastError(); fprintf(stderr, "Failed to save XML data: %s\n", (error ? error->message : "unknown error")); @@ -96,6 +160,12 @@ int export_xml(struct channel_t *channel, struct user_t *users) { } xmlSaveDoc(save_context, doc); xmlSaveClose(save_context); - xmlFreeDoc(doc); + xmlFreeDoc(doc);*/ + + xmlTextWriterEndElement(writer); + + xmlTextWriterEndDocument(writer); + xmlFreeTextWriter(writer); + return 1; } -- cgit v1.2.3 From d7523bb847355ba5eec069b8a96d50fba8d1cd33 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Wed, 2 Jun 2010 12:27:24 +0200 Subject: Fixed writing user data. --- export_xml.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/export_xml.c b/export_xml.c index daebe14..b16ff41 100644 --- a/export_xml.c +++ b/export_xml.c @@ -63,27 +63,27 @@ int export_xml(struct channel_t *channel, struct user_t *users) { xmlTextWriterEndElement(writer); xmlTextWriterStartElement(writer, (const xmlChar*)"words"); - xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterWriteFormatString(writer, "%llu", user->words); xmlTextWriterEndElement(writer); xmlTextWriterStartElement(writer, (const xmlChar*)"characters"); - xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterWriteFormatString(writer, "%llu", user->characters); xmlTextWriterEndElement(writer); xmlTextWriterStartElement(writer, (const xmlChar*)"kicks"); - xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterWriteFormatString(writer, "%llu", user->kicks); xmlTextWriterEndElement(writer); xmlTextWriterStartElement(writer, (const xmlChar*)"kicked"); - xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterWriteFormatString(writer, "%llu", user->kicked); xmlTextWriterEndElement(writer); xmlTextWriterStartElement(writer, (const xmlChar*)"monolog_lines"); - xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterWriteFormatString(writer, "%llu", user->monolog_lines); xmlTextWriterEndElement(writer); xmlTextWriterStartElement(writer, (const xmlChar*)"monologs"); - xmlTextWriterWriteFormatString(writer, "%llu", users->words); + xmlTextWriterWriteFormatString(writer, "%llu", user->monologs); xmlTextWriterEndElement(writer); /*xmlNewChild(user_node, NULL, (const xmlChar*)"nick", (xmlChar*)user->nick); @@ -110,7 +110,7 @@ int export_xml(struct channel_t *channel, struct user_t *users) { //snprintf(s, 0xf, "%lu", user->lines[h*4 + q]); //xmlNewChild(hour_node, NULL, (const xmlChar*)"quarter", (const xmlChar*)s); xmlTextWriterStartElement(writer, (const xmlChar*)"quarter"); - xmlTextWriterWriteFormatString(writer, "%lu", channel->hours[h*4 + q]); + xmlTextWriterWriteFormatString(writer, "%lu", user->lines[h*4 + q]); xmlTextWriterEndElement(writer); } xmlTextWriterEndElement(writer); -- cgit v1.2.3 From b7973300b7f7603c9c0648941d8c4a1c0bf66c0c Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Wed, 2 Jun 2010 16:01:30 +0200 Subject: Cleaned up old code. --- export_xml.c | 70 ++++++++++++------------------------------------------------ 1 file changed, 14 insertions(+), 56 deletions(-) diff --git a/export_xml.c b/export_xml.c index b16ff41..051ca92 100644 --- a/export_xml.c +++ b/export_xml.c @@ -11,39 +11,34 @@ int export_xml(struct channel_t *channel, struct user_t *users) { /* Create document and set root node. */ - /*xmlDocPtr doc = xmlNewDoc((const xmlChar*)"1.0"); - xmlNodePtr root_node = xmlNewNode(NULL, (const xmlChar*)"channel"); - xmlDocSetRootElement(doc, root_node);*/ xmlTextWriterPtr writer = xmlNewTextWriterFilename(channel->xmlpath, 0); + if(writer == NULL) { + fprintf(stderr, "Failed to create text writer for filename \"%s\"\n", channel->xmlpath); + return 0; + } + xmlTextWriterStartDocument(writer, "1.0", "UTF-8", NULL); xmlTextWriterStartElement(writer, (const xmlChar*)"channel"); /* Set the channel name. */ - //xmlNewChild(root_node, NULL, (const xmlChar*)"name", (const xmlChar*)channel->name); xmlTextWriterStartElement(writer, (const xmlChar*)"name"); xmlTextWriterWriteString(writer, (const xmlChar*)channel->name); xmlTextWriterEndElement(writer); /* Add lines. */ - //xmlNodePtr lines_node = xmlNewChild(root_node, NULL, (const xmlChar*)"lines", NULL); xmlTextWriterStartElement(writer, (const xmlChar*)"lines"); for(int h = 0; h < 24; h++) { - //xmlNodePtr hour_node = xmlNewChild(lines_node, NULL, (const xmlChar*)"hour", NULL); xmlTextWriterStartElement(writer, (const xmlChar*)"hour"); for(int q = 0; q < 4; q++) { - /*char s[0xf]; - snprintf(s, 0xf, "%lu", channel->hours[h*4 + q]); - xmlNewChild(hour_node, NULL, (const xmlChar*)"quarter", (const xmlChar*)s);*/ xmlTextWriterStartElement(writer, (const xmlChar*)"quarter"); xmlTextWriterWriteFormatString(writer, "%lu", channel->hours[h*4 + q]); xmlTextWriterEndElement(writer); } - xmlTextWriterEndElement(writer); + xmlTextWriterEndElement(writer); // hour } - xmlTextWriterEndElement(writer); + xmlTextWriterEndElement(writer); // lines /* Add users. */ - //xmlNodePtr users_node = xmlNewChild(root_node, NULL, (const xmlChar*)"users", NULL); xmlTextWriterStartElement(writer, (const xmlChar*)"users"); for(int u = 0; u < USERS_MAX; u++) { struct user_t *user = &users[u]; @@ -54,8 +49,6 @@ int export_xml(struct channel_t *channel, struct user_t *users) { user = user->next; continue; } - //char s[0xf]; - //xmlNodePtr user_node = xmlNewChild(users_node, NULL, (const xmlChar*)"user", NULL); xmlTextWriterStartElement(writer, (const xmlChar*)"user"); xmlTextWriterStartElement(writer, (const xmlChar*)"nick"); @@ -86,56 +79,32 @@ int export_xml(struct channel_t *channel, struct user_t *users) { xmlTextWriterWriteFormatString(writer, "%llu", user->monologs); xmlTextWriterEndElement(writer); - /*xmlNewChild(user_node, NULL, (const xmlChar*)"nick", (xmlChar*)user->nick); - snprintf(s, 0xf, "%llu", user->words); - xmlNewChild(user_node, NULL, (const xmlChar*)"words", (const xmlChar*)s); - snprintf(s, 0xf, "%llu", user->characters); - xmlNewChild(user_node, NULL, (const xmlChar*)"characters", (const xmlChar*)s); - snprintf(s, 0xf, "%llu", user->kicks); - xmlNewChild(user_node, NULL, (const xmlChar*)"kicks", (const xmlChar*)s); - snprintf(s, 0xf, "%llu", user->kicked); - xmlNewChild(user_node, NULL, (const xmlChar*)"kicked", (const xmlChar*)s); - snprintf(s, 0xf, "%llu", user->monolog_lines); - xmlNewChild(user_node, NULL, (const xmlChar*)"monolog_lines", (const xmlChar*)s); - snprintf(s, 0xf, "%llu", user->monologs); - xmlNewChild(user_node, NULL, (const xmlChar*)"monologs", (const xmlChar*)s);*/ - /* Add lines for this user. */ - //xmlNodePtr lines_node = xmlNewChild(user_node, NULL, (const xmlChar*)"lines", NULL); xmlTextWriterStartElement(writer, (const xmlChar*)"lines"); for(int h = 0; h < 24; h++) { - //xmlNodePtr hour_node = xmlNewChild(lines_node, NULL, (const xmlChar*)"hour", NULL); xmlTextWriterStartElement(writer, (const xmlChar*)"hour"); for(int q = 0; q < 4; q++) { - //snprintf(s, 0xf, "%lu", user->lines[h*4 + q]); - //xmlNewChild(hour_node, NULL, (const xmlChar*)"quarter", (const xmlChar*)s); xmlTextWriterStartElement(writer, (const xmlChar*)"quarter"); xmlTextWriterWriteFormatString(writer, "%lu", user->lines[h*4 + q]); xmlTextWriterEndElement(writer); } - xmlTextWriterEndElement(writer); + xmlTextWriterEndElement(writer); // hour } - xmlTextWriterEndElement(writer); + xmlTextWriterEndElement(writer); // lines user = user->next; - xmlTextWriterEndElement(writer); + xmlTextWriterEndElement(writer); // user } } - xmlTextWriterEndElement(writer); + xmlTextWriterEndElement(writer); // users /* Add words. */ - //xmlNodePtr words_node = xmlNewChild(root_node, NULL, (const xmlChar*)"words", NULL); xmlTextWriterStartElement(writer, (const xmlChar*)"words"); for(int w = 0; w < WORDS_MAX; w++) { struct word_t *word = &words[w]; while(word && word->name) { - //char s[0xf]; - //xmlNodePtr word_node = xmlNewChild(words_node, NULL, (const xmlChar*)"word", NULL); xmlTextWriterStartElement(writer, (const xmlChar*)"word"); - //xmlNewChild(word_node, NULL, (const xmlChar*)"name", (const xmlChar*)word->name); - //snprintf(s, 0xf, "%llu", word->count); - //xmlNewChild(word_node, NULL, (const xmlChar*)"count", (const xmlChar*)s); xmlTextWriterStartElement(writer, (const xmlChar*)"name"); xmlTextWriterWriteString(writer, (const xmlChar*)word->name); xmlTextWriterEndElement(writer); @@ -146,23 +115,12 @@ int export_xml(struct channel_t *channel, struct user_t *users) { word = word->next; - xmlTextWriterEndElement(writer); + xmlTextWriterEndElement(writer); // word } } - xmlTextWriterEndElement(writer); + xmlTextWriterEndElement(writer); // words - /*xmlSaveCtxtPtr save_context = xmlSaveToFilename(channel->xmlpath, "UTF-8", 0); - if(!save_context) { - xmlErrorPtr error = xmlGetLastError(); - fprintf(stderr, "Failed to save XML data: %s\n", (error ? error->message : "unknown error")); - xmlFreeDoc(doc); - return 0; - } - xmlSaveDoc(save_context, doc); - xmlSaveClose(save_context); - xmlFreeDoc(doc);*/ - - xmlTextWriterEndElement(writer); + xmlTextWriterEndElement(writer); // channel xmlTextWriterEndDocument(writer); xmlFreeTextWriter(writer); -- cgit v1.2.3 From 75414a04559846bb9cac4dda13bdec26eb6a8d2f Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Wed, 2 Jun 2010 17:58:34 +0200 Subject: Fixed word count i XML output. --- export_xml.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/export_xml.c b/export_xml.c index 051ca92..1bed18b 100644 --- a/export_xml.c +++ b/export_xml.c @@ -109,7 +109,7 @@ int export_xml(struct channel_t *channel, struct user_t *users) { xmlTextWriterWriteString(writer, (const xmlChar*)word->name); xmlTextWriterEndElement(writer); - xmlTextWriterStartElement(writer, (const xmlChar*)"name"); + xmlTextWriterStartElement(writer, (const xmlChar*)"count"); xmlTextWriterWriteFormatString(writer, "%llu", word->count); xmlTextWriterEndElement(writer); -- cgit v1.2.3