From 79c1866d9e674966baa2c1a36a28acf690ebeb85 Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Sun, 7 Jul 2024 16:13:42 +0200 Subject: [PATCH] add merge mode for merge xml files' --- src/feierabendxml.c | 12 ++++++- src/xml.c | 84 +++++++++++++++++++++++++++++++++++++++++++++ src/xml.h | 1 + 3 files changed, 96 insertions(+), 1 deletion(-) diff --git a/src/feierabendxml.c b/src/feierabendxml.c index ef16c8b..845a65b 100644 --- a/src/feierabendxml.c +++ b/src/feierabendxml.c @@ -6,7 +6,7 @@ int main(int argc, char* argv[]) { if (argc < 2) { - printf("ERROR: %s \n", argv[0]); + printf("ERROR: %s \n", argv[0]); return 1; } @@ -44,6 +44,16 @@ int main(int argc, char* argv[]) return 0; } + if (strcmp(argv[1], "merge") == 0) { + if (argc < 3) { + printf("ERROR: %s merge \n", argv[0]); + return 1; + } + + merge(argv[2]); + return 0; + } + printf("ERROR: unknown command\n"); return 0; } \ No newline at end of file diff --git a/src/xml.c b/src/xml.c index bf1153c..8517609 100644 --- a/src/xml.c +++ b/src/xml.c @@ -4,6 +4,7 @@ #include #include #include +#include #include "xml.h" #include "feierabend.h" #include "worktime.h" @@ -404,6 +405,7 @@ void addEntry(const char* date, xmlFreeTextWriter(xmlwriter); xmlTextReaderClose(xmlreader); xmlFreeTextReader(xmlreader); + xmlreader = NULL; xmlCleanupCharEncodingHandlers(); xmlDictCleanup(); @@ -414,4 +416,86 @@ void addEntry(const char* date, saldo = NULL; free(saldostr); saldostr = NULL; +} + +void copyEntry(xmlTextReaderPtr xmlreader, xmlTextWriterPtr xmlwriter) +{ + xmlChar* xmlElemContent = xmlCharStrdup("eintrag"); + xmlNodePtr xmlnode = xmlTextReaderCurrentNode(xmlreader); + + if (xmlnode->type == XML_ELEMENT_NODE && xmlStrcmp(xmlnode->name, xmlElemContent) == 0) { + xmlTextWriterStartElement(xmlwriter, xmlnode->name); + copyNodeAttributes(xmlreader, xmlwriter); + xmlTextWriterEndElement(xmlwriter); + } + + free(xmlElemContent); + xmlElemContent = NULL; +} + +void merge(const char* dir) +{ + glob_t* files = malloc(sizeof(glob_t)); + char* pattern = malloc(sizeof(char) * strlen(dir) + 7); + sprintf(pattern, "%s/*.xml", dir); + glob(pattern, 0, NULL, files); + + if (files->gl_pathc < 1) { + globfree(files); + free(files); + files = NULL; + free(pattern); + pattern = NULL; + printf("ERROR: no xml file found\n"); + return; + } + + xmlChar* xmlElemContent = NULL; + xmlTextWriterPtr xmlwriter = xmlNewTextWriterFilename("/dev/stdout", 0); + xmlTextWriterSetIndent(xmlwriter, 8); + xmlElemContent = xmlCharStrdup("\t"); + xmlTextWriterSetIndentString(xmlwriter, xmlElemContent); + free(xmlElemContent); + xmlElemContent = NULL; + + xmlTextReaderPtr xmlreader = xmlReaderForFile(files->gl_pathv[0], "UTF-8", 0); + xmlNodePtr xmlnode = NULL; + + xmlTextWriterStartDocument(xmlwriter, "1.0", "UTF-8", NULL); + + xmlTextReaderRead(xmlreader); + xmlnode = xmlTextReaderCurrentNode(xmlreader); + xmlTextWriterStartElement(xmlwriter, xmlnode->name); + copyNodeAttributes(xmlreader, xmlwriter); + xmlTextReaderClose(xmlreader); + xmlFreeTextReader(xmlreader); + xmlreader = NULL; + + for (int i = 0; i < files->gl_pathc; i++) { + xmlreader = xmlReaderForFile(files->gl_pathv[i], "UTF-8", 0); + while (xmlTextReaderRead(xmlreader) == 1) { + copyEntry(xmlreader, xmlwriter); + } + xmlTextReaderClose(xmlreader); + xmlFreeTextReader(xmlreader); + xmlreader = NULL; + xmlCleanupCharEncodingHandlers(); + xmlDictCleanup(); + } + + xmlTextWriterEndElement(xmlwriter); + xmlTextWriterEndDocument(xmlwriter); + + xmlFreeTextWriter(xmlwriter); + xmlwriter = NULL; + xmlCleanupCharEncodingHandlers(); + xmlDictCleanup(); + + free(xmlElemContent); + xmlElemContent = NULL; + globfree(files); + free(files); + files = NULL; + free(pattern); + pattern = NULL; } \ No newline at end of file diff --git a/src/xml.h b/src/xml.h index 9af3f66..bf00052 100644 --- a/src/xml.h +++ b/src/xml.h @@ -12,5 +12,6 @@ void addEntry(const char* date, int end_hour, int end_min, const char* file_path); +void merge(const char* dir); #endif \ No newline at end of file -- 2.39.5