From e68e6d4e433fe42a0c6df18b2f2d7990b91b7cd6 Mon Sep 17 00:00:00 2001 From: sanine Date: Sat, 10 Dec 2022 21:26:05 -0600 Subject: add basic float_array parsing --- src/geometry/geometry.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 src/geometry/geometry.c (limited to 'src/geometry/geometry.c') diff --git a/src/geometry/geometry.c b/src/geometry/geometry.c new file mode 100644 index 0000000..be9ce25 --- /dev/null +++ b/src/geometry/geometry.c @@ -0,0 +1,71 @@ +#include +#include + +#include +#include +#include "geometry.h" + + +static int copy_str(char **dest, const char *src) +{ + if (src == NULL) { + *dest = NULL; + return 0; + } + + size_t len = strlen(src)+1; + *dest = malloc(len * sizeof(char)); + if (*dest == NULL) + return -1; + strncpy(*dest, src, len); + return 0; +} + + +ka_float_array_t * kai_parse_float_array(ezxml_t tag) +{ + if (strcmp(ezxml_name(tag), "float_array") != 0) { + /* wrong tag type */ + return NULL; + } + + /* allocate struct */ + ka_float_array_t *a = malloc(sizeof(ka_float_array_t)); + if (a == NULL) return NULL; + + /* inspect attributes */ + const char *count_str = ezxml_attr(tag, "count"); + a->count = strtol(count_str, NULL, 10); + + const char *id_str = ezxml_attr(tag, "id"); + if (copy_str(&(a->id), id_str) < 0) { + free(a); + return NULL; + } + + /* parse data */ + a->array = malloc(a->count * sizeof(ka_real_t)); + if (a->array == NULL) { + free(a->id); + free(a); + return NULL; + } + + char *data = ezxml_txt(tag); + char *end; + int i; + for (i=0; icount; i++) { + a->array[i] = KA_STR_TO_REAL(data, &end); + data = end; + } + + return a; +} + + +void kai_free_float_array(ka_float_array_t *a) +{ + free(a->array); + free(a->id); + free(a); +} -- cgit v1.2.1