From: Bastian Dehn Date: Sun, 7 Jul 2024 11:16:28 +0000 (+0200) Subject: change xml methods to seperate file X-Git-Tag: 1.3.0^2~3 X-Git-Url: https://gitweb.hhaalo.de/?a=commitdiff_plain;h=90df5b2321b6855f6c209cec54d75bcc7b95fee0;p=feierabend.git change xml methods to seperate file --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c26d0bc..d017290 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -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) diff --git a/src/feierabendxml.c b/src/feierabendxml.c index cde8acf..ef16c8b 100644 --- a/src/feierabendxml.c +++ b/src/feierabendxml.c @@ -1,420 +1,7 @@ #include +#include #include -#include -#include -#include -#include -#include -#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 index 0000000..bf1153c --- /dev/null +++ b/src/xml.c @@ -0,0 +1,417 @@ +#include +#include +#include +#include +#include +#include +#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 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