diff options
Diffstat (limited to 'libs')
| -rw-r--r-- | libs/xml.c/src/xml.c | 178 | ||||
| -rw-r--r-- | libs/xml.c/src/xml.h | 25 |
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 |
