IF(${LibXml2_FOUND})
ADD_EXECUTABLE(${PROJECT_NAME}xml
feierabendxml.c
+ xml.c
time_format.c
worktime.c
break.c)
#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[])
{
--- /dev/null
+#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
--- /dev/null
+#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