#define MAX_STRING_LENGTH 36
#define CHUCK_SIZE 32
-memFile* init_memFile() {
+memFile* _init_memFile() {
memFile* mem = malloc(sizeof(memFile));
if (mem == NULL)
mem->data = NULL;
}
-void alloc_chunk(memFile* mem)
+void _alloc_chunk(memFile* mem)
{
mem->size += CHUCK_SIZE;
char* tmpmem = realloc(mem->data, sizeof(char) * mem->size);
mem->data = tmpmem;
}
-void shrink_mem(size_t readed, memFile* mem)
+void _shrink_mem(size_t readed, memFile* mem)
{
mem->size = readed;
char* tmpmem = realloc(mem->data, sizeof(char) * mem->size);
mem->data = tmpmem;
}
-void read_stdin_into_memory(memFile* mem)
+void _read_stdin_into_memory(memFile* mem)
{
char* buf = malloc(sizeof(char));
if (buf == NULL)
return;
- alloc_chunk(mem);
+ _alloc_chunk(mem);
size_t read_size = 0;
uint8_t current_chunk = CHUCK_SIZE;
while(fread(buf, sizeof(char), 1, stdin) != 0) {
read_size++;
current_chunk--;
if (current_chunk == 0) {
- alloc_chunk(mem);
+ _alloc_chunk(mem);
current_chunk = CHUCK_SIZE;
}
}
- shrink_mem(read_size, mem);
+ _shrink_mem(read_size, mem);
free(buf);
buf = NULL;
}
-void init_time_acount()
+char* _read_last_saldo(memFile* mem)
{
- xmlChar* xmlElemName = NULL;
- xmlChar* xmlElemContent = NULL;
+ char* saldostr = malloc(sizeof(char) * MAX_STRING_LENGTH);
+ if (saldostr == NULL)
+ return NULL;
- xmlCharEncodingHandlerPtr encodingHandler = xmlGetCharEncodingHandler(XML_CHAR_ENCODING_UTF8);
- xmlOutputBufferPtr xmloutbuffer = xmlOutputBufferCreateFd(1, encodingHandler);
- xmlTextWriterPtr xmlWriter = xmlNewTextWriter(xmloutbuffer);
- xmlTextWriterSetIndent(xmlWriter, 8);
- xmlElemContent = xmlCharStrdup("\t");
- xmlTextWriterSetIndentString(xmlWriter, xmlElemContent);
- free(xmlElemContent);
- xmlElemContent = NULL;
+ xmlInitParser();
+ xmlDocPtr xmldoc = xmlReadMemory(mem->data, mem->size, NULL, "UTF-8", 0);
- xmlTextWriterStartDocument(xmlWriter, "1.0", "UTF-8", NULL);
+ if (xmldoc == NULL) {
+ printf("ERROR: could not open memstream\n");
+ exit(EXIT_FAILURE);
+ }
- xmlElemName = xmlCharStrdup("zeitkonto");
- xmlTextWriterStartElement(xmlWriter, xmlElemName);
- free(xmlElemName);
- xmlElemName = NULL;
+ xmlXPathContextPtr xmlcontext = xmlXPathNewContext(xmldoc);
+ xmlChar* expr = xmlCharStrdup("/zeitkonto/eintrag[last()]/@saldo");
+ xmlXPathObjectPtr xmlnode = xmlXPathEvalExpression(expr, xmlcontext);
- xmlElemName = xmlCharStrdup("anfangssaldo");
- xmlElemContent = xmlCharStrdup("00:00");
- xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
- free(xmlElemName);
- xmlElemName = NULL;
- free(xmlElemContent);
- xmlElemContent = NULL;
+ if (xmlnode->nodesetval == NULL || xmlnode->nodesetval->nodeTab == NULL) {
+ free(expr);
+ expr = NULL;
+ xmlXPathFreeObject(xmlnode);
+ xmlnode = NULL;
+ expr = xmlCharStrdup("/zeitkonto/@anfangssaldo");
+ xmlnode = xmlXPathEvalExpression(expr, xmlcontext);
+ }
- xmlTextWriterEndElement(xmlWriter);
- xmlTextWriterEndDocument(xmlWriter);
+ if (xmlnode->nodesetval->nodeTab == NULL) {
+ printf("ERROR: could not find an saldo\n");
+ xmlFreeDoc(xmldoc);
+ xmldoc = NULL;
+ xmlCleanupParser();
- xmlFreeTextWriter(xmlWriter);
- xmlWriter = NULL;
+ free(expr);
+ expr = NULL;
+ xmlXPathFreeObject(xmlnode);
+ xmlnode = NULL;
+ xmlXPathFreeContext(xmlcontext);
+ xmlcontext = NULL;
+ exit(EXIT_FAILURE);
+ }
-#ifdef LIBXML2_15
+ strncpy(saldostr,
+ (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();
-#else
- xmlDictCleanup();
- xmlCleanupCharEncodingHandlers();
-#endif
+
+ return saldostr;
+}
+
+void _copy_node_attributes(xmlTextReaderPtr xmlreader, xmlTextWriterPtr xmlwriter)
+{
+ int attrCount = xmlTextReaderAttributeCount(xmlreader);
+ for (int i = 0; i < attrCount; i++) {
+ xmlTextReaderMoveToNextAttribute(xmlreader);
+ xmlNodePtr xmlnode = xmlTextReaderCurrentNode(xmlreader);
+ xmlTextWriterWriteAttribute(xmlwriter, xmlnode->name, xmlnode->children[0].content);
+ }
+}
+
+void _copy_entry(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);
+ _copy_node_attributes(xmlreader, xmlwriter);
+ xmlTextWriterEndElement(xmlwriter);
+ }
free(xmlElemContent);
xmlElemContent = NULL;
- free(xmlElemName);
- xmlElemName = NULL;
}
-void write_entry_node(xmlTextWriterPtr xmlWriter,
+void _write_entry_node(xmlTextWriterPtr xmlWriter,
const char* date,
uint8_t begin_hour,
uint8_t begin_min,
xmlElemName = NULL;
}
-void read_last_saldo(memFile* mem, char* value)
+void init_time_acount()
{
- xmlInitParser();
- xmlDocPtr xmldoc = xmlReadMemory(mem->data, mem->size, NULL, "UTF-8", 0);
-
- if (xmldoc == NULL) {
- printf("ERROR: could not open memstream\n");
- exit(EXIT_FAILURE);
- }
+ xmlChar* xmlElemName = NULL;
+ xmlChar* xmlElemContent = NULL;
- xmlXPathContextPtr xmlcontext = xmlXPathNewContext(xmldoc);
- xmlChar* expr = xmlCharStrdup("/zeitkonto/eintrag[last()]/@saldo");
- xmlXPathObjectPtr xmlnode = xmlXPathEvalExpression(expr, xmlcontext);
+ xmlCharEncodingHandlerPtr encodingHandler = xmlGetCharEncodingHandler(XML_CHAR_ENCODING_UTF8);
+ xmlOutputBufferPtr xmloutbuffer = xmlOutputBufferCreateFd(1, encodingHandler);
+ xmlTextWriterPtr xmlWriter = xmlNewTextWriter(xmloutbuffer);
+ xmlTextWriterSetIndent(xmlWriter, 8);
+ xmlElemContent = xmlCharStrdup("\t");
+ xmlTextWriterSetIndentString(xmlWriter, xmlElemContent);
+ free(xmlElemContent);
+ xmlElemContent = NULL;
- if (xmlnode->nodesetval == NULL || xmlnode->nodesetval->nodeTab == NULL) {
- free(expr);
- expr = NULL;
- xmlXPathFreeObject(xmlnode);
- xmlnode = NULL;
- expr = xmlCharStrdup("/zeitkonto/@anfangssaldo");
- xmlnode = xmlXPathEvalExpression(expr, xmlcontext);
- }
+ xmlTextWriterStartDocument(xmlWriter, "1.0", "UTF-8", NULL);
- if (xmlnode->nodesetval->nodeTab == NULL) {
- printf("ERROR: could not find an saldo\n");
- xmlFreeDoc(xmldoc);
- xmldoc = NULL;
- xmlCleanupParser();
+ xmlElemName = xmlCharStrdup("zeitkonto");
+ xmlTextWriterStartElement(xmlWriter, xmlElemName);
+ free(xmlElemName);
+ xmlElemName = NULL;
- free(expr);
- expr = NULL;
- xmlXPathFreeObject(xmlnode);
- xmlnode = NULL;
- xmlXPathFreeContext(xmlcontext);
- xmlcontext = NULL;
- exit(EXIT_FAILURE);
- }
+ xmlElemName = xmlCharStrdup("anfangssaldo");
+ xmlElemContent = xmlCharStrdup("00:00");
+ xmlTextWriterWriteAttribute(xmlWriter, xmlElemName, xmlElemContent);
+ free(xmlElemName);
+ xmlElemName = NULL;
+ free(xmlElemContent);
+ xmlElemContent = NULL;
- strncpy(value,
- (char*) xmlnode->nodesetval->nodeTab[0]->children->content,
- MAX_STRING_LENGTH);
+ xmlTextWriterEndElement(xmlWriter);
+ xmlTextWriterEndDocument(xmlWriter);
- free(expr);
- expr = NULL;
- xmlXPathFreeObject(xmlnode);
- xmlnode = NULL;
- xmlFreeDoc(xmldoc);
- xmldoc = NULL;
- xmlXPathFreeContext(xmlcontext);
- xmlcontext = NULL;
+ xmlFreeTextWriter(xmlWriter);
+ xmlWriter = NULL;
+#ifdef LIBXML2_15
xmlCleanupParser();
-}
+#else
+ xmlDictCleanup();
+ xmlCleanupCharEncodingHandlers();
+#endif
-void copy_node_attributes(xmlTextReaderPtr xmlreader, xmlTextWriterPtr xmlwriter)
-{
- int attrCount = xmlTextReaderAttributeCount(xmlreader);
- for (int i = 0; i < attrCount; i++) {
- xmlTextReaderMoveToNextAttribute(xmlreader);
- xmlNodePtr xmlnode = xmlTextReaderCurrentNode(xmlreader);
- xmlTextWriterWriteAttribute(xmlwriter, xmlnode->name, xmlnode->children[0].content);
- }
+ free(xmlElemContent);
+ xmlElemContent = NULL;
+ free(xmlElemName);
+ xmlElemName = NULL;
}
void add_entry(const char* date,
uint8_t end_hour,
uint8_t end_min)
{
- memFile* fileContent = init_memFile();
- read_stdin_into_memory(fileContent);
-
- char* saldostr = malloc(sizeof(char) * MAX_STRING_LENGTH);
- if (saldostr == NULL)
- return;
+ memFile* fileContent = _init_memFile();
+ _read_stdin_into_memory(fileContent);
- memset(saldostr, 0, MAX_STRING_LENGTH);
- read_last_saldo(fileContent, saldostr);
+ char* saldostr = _read_last_saldo(fileContent);
const time_t saldo = get_seconds_from_str(saldostr);
xmlChar* xmlElemContent = NULL;
xmlTextReaderRead(xmlreader);
xmlnode = xmlTextReaderCurrentNode(xmlreader);
xmlTextWriterStartElement(xmlwriter, xmlnode->name);
- copy_node_attributes(xmlreader, xmlwriter);
+ _copy_node_attributes(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);
- copy_node_attributes(xmlreader, xmlwriter);
+ _copy_node_attributes(xmlreader, xmlwriter);
xmlTextWriterEndElement(xmlwriter);
}
}
- write_entry_node(xmlwriter, date, begin_hour, begin_min, end_hour, end_min, saldo);
+ _write_entry_node(xmlwriter, date, begin_hour, begin_min, end_hour, end_min, saldo);
xmlTextWriterEndElement(xmlwriter);
xmlTextWriterEndDocument(xmlwriter);
saldostr = NULL;
}
-void copy_entry(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);
- copy_node_attributes(xmlreader, xmlwriter);
- xmlTextWriterEndElement(xmlwriter);
- }
-
- free(xmlElemContent);
- xmlElemContent = NULL;
-}
-
void merge(const char* dir)
{
glob_t* files = malloc(sizeof(glob_t));
xmlTextReaderRead(xmlreader);
xmlnode = xmlTextReaderCurrentNode(xmlreader);
xmlTextWriterStartElement(xmlwriter, xmlnode->name);
- copy_node_attributes(xmlreader, xmlwriter);
+ _copy_node_attributes(xmlreader, xmlwriter);
xmlTextReaderClose(xmlreader);
xmlFreeTextReader(xmlreader);
xmlreader = NULL;
for (size_t i = 0; i < files->gl_pathc; i++) {
xmlreader = xmlReaderForFile(files->gl_pathv[i], "UTF-8", 0);
while (xmlTextReaderRead(xmlreader) == 1) {
- copy_entry(xmlreader, xmlwriter);
+ _copy_entry(xmlreader, xmlwriter);
}
xmlTextReaderClose(xmlreader);
xmlFreeTextReader(xmlreader);