#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); }