summaryrefslogtreecommitdiff
path: root/libs/xml.c
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2025-09-26 16:16:33 +0200
committerAldrik Ramaekers <aldrikboy@gmail.com>2025-09-26 16:16:33 +0200
commite2321f28730adcb8d67800a434ebc7d60a6dcccb (patch)
tree32395dfa99eafd5ec0f4bc7ce41f027caf73db79 /libs/xml.c
parent69edd9082aea48a7d2ee8028c2d677f4708fc97e (diff)
refactor xml functions into xml.c library
Diffstat (limited to 'libs/xml.c')
-rw-r--r--libs/xml.c/src/xml.c178
-rw-r--r--libs/xml.c/src/xml.h25
2 files changed, 203 insertions, 0 deletions
diff --git a/libs/xml.c/src/xml.c b/libs/xml.c/src/xml.c
index 2eda83e..e88ba93 100644
--- a/libs/xml.c/src/xml.c
+++ b/libs/xml.c/src/xml.c
@@ -1139,3 +1139,181 @@ void xml_string_copy(struct xml_string* string, uint8_t* buffer, size_t length)
memcpy(buffer, string->buffer, length);
}
+s64 xml_get_s64(struct xml_node* root, char* child_name)
+{
+ struct xml_node* node = xml_easy_child(root, (uint8_t *)child_name, 0);
+
+ char xml_content[512];
+ memset(xml_content, 0, 512);
+ struct xml_string* str = xml_node_content(node);
+ xml_string_copy(str, (uint8_t *)xml_content, xml_string_length(str));
+
+ char *endptr;
+ long long val = strtoll(xml_content, &endptr, 10);
+
+ s64 num = (int64_t) val;
+ return num;
+}
+
+s32 xml_get_s32(struct xml_node* root, char* child_name)
+{
+ struct xml_node* node = xml_easy_child(root, (uint8_t *)child_name, 0);
+ if (!node) return 0;
+
+ char xml_content[512];
+ memset(xml_content, 0, 512);
+ struct xml_string* str = xml_node_content(node);
+ xml_string_copy(str, (uint8_t *)xml_content, xml_string_length(str));
+
+ char *endptr;
+ long val = strtol(xml_content, &endptr, 10);
+
+ s32 num = (int32_t) val;
+ return num;
+}
+
+struct xml_node* xml_get_node_x(struct xml_node* root, char* child_name, ...)
+{
+ va_list arguments;
+ va_start(arguments, child_name);
+
+ struct xml_node* node = xml_easy_vchild(root, (const uint8_t *)child_name, arguments);
+ return node;
+}
+
+char* xml_get_str_attribute(struct xml_node* root, char* buffer, size_t bufsize, char* attribute_name, char* child_name, ...)
+{
+ va_list arguments;
+ va_start(arguments, child_name);
+
+ struct xml_node* node = xml_easy_vchild(root, (const uint8_t *)child_name, arguments);
+ if (!node) return 0;
+
+ size_t num_attributes = xml_node_attributes(node);
+ for (int x = 0; x < num_attributes; x++)
+ {
+ struct xml_string* attr_name = xml_node_attribute_name(node, x);
+ size_t b_length = xml_string_length(attr_name);
+ uint8_t* b_buffer = (uint8_t*)alloca((b_length + 1) * sizeof(uint8_t));
+ xml_string_copy(attr_name, b_buffer, b_length);
+ b_buffer[b_length] = 0;
+
+ if (strcmp((char*)b_buffer, attribute_name) == 0) {
+ struct xml_string* attr_content = xml_node_attribute_content(node, x);
+
+ xml_string_copy(attr_content, (uint8_t *)buffer, bufsize);
+ buffer[bufsize-1] = 0;
+ return buffer;
+ }
+ }
+ return 0;
+}
+
+s32 xml_get_s32_x(struct xml_node* root, char* child_name, ...)
+{
+ va_list arguments;
+ va_start(arguments, child_name);
+
+ struct xml_node* node = xml_easy_vchild(root, (const uint8_t *)child_name, arguments);
+ if (!node) return 0;
+
+ char xml_content[512];
+ memset(xml_content, 0, 512);
+ struct xml_string* str = xml_node_content(node);
+ xml_string_copy(str, (uint8_t *)xml_content, xml_string_length(str));
+
+ char *endptr;
+ long val = strtol(xml_content, &endptr, 10);
+
+ s32 num = (int32_t) val;
+ return num;
+}
+
+float xml_get_float(struct xml_node* root, char* child_name)
+{
+ struct xml_node* node = xml_easy_child(root, (uint8_t *)child_name, 0);
+ if (!node) return 0;
+
+ char xml_content[512];
+ memset(xml_content, 0, 512);
+ struct xml_string* str = xml_node_content(node);
+ xml_string_copy(str, (uint8_t *)xml_content, xml_string_length(str));
+
+ char *endptr;
+ float val = strtof(xml_content, &endptr);
+ return val;
+}
+
+float xml_get_float_x(struct xml_node* root, char* child_name, ...)
+{
+ va_list arguments;
+ va_start(arguments, child_name);
+
+ struct xml_node* node = xml_easy_vchild(root, (const uint8_t *)child_name, arguments);
+ if (!node) return 0;
+
+ char xml_content[512];
+ memset(xml_content, 0, 512);
+ struct xml_string* str = xml_node_content(node);
+ xml_string_copy(str, (uint8_t *)xml_content, xml_string_length(str));
+
+ char *endptr;
+ float val = strtof(xml_content, &endptr);
+ return val;
+}
+
+char* xml_get_str(struct xml_node* root, char* buffer, size_t bufsize, char* child_name)
+{
+ struct xml_node* node = xml_easy_child(root, (uint8_t *)child_name, 0);
+ if (!node) return 0;
+
+ memset(buffer, 0, bufsize);
+ struct xml_string* str = xml_node_content(node);
+ xml_string_copy(str, (uint8_t *)buffer, xml_string_length(str));
+
+ return buffer;
+}
+
+char* xml_get_str_x(struct xml_node* root, char* buffer, size_t bufsize, char* child_name, ...)
+{
+ va_list arguments;
+ va_start(arguments, child_name);
+
+ struct xml_node* node = xml_easy_vchild(root, (const uint8_t *)child_name, arguments);
+ if (!node) return 0;
+
+ memset(buffer, 0, bufsize);
+ struct xml_string* str = xml_node_content(node);
+ xml_string_copy(str, (uint8_t *)buffer, xml_string_length(str));
+
+ return buffer;
+}
+
+#include <time.h>
+time_t xml_get_date_x(struct xml_node* root, char* child_name, ...)
+{
+ va_list arguments;
+ va_start(arguments, child_name);
+
+ struct xml_node* node = xml_easy_vchild(root, (const uint8_t *)child_name, arguments);
+ if (!node) return 0;
+
+ char date_buffer[11];
+ struct xml_string* str = xml_node_content(node);
+ xml_string_copy(str, (uint8_t *)date_buffer, xml_string_length(str));
+
+ struct tm tm_info = {0};
+ int year, month, day;
+ if (sscanf(date_buffer, "%d-%d-%d", &year, &month, &day) != 3) {
+ return (time_t)-1; // parse failed
+ }
+
+ tm_info.tm_year = year - 1900; // struct tm expects years since 1900
+ tm_info.tm_mon = month - 1; // struct tm months are 0–11
+ tm_info.tm_mday = day;
+ tm_info.tm_hour = 0;
+ tm_info.tm_min = 0;
+ tm_info.tm_sec = 0;
+
+ return mktime(&tm_info) + 86400; // Hack
+} \ No newline at end of file
diff --git a/libs/xml.c/src/xml.h b/libs/xml.c/src/xml.h
index b5ce81f..65a7b9f 100644
--- a/libs/xml.c/src/xml.h
+++ b/libs/xml.c/src/xml.h
@@ -188,6 +188,31 @@ size_t xml_string_length(struct xml_string* string);
*/
void xml_string_copy(struct xml_string* string, uint8_t* buffer, size_t length);
+#include "stdint.h"
+
+#define s8 int8_t
+#define s16 int16_t
+#define s32 int32_t
+#define s64 int64_t
+
+#define u8 uint8_t
+#define u16 uint16_t
+#define u32 uint32_t
+#define u64 uint64_t
+
+/// Custom OpenBooks functions.
+s64 xml_get_s64(struct xml_node* root, char* child_name);
+s32 xml_get_s32(struct xml_node* root, char* child_name);
+struct xml_node* xml_get_node_x(struct xml_node* root, char* child_name, ...);
+char* xml_get_str_attribute(struct xml_node* root, char* buffer, size_t bufsize, char* attribute_name, char* child_name, ...);
+s32 xml_get_s32_x(struct xml_node* root, char* child_name, ...);
+float xml_get_float(struct xml_node* root, char* child_name);
+float xml_get_float_x(struct xml_node* root, char* child_name, ...);
+char* xml_get_str(struct xml_node* root, char* buffer, size_t bufsize, char* child_name);
+char* xml_get_str_x(struct xml_node* root, char* buffer, size_t bufsize, char* child_name, ...);
+time_t xml_get_date_x(struct xml_node* root, char* child_name, ...);
+
+
#ifdef __cplusplus
}
#endif