]> gitweb.hhaalo.de Git - feierabend.git/commitdiff
change xml methods to seperate file
authorBastian Dehn <hhaalo@arcor.de>
Sun, 7 Jul 2024 11:16:28 +0000 (13:16 +0200)
committerBastian Dehn <hhaalo@arcor.de>
Sun, 7 Jul 2024 11:20:34 +0000 (13:20 +0200)
src/CMakeLists.txt
src/feierabendxml.c
src/xml.c [new file with mode: 0644]
src/xml.h [new file with mode: 0644]

index c26d0bc37ce53463adab97ec431fcaabea785399..d017290e261b15fc5863e0995af33585735901d7 100644 (file)
@@ -23,6 +23,7 @@ ADD_EXECUTABLE(${PROJECT_NAME}
 IF(${LibXml2_FOUND})
        ADD_EXECUTABLE(${PROJECT_NAME}xml
                feierabendxml.c
+               xml.c
                time_format.c
                worktime.c
                break.c)
index cde8acf4f67c380c144dcdf73a44006b47c344d5..ef16c8b59b3a3a9498efe1a66c751d4b9dc124c2 100644 (file)
@@ -1,420 +1,7 @@
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
-#include <libxml/encoding.h>
-#include <libxml/xmlwriter.h>
-#include <libxml/parser.h>
-#include <libxml/xpath.h>
-#include <libxml/xmlreader.h>
-#include "worktime.h"
-#include "break.h"
-#include "time_format.h"
-#include "feierabend.h"
-
-#define MAX_STRING_LENGTH 36
-
-void init_feierabend(feierabend* fabend)
-{
-       fabend->now = malloc(sizeof(time_t));
-       fabend->begin = malloc(sizeof(time_t));
-       fabend->worktime = malloc(sizeof(time_t));
-       fabend->weekday = malloc(sizeof(char) * 11);
-       fabend->timestr = malloc(sizeof(char) * 7);
-}
-
-void free_feierabend(feierabend* fabend)
-{
-       free(fabend->now);
-       free(fabend->begin);
-       free(fabend->worktime);
-       free(fabend->weekday);
-       free(fabend->timestr);
-       fabend->now = NULL;
-       fabend->begin = NULL;
-       fabend->worktime = NULL;
-       fabend->weekday = NULL;
-       fabend->timestr = NULL;
-}
-
-void initTimeAcount()
-{
-       xmlChar* xmlElemName = NULL;
-       xmlChar* xmlElemContent = NULL;
-
-       xmlTextWriterPtr xmlWriter = xmlNewTextWriterFilename("/dev/stdout", 0);
-       xmlTextWriterSetIndent(xmlWriter, 8);
-       xmlElemContent = xmlCharStrdup("\t");
-       xmlTextWriterSetIndentString(xmlWriter, xmlElemContent);
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       xmlTextWriterStartDocument(xmlWriter, "1.0", "UTF-8", NULL);
-
-       xmlElemName = xmlCharStrdup("zeitkonto");
-       xmlTextWriterStartElement(xmlWriter, xmlElemName);
-       free(xmlElemName);
-       xmlElemName = NULL;
-
-       xmlElemName = xmlCharStrdup("anfangssaldo");
-       xmlElemContent = xmlCharStrdup("00:00");
-       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       xmlTextWriterEndElement(xmlWriter);
-       xmlTextWriterEndDocument(xmlWriter);
-
-       xmlFreeTextWriter(xmlWriter);
-       xmlWriter = NULL;
-
-       xmlDictCleanup();
-       xmlCleanupCharEncodingHandlers();
-
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-       free(xmlElemName);
-       xmlElemName = NULL;
-}
-
-void writeEntryNode(xmlTextWriterPtr xmlWriter,
-       const char* date,
-       int begin_hour,
-       int begin_min,
-       int end_hour,
-       int end_min,
-       time_t last_saldo)
-{
-       feierabend* fabend = malloc(sizeof(feierabend));
-       init_feierabend(fabend);
-       xmlChar* xmlElemName = NULL;
-       xmlChar* xmlElemContent = NULL;
-       char* value = malloc(sizeof(char) * MAX_STRING_LENGTH);
-
-       xmlElemName = xmlCharStrdup("eintrag");
-       xmlTextWriterStartElement(xmlWriter, xmlElemName);
-       free(xmlElemName);
-       xmlElemName = NULL;
-
-       time(fabend->now);
-       fabend->now_tm = gmtime(fabend->now);
-       if (date != NULL) {
-               fabend->now_tm->tm_year = get_year_from_str(date) - 1900;
-               fabend->now_tm->tm_mon = get_month_from_str(date) - 1;
-               fabend->now_tm->tm_mday = get_day_from_str(date);
-       }
-       fabend->now_tm->tm_hour = end_hour;
-       fabend->now_tm->tm_min = end_min;
-       *fabend->now = mktime(fabend->now_tm);
-       get_short_weekday(fabend->now_tm->tm_wday, value);
-       xmlElemName = xmlCharStrdup("wochentag");
-       xmlElemContent = xmlCharStrdup(value);
-       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
-       memset(value, 0, MAX_STRING_LENGTH);
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-       
-       sprintf(value, "%04d-%02d-%02d",
-               fabend->now_tm->tm_year + 1900,
-               fabend->now_tm->tm_mon + 1,
-               fabend->now_tm->tm_mday);
-       xmlElemName = xmlCharStrdup("datum");
-       xmlElemContent = xmlCharStrdup(value);
-       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
-       memset(value, 0, MAX_STRING_LENGTH);
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       time(fabend->begin);
-       fabend->begin_tm = gmtime(fabend->begin);
-       if (date != NULL) {
-               fabend->begin_tm->tm_year = get_year_from_str(date) - 1900;
-               fabend->begin_tm->tm_mon = get_month_from_str(date) - 1;
-               fabend->begin_tm->tm_mday = get_day_from_str(date);
-       }
-       fabend->begin_tm->tm_hour = begin_hour;
-       fabend->begin_tm->tm_min = begin_min;
-       sprintf(value, "%02d:%02d",
-               fabend->begin_tm->tm_hour,
-               fabend->begin_tm->tm_min);
-       *fabend->begin = mktime(fabend->begin_tm);
-       xmlElemName = xmlCharStrdup("begin");
-       xmlElemContent = xmlCharStrdup(value);
-       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
-       memset(value, 0, MAX_STRING_LENGTH);
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       *fabend->worktime = get_eight_hour_end_worktime(*fabend->begin);
-       fabend->work_end_tm = gmtime(fabend->worktime);
-       if (date != NULL) {
-               fabend->work_end_tm->tm_year = get_year_from_str(date) - 1900;
-               fabend->work_end_tm->tm_mon = get_month_from_str(date) - 1;
-               fabend->work_end_tm->tm_mday = get_day_from_str(date);
-       }
-       fabend->work_end_tm->tm_hour = end_hour;
-       fabend->work_end_tm->tm_min = end_min;
-       sprintf(value, "%02d:%02d",
-               fabend->work_end_tm->tm_hour,
-               fabend->work_end_tm->tm_min);
-       xmlElemName = xmlCharStrdup("ende");
-       xmlElemContent = xmlCharStrdup(value);
-       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
-       memset(value, 0, MAX_STRING_LENGTH);
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       *fabend->worktime = get_brutto_worktime(*fabend->begin, *fabend->now);
-       time_t breaktime = get_break_time(*fabend->worktime);
-       get_time_str(breaktime, value);
-       xmlElemName = xmlCharStrdup("pause");
-       xmlElemContent = xmlCharStrdup(value);
-       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
-       memset(value, 0, MAX_STRING_LENGTH);
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       get_time_str(SOLL_WORKTIME, value);
-       xmlElemName = xmlCharStrdup("sollarbeitszeit");
-       xmlElemContent = xmlCharStrdup(value);
-       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
-       memset(value, 0, MAX_STRING_LENGTH);
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       *fabend->worktime = get_current_worktime(*fabend->begin, *fabend->now);
-       get_time_str(*fabend->worktime, value);
-       xmlElemName = xmlCharStrdup("arbeitszeit");
-       xmlElemContent = xmlCharStrdup(value);
-       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
-       memset(value, 0, MAX_STRING_LENGTH);
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       *fabend->worktime = get_current_worktime_diff_to_end_eight_hour(*fabend->begin, *fabend->now);
-       get_time_str_overtime(*fabend->worktime, value);
-       xmlElemName = xmlCharStrdup("stunden");
-       xmlElemContent = xmlCharStrdup(value);
-       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
-       memset(value, 0, MAX_STRING_LENGTH);
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       *fabend->worktime *= -1;
-       *fabend->worktime += last_saldo;
-       get_time_str(*fabend->worktime, value);
-       xmlElemName = xmlCharStrdup("saldo");
-       xmlElemContent = xmlCharStrdup(value);
-       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
-       memset(value, 0, MAX_STRING_LENGTH);
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       xmlTextWriterEndElement(xmlWriter);
-
-       free(value);
-       value = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free_feierabend(fabend);
-       free(fabend);
-       fabend = NULL;
-}
-
-void createEntry(int begin_hour,
-       int begin_min,
-       int end_hour,
-       int end_min)
-{
-       xmlChar* xmlElemName = NULL;
-       xmlChar* xmlElemContent = NULL;
-
-       xmlTextWriterPtr xmlWriter = xmlNewTextWriterFilename("/dev/stdout", 0);
-       xmlTextWriterSetIndent(xmlWriter, 8);
-       xmlElemContent = xmlCharStrdup("\t");
-       xmlTextWriterSetIndentString(xmlWriter, xmlElemContent);
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       xmlTextWriterStartDocument(xmlWriter, "1.0", "UTF-8", NULL);
-
-       xmlElemName = xmlCharStrdup("zeitkonto");
-       xmlTextWriterStartElement(xmlWriter, xmlElemName);
-       free(xmlElemName);
-       xmlElemName = NULL;
-
-       xmlElemName = xmlCharStrdup("anfangssaldo");
-       xmlElemContent = xmlCharStrdup("00:00");
-       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
-       free(xmlElemName);
-       xmlElemName = NULL;
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-
-       writeEntryNode(xmlWriter, NULL, begin_hour, begin_min, end_hour, end_min, 0);
-
-       xmlTextWriterEndElement(xmlWriter);
-       xmlTextWriterEndDocument(xmlWriter);
-
-       xmlFreeTextWriter(xmlWriter);
-       xmlWriter = NULL;
-
-       xmlDictCleanup();
-       xmlCleanupCharEncodingHandlers();
-
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-       free(xmlElemName);
-       xmlElemName = NULL;
-       xmlFreeTextWriter(xmlWriter);
-       xmlWriter = NULL;
-}
-
-void readLastSaldo(const char* file_path, char* value)
-{
-       xmlInitParser();
-       xmlDocPtr xmldoc = xmlReadFile(file_path, "UTF-8", 0);
-
-       if (xmldoc == NULL) {
-               printf("ERROR: could not open file: %s\n", file_path);
-               exit(EXIT_FAILURE);
-       }
-
-       xmlXPathContextPtr xmlcontext = xmlXPathNewContext(xmldoc);
-       xmlChar* expr = xmlCharStrdup("/zeitkonto/eintrag[last()]/@saldo");
-       xmlXPathObjectPtr xmlnode = xmlXPathEvalExpression(expr, xmlcontext);
-
-       if (xmlnode->nodesetval == NULL || xmlnode->nodesetval->nodeTab == NULL) {
-               free(expr);
-               expr = NULL;
-               xmlXPathFreeObject(xmlnode);
-               xmlnode = NULL;
-               expr = xmlCharStrdup("/zeitkonto/@anfangssaldo");
-               xmlnode = xmlXPathEvalExpression(expr, xmlcontext);
-       }
-
-       if (xmlnode->nodesetval->nodeTab == NULL) {
-               printf("ERROR: could not find an saldo\n");
-               xmlFreeDoc(xmldoc);
-               xmldoc = NULL;
-               xmlCleanupParser();
-
-               free(expr);
-               expr = NULL;
-               xmlXPathFreeObject(xmlnode);
-               xmlnode = NULL;
-               xmlXPathFreeContext(xmlcontext);
-               xmlcontext = NULL;
-               exit(EXIT_FAILURE);
-       }
-
-       strncpy(value,
-               (char*) xmlnode->nodesetval->nodeTab[0]->children->content,
-               MAX_STRING_LENGTH);
-
-       free(expr);
-       expr = NULL;
-       xmlXPathFreeObject(xmlnode);
-       xmlnode = NULL;
-       xmlFreeDoc(xmldoc);
-       xmldoc = NULL;
-       xmlXPathFreeContext(xmlcontext);
-       xmlcontext = NULL;
-
-       xmlCleanupParser();
-}
-
-void copyNodeAttributes(xmlTextReaderPtr xmlreader, xmlTextWriterPtr xmlwriter)
-{
-       xmlNodePtr xmlnode = NULL;
-       int attrCount = xmlTextReaderAttributeCount(xmlreader);
-       for (int i = 0; i < attrCount; i++) {
-               xmlTextReaderMoveToNextAttribute(xmlreader);
-               xmlnode = xmlTextReaderCurrentNode(xmlreader);
-               xmlTextWriterWriteAttribute(xmlwriter, xmlnode->name, xmlnode->children[0].content);
-       }
-}
-
-
-void addEntry(const char* date,
-       int begin_hour,
-       int begin_min,
-       int end_hour,
-       int end_min,
-       const char* file_path)
-{
-       char* saldostr = malloc(sizeof(char) * MAX_STRING_LENGTH);
-       memset(saldostr, 0, MAX_STRING_LENGTH);
-       readLastSaldo(file_path, saldostr);
-
-       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(file_path, "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);
-
-       xmlElemContent = xmlCharStrdup("eintrag");
-       while (xmlTextReaderRead(xmlreader) == 1) {
-               xmlnode = xmlTextReaderCurrentNode(xmlreader);
-               if (xmlnode->type == XML_ELEMENT_NODE && xmlStrcmp(xmlnode->name, xmlElemContent) == 0) {
-                       xmlTextWriterStartElement(xmlwriter, xmlnode->name);
-                       copyNodeAttributes(xmlreader, xmlwriter);
-                       xmlTextWriterEndElement(xmlwriter);
-               }
-       }
-
-       time_t* saldo = malloc(sizeof(time_t));
-       get_seconds_from_string(saldostr, saldo);
-       writeEntryNode(xmlwriter, date, begin_hour, begin_min, end_hour, end_min, *saldo);
-       xmlTextWriterEndElement(xmlwriter);
-       xmlTextWriterEndDocument(xmlwriter);
-
-       xmlFreeTextWriter(xmlwriter);
-       xmlTextReaderClose(xmlreader);
-       xmlFreeTextReader(xmlreader);
-
-       xmlCleanupCharEncodingHandlers();
-       xmlDictCleanup();
-
-       free(xmlElemContent);
-       xmlElemContent = NULL;
-       free(saldo);
-       saldo = NULL;
-       free(saldostr);
-       saldostr = NULL;
-}
+#include "xml.h"
 
 int main(int argc, char* argv[])
 {
diff --git a/src/xml.c b/src/xml.c
new file mode 100644 (file)
index 0000000..bf1153c
--- /dev/null
+++ b/src/xml.c
@@ -0,0 +1,417 @@
+#include <string.h>
+#include <libxml/encoding.h>
+#include <libxml/xmlwriter.h>
+#include <libxml/parser.h>
+#include <libxml/xpath.h>
+#include <libxml/xmlreader.h>
+#include "xml.h"
+#include "feierabend.h"
+#include "worktime.h"
+#include "break.h"
+#include "time_format.h"
+#include "feierabend.h"
+
+#define MAX_STRING_LENGTH 36
+
+void init_feierabend(feierabend* fabend)
+{
+       fabend->now = malloc(sizeof(time_t));
+       fabend->begin = malloc(sizeof(time_t));
+       fabend->worktime = malloc(sizeof(time_t));
+       fabend->weekday = malloc(sizeof(char) * 11);
+       fabend->timestr = malloc(sizeof(char) * 7);
+}
+
+void free_feierabend(feierabend* fabend)
+{
+       free(fabend->now);
+       free(fabend->begin);
+       free(fabend->worktime);
+       free(fabend->weekday);
+       free(fabend->timestr);
+       fabend->now = NULL;
+       fabend->begin = NULL;
+       fabend->worktime = NULL;
+       fabend->weekday = NULL;
+       fabend->timestr = NULL;
+}
+
+void initTimeAcount()
+{
+       xmlChar* xmlElemName = NULL;
+       xmlChar* xmlElemContent = NULL;
+
+       xmlTextWriterPtr xmlWriter = xmlNewTextWriterFilename("/dev/stdout", 0);
+       xmlTextWriterSetIndent(xmlWriter, 8);
+       xmlElemContent = xmlCharStrdup("\t");
+       xmlTextWriterSetIndentString(xmlWriter, xmlElemContent);
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       xmlTextWriterStartDocument(xmlWriter, "1.0", "UTF-8", NULL);
+
+       xmlElemName = xmlCharStrdup("zeitkonto");
+       xmlTextWriterStartElement(xmlWriter, xmlElemName);
+       free(xmlElemName);
+       xmlElemName = NULL;
+
+       xmlElemName = xmlCharStrdup("anfangssaldo");
+       xmlElemContent = xmlCharStrdup("00:00");
+       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       xmlTextWriterEndElement(xmlWriter);
+       xmlTextWriterEndDocument(xmlWriter);
+
+       xmlFreeTextWriter(xmlWriter);
+       xmlWriter = NULL;
+
+       xmlDictCleanup();
+       xmlCleanupCharEncodingHandlers();
+
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+       free(xmlElemName);
+       xmlElemName = NULL;
+}
+
+void writeEntryNode(xmlTextWriterPtr xmlWriter,
+       const char* date,
+       int begin_hour,
+       int begin_min,
+       int end_hour,
+       int end_min,
+       time_t last_saldo)
+{
+       feierabend* fabend = malloc(sizeof(feierabend));
+       init_feierabend(fabend);
+       xmlChar* xmlElemName = NULL;
+       xmlChar* xmlElemContent = NULL;
+       char* value = malloc(sizeof(char) * MAX_STRING_LENGTH);
+
+       xmlElemName = xmlCharStrdup("eintrag");
+       xmlTextWriterStartElement(xmlWriter, xmlElemName);
+       free(xmlElemName);
+       xmlElemName = NULL;
+
+       time(fabend->now);
+       fabend->now_tm = gmtime(fabend->now);
+       if (date != NULL) {
+               fabend->now_tm->tm_year = get_year_from_str(date) - 1900;
+               fabend->now_tm->tm_mon = get_month_from_str(date) - 1;
+               fabend->now_tm->tm_mday = get_day_from_str(date);
+       }
+       fabend->now_tm->tm_hour = end_hour;
+       fabend->now_tm->tm_min = end_min;
+       *fabend->now = mktime(fabend->now_tm);
+       get_short_weekday(fabend->now_tm->tm_wday, value);
+       xmlElemName = xmlCharStrdup("wochentag");
+       xmlElemContent = xmlCharStrdup(value);
+       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+       memset(value, 0, MAX_STRING_LENGTH);
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+       
+       sprintf(value, "%04d-%02d-%02d",
+               fabend->now_tm->tm_year + 1900,
+               fabend->now_tm->tm_mon + 1,
+               fabend->now_tm->tm_mday);
+       xmlElemName = xmlCharStrdup("datum");
+       xmlElemContent = xmlCharStrdup(value);
+       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+       memset(value, 0, MAX_STRING_LENGTH);
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       time(fabend->begin);
+       fabend->begin_tm = gmtime(fabend->begin);
+       if (date != NULL) {
+               fabend->begin_tm->tm_year = get_year_from_str(date) - 1900;
+               fabend->begin_tm->tm_mon = get_month_from_str(date) - 1;
+               fabend->begin_tm->tm_mday = get_day_from_str(date);
+       }
+       fabend->begin_tm->tm_hour = begin_hour;
+       fabend->begin_tm->tm_min = begin_min;
+       sprintf(value, "%02d:%02d",
+               fabend->begin_tm->tm_hour,
+               fabend->begin_tm->tm_min);
+       *fabend->begin = mktime(fabend->begin_tm);
+       xmlElemName = xmlCharStrdup("begin");
+       xmlElemContent = xmlCharStrdup(value);
+       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+       memset(value, 0, MAX_STRING_LENGTH);
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       *fabend->worktime = get_eight_hour_end_worktime(*fabend->begin);
+       fabend->work_end_tm = gmtime(fabend->worktime);
+       if (date != NULL) {
+               fabend->work_end_tm->tm_year = get_year_from_str(date) - 1900;
+               fabend->work_end_tm->tm_mon = get_month_from_str(date) - 1;
+               fabend->work_end_tm->tm_mday = get_day_from_str(date);
+       }
+       fabend->work_end_tm->tm_hour = end_hour;
+       fabend->work_end_tm->tm_min = end_min;
+       sprintf(value, "%02d:%02d",
+               fabend->work_end_tm->tm_hour,
+               fabend->work_end_tm->tm_min);
+       xmlElemName = xmlCharStrdup("ende");
+       xmlElemContent = xmlCharStrdup(value);
+       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+       memset(value, 0, MAX_STRING_LENGTH);
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       *fabend->worktime = get_brutto_worktime(*fabend->begin, *fabend->now);
+       time_t breaktime = get_break_time(*fabend->worktime);
+       get_time_str(breaktime, value);
+       xmlElemName = xmlCharStrdup("pause");
+       xmlElemContent = xmlCharStrdup(value);
+       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+       memset(value, 0, MAX_STRING_LENGTH);
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       get_time_str(SOLL_WORKTIME, value);
+       xmlElemName = xmlCharStrdup("sollarbeitszeit");
+       xmlElemContent = xmlCharStrdup(value);
+       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+       memset(value, 0, MAX_STRING_LENGTH);
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       *fabend->worktime = get_current_worktime(*fabend->begin, *fabend->now);
+       get_time_str(*fabend->worktime, value);
+       xmlElemName = xmlCharStrdup("arbeitszeit");
+       xmlElemContent = xmlCharStrdup(value);
+       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+       memset(value, 0, MAX_STRING_LENGTH);
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       *fabend->worktime = get_current_worktime_diff_to_end_eight_hour(*fabend->begin, *fabend->now);
+       get_time_str_overtime(*fabend->worktime, value);
+       xmlElemName = xmlCharStrdup("stunden");
+       xmlElemContent = xmlCharStrdup(value);
+       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+       memset(value, 0, MAX_STRING_LENGTH);
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       *fabend->worktime *= -1;
+       *fabend->worktime += last_saldo;
+       get_time_str(*fabend->worktime, value);
+       xmlElemName = xmlCharStrdup("saldo");
+       xmlElemContent = xmlCharStrdup(value);
+       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+       memset(value, 0, MAX_STRING_LENGTH);
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       xmlTextWriterEndElement(xmlWriter);
+
+       free(value);
+       value = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free_feierabend(fabend);
+       free(fabend);
+       fabend = NULL;
+}
+
+void createEntry(int begin_hour,
+       int begin_min,
+       int end_hour,
+       int end_min)
+{
+       xmlChar* xmlElemName = NULL;
+       xmlChar* xmlElemContent = NULL;
+
+       xmlTextWriterPtr xmlWriter = xmlNewTextWriterFilename("/dev/stdout", 0);
+       xmlTextWriterSetIndent(xmlWriter, 8);
+       xmlElemContent = xmlCharStrdup("\t");
+       xmlTextWriterSetIndentString(xmlWriter, xmlElemContent);
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       xmlTextWriterStartDocument(xmlWriter, "1.0", "UTF-8", NULL);
+
+       xmlElemName = xmlCharStrdup("zeitkonto");
+       xmlTextWriterStartElement(xmlWriter, xmlElemName);
+       free(xmlElemName);
+       xmlElemName = NULL;
+
+       xmlElemName = xmlCharStrdup("anfangssaldo");
+       xmlElemContent = xmlCharStrdup("00:00");
+       xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+       free(xmlElemName);
+       xmlElemName = NULL;
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+
+       writeEntryNode(xmlWriter, NULL, begin_hour, begin_min, end_hour, end_min, 0);
+
+       xmlTextWriterEndElement(xmlWriter);
+       xmlTextWriterEndDocument(xmlWriter);
+
+       xmlFreeTextWriter(xmlWriter);
+       xmlWriter = NULL;
+
+       xmlDictCleanup();
+       xmlCleanupCharEncodingHandlers();
+
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+       free(xmlElemName);
+       xmlElemName = NULL;
+       xmlFreeTextWriter(xmlWriter);
+       xmlWriter = NULL;
+}
+
+void readLastSaldo(const char* file_path, char* value)
+{
+       xmlInitParser();
+       xmlDocPtr xmldoc = xmlReadFile(file_path, "UTF-8", 0);
+
+       if (xmldoc == NULL) {
+               printf("ERROR: could not open file: %s\n", file_path);
+               exit(EXIT_FAILURE);
+       }
+
+       xmlXPathContextPtr xmlcontext = xmlXPathNewContext(xmldoc);
+       xmlChar* expr = xmlCharStrdup("/zeitkonto/eintrag[last()]/@saldo");
+       xmlXPathObjectPtr xmlnode = xmlXPathEvalExpression(expr, xmlcontext);
+
+       if (xmlnode->nodesetval == NULL || xmlnode->nodesetval->nodeTab == NULL) {
+               free(expr);
+               expr = NULL;
+               xmlXPathFreeObject(xmlnode);
+               xmlnode = NULL;
+               expr = xmlCharStrdup("/zeitkonto/@anfangssaldo");
+               xmlnode = xmlXPathEvalExpression(expr, xmlcontext);
+       }
+
+       if (xmlnode->nodesetval->nodeTab == NULL) {
+               printf("ERROR: could not find an saldo\n");
+               xmlFreeDoc(xmldoc);
+               xmldoc = NULL;
+               xmlCleanupParser();
+
+               free(expr);
+               expr = NULL;
+               xmlXPathFreeObject(xmlnode);
+               xmlnode = NULL;
+               xmlXPathFreeContext(xmlcontext);
+               xmlcontext = NULL;
+               exit(EXIT_FAILURE);
+       }
+
+       strncpy(value,
+               (char*) xmlnode->nodesetval->nodeTab[0]->children->content,
+               MAX_STRING_LENGTH);
+
+       free(expr);
+       expr = NULL;
+       xmlXPathFreeObject(xmlnode);
+       xmlnode = NULL;
+       xmlFreeDoc(xmldoc);
+       xmldoc = NULL;
+       xmlXPathFreeContext(xmlcontext);
+       xmlcontext = NULL;
+
+       xmlCleanupParser();
+}
+
+void copyNodeAttributes(xmlTextReaderPtr xmlreader, xmlTextWriterPtr xmlwriter)
+{
+       xmlNodePtr xmlnode = NULL;
+       int attrCount = xmlTextReaderAttributeCount(xmlreader);
+       for (int i = 0; i < attrCount; i++) {
+               xmlTextReaderMoveToNextAttribute(xmlreader);
+               xmlnode = xmlTextReaderCurrentNode(xmlreader);
+               xmlTextWriterWriteAttribute(xmlwriter, xmlnode->name, xmlnode->children[0].content);
+       }
+}
+
+void addEntry(const char* date,
+       int begin_hour,
+       int begin_min,
+       int end_hour,
+       int end_min,
+       const char* file_path)
+{
+       char* saldostr = malloc(sizeof(char) * MAX_STRING_LENGTH);
+       memset(saldostr, 0, MAX_STRING_LENGTH);
+       readLastSaldo(file_path, saldostr);
+
+       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(file_path, "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);
+
+       xmlElemContent = xmlCharStrdup("eintrag");
+       while (xmlTextReaderRead(xmlreader) == 1) {
+               xmlnode = xmlTextReaderCurrentNode(xmlreader);
+               if (xmlnode->type == XML_ELEMENT_NODE && xmlStrcmp(xmlnode->name, xmlElemContent) == 0) {
+                       xmlTextWriterStartElement(xmlwriter, xmlnode->name);
+                       copyNodeAttributes(xmlreader, xmlwriter);
+                       xmlTextWriterEndElement(xmlwriter);
+               }
+       }
+
+       time_t* saldo = malloc(sizeof(time_t));
+       get_seconds_from_string(saldostr, saldo);
+       writeEntryNode(xmlwriter, date, begin_hour, begin_min, end_hour, end_min, *saldo);
+       xmlTextWriterEndElement(xmlwriter);
+       xmlTextWriterEndDocument(xmlwriter);
+
+       xmlFreeTextWriter(xmlwriter);
+       xmlTextReaderClose(xmlreader);
+       xmlFreeTextReader(xmlreader);
+
+       xmlCleanupCharEncodingHandlers();
+       xmlDictCleanup();
+
+       free(xmlElemContent);
+       xmlElemContent = NULL;
+       free(saldo);
+       saldo = NULL;
+       free(saldostr);
+       saldostr = NULL;
+}
\ No newline at end of file
diff --git a/src/xml.h b/src/xml.h
new file mode 100644 (file)
index 0000000..9af3f66
--- /dev/null
+++ b/src/xml.h
@@ -0,0 +1,16 @@
+#ifndef XML_H
+#define XML_H
+
+void initTimeAcount();
+void createEntry(int begin_hour,
+       int begin_min,
+       int end_hour,
+       int end_min);
+void addEntry(const char* date,
+       int begin_hour,
+       int begin_min,
+       int end_hour,
+       int end_min,
+       const char* file_path);
+
+#endif
\ No newline at end of file