]> gitweb.hhaalo.de Git - feierabend.git/commitdiff
add merge mode for merge xml files'
authorBastian Dehn <hhaalo@arcor.de>
Sun, 7 Jul 2024 14:13:42 +0000 (16:13 +0200)
committerBastian Dehn <hhaalo@arcor.de>
Sun, 7 Jul 2024 15:17:08 +0000 (17:17 +0200)
src/feierabendxml.c
src/xml.c
src/xml.h

index ef16c8b59b3a3a9498efe1a66c751d4b9dc124c2..845a65b25864086895bcb812d829689703e8069b 100644 (file)
@@ -6,7 +6,7 @@
 int main(int argc, char* argv[])
 {
        if (argc < 2) {
-               printf("ERROR: %s <init|add|dateadd|entry>\n", argv[0]);
+               printf("ERROR: %s <init|entry|add|dateadd|merge>\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 <dir>\n", argv[0]);
+                       return 1;
+               }
+
+               merge(argv[2]);
+               return 0;
+       }
+
        printf("ERROR: unknown command\n");
        return 0;
 }
\ No newline at end of file
index bf1153c6fa610eb674498ca1764a7d48c96f907f..851760917af6380f1fb7cdc5337c4596338afd56 100644 (file)
--- a/src/xml.c
+++ b/src/xml.c
@@ -4,6 +4,7 @@
 #include <libxml/parser.h>
 #include <libxml/xpath.h>
 #include <libxml/xmlreader.h>
+#include <glob.h>
 #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
index 9af3f66b1948d88378bec390713b3306069a1835..bf00052b4e3d4a17971c89c3a570ceb244520c01 100644 (file)
--- 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