]> gitweb.hhaalo.de Git - feierabend.git/commitdiff
read xml file into memory
authorBastian Dehn <hhaalo@arcor.de>
Mon, 9 Dec 2024 17:37:38 +0000 (18:37 +0100)
committerBastian Dehn <hhaalo@arcor.de>
Mon, 9 Dec 2024 17:37:38 +0000 (18:37 +0100)
src/xml.c
src/xml.h

index 27117e85bd6f45c9ef45ac0eaa572f117dfd3ef2..c9f71f33fac04be201ba055bc9450e3808346e92 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 <stdio.h>
 #include <glob.h>
 #include "xml.h"
 #include "feierabend.h"
 
 #define MAX_STRING_LENGTH 36
 
+void init_memFile(memFile* mem) {
+       mem->data = malloc(sizeof(char*));
+       mem->size = malloc(sizeof(size_t));
+}
+
+void free_memFile(memFile* mem) {
+       free(*mem->data);
+       free(mem->data);
+       free(mem->size);
+       mem->data = NULL;
+       mem->size = NULL;
+}
+
 void init_feierabend(feierabend* fabend)
 {
        fabend->now = malloc(sizeof(time_t));
@@ -37,6 +51,22 @@ void free_feierabend(feierabend* fabend)
        fabend->timestr = NULL;
 }
 
+void readFileIntoMemory(const char* file_path, memFile* mem)
+{
+       char* buf = malloc(sizeof(char));
+       FILE* memstream = open_memstream(mem->data, mem->size);
+       FILE* file = fopen(file_path, "r");
+
+       while(fread(buf, sizeof(char), 1, file) != 0) {
+               fwrite(buf, sizeof(char), 1, memstream);
+       }
+       fclose(file);
+       fclose(memstream);
+
+       free(buf);
+       buf = NULL;
+}
+
 void initTimeAcount()
 {
        xmlChar* xmlElemName = NULL;
@@ -364,6 +394,10 @@ void addEntry(const char* date,
        int end_min,
        const char* file_path)
 {
+       memFile* fileContent = malloc(sizeof(memFile));
+       init_memFile(fileContent);
+       readFileIntoMemory(file_path, fileContent);
+
        char* saldostr = malloc(sizeof(char) * MAX_STRING_LENGTH);
        memset(saldostr, 0, MAX_STRING_LENGTH);
        readLastSaldo(file_path, saldostr);
@@ -376,7 +410,7 @@ void addEntry(const char* date,
        free(xmlElemContent);
        xmlElemContent = NULL;
 
-       xmlTextReaderPtr xmlreader = xmlReaderForFile(file_path, "UTF-8", 0);
+       xmlTextReaderPtr xmlreader = xmlReaderForMemory(*fileContent->data, *fileContent->size, NULL, "UTF-8", 0);
        xmlNodePtr xmlnode = NULL;
 
        xmlTextWriterStartDocument(xmlwriter, "1.0", "UTF-8", NULL);
@@ -410,6 +444,9 @@ void addEntry(const char* date,
        xmlCleanupCharEncodingHandlers();
        xmlDictCleanup();
 
+       free_memFile(fileContent);
+       free(fileContent);
+       fileContent = NULL;
        free(xmlElemContent);
        xmlElemContent = NULL;
        free(saldo);
index bf00052b4e3d4a17971c89c3a570ceb244520c01..11989254916789e7ed0a2d00bd29144a6a3dbec8 100644 (file)
--- a/src/xml.h
+++ b/src/xml.h
@@ -1,6 +1,11 @@
 #ifndef XML_H
 #define XML_H
 
+typedef struct {
+       char** data;
+       size_t* size;
+} memFile;
+
 void initTimeAcount();
 void createEntry(int begin_hour,
        int begin_min,