diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/geometry/geometry.c | 26 | ||||
-rw-r--r-- | src/geometry/geometry.h | 2 | ||||
-rw-r--r-- | src/util/util.c | 11 | ||||
-rw-r--r-- | src/util/util.h | 3 |
4 files changed, 34 insertions, 8 deletions
diff --git a/src/geometry/geometry.c b/src/geometry/geometry.c index 1d26a70..7046f1e 100644 --- a/src/geometry/geometry.c +++ b/src/geometry/geometry.c @@ -6,24 +6,36 @@ #include "geometry.h" -void kai_parse_float_array(struct ka_float_array_t *dest, ezxml_t src) +int kai_parse_float_array(struct ka_float_array_t *dest, ezxml_t src) { + /* get count */ + const char *count = ezxml_attr(src, "count"); + if (count == NULL) { + fprintf(stderr, "[kalmia] ERROR: required \"count\" parameter not present for float_array\n"); + return -1; + } + char *end; + dest->count = strtol(count, &end, 10); + /* get id, if present */ const char *id = ezxml_attr(src, "id"); if (id != NULL) { size_t id_len = strlen(id) + 1; - dest->id = malloc(sizeof(char) * id_len); + dest->id = kai_alloc(sizeof(char) * id_len, "float_array id"); + if (dest->id == NULL) { + return -1; + } strncpy(dest->id, id, id_len); } else { dest->id = NULL; } - /* get count */ - const char *count = ezxml_attr(src, "count"); - dest->count = strtol(count, NULL, 10); - /* parse floats */ - dest->data = malloc(sizeof(ka_real_t) * dest->count); + dest->data = kai_alloc(sizeof(ka_real_t) * dest->count, "float_array data"); + if (dest->data == NULL) { + free(dest->id); + return -1; + } kai_text_to_reals(dest->data, ezxml_txt(src), dest->count); } diff --git a/src/geometry/geometry.h b/src/geometry/geometry.h index 7da5c3d..6268e3b 100644 --- a/src/geometry/geometry.h +++ b/src/geometry/geometry.h @@ -4,6 +4,6 @@ #include <kalmia.h> #include <ezxml.h> -void kai_parse_float_array(struct ka_float_array_t *dest, ezxml_t src); +int kai_parse_float_array(struct ka_float_array_t *dest, ezxml_t src); #endif diff --git a/src/util/util.c b/src/util/util.c index 00561b7..4f79870 100644 --- a/src/util/util.c +++ b/src/util/util.c @@ -62,3 +62,14 @@ size_t kai_text_to_longs(long *dest, const char *str, size_t count) return result; } + + +void *kai_alloc(size_t size, const char *purpose) +{ + void *buf = malloc(size); + if (buf == NULL) { + fprintf(stderr, "[kalmia] ERROR: failed to allocated %ul-byte buffer for %s\n", size, purpose); + return NULL; + } + return buf; +} diff --git a/src/util/util.h b/src/util/util.h index 0b6bc15..d5fa636 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -34,4 +34,7 @@ size_t kai_text_to_reals(ka_real_t *dest, const char *str, size_t count); size_t kai_text_to_longs(long *dest, const char *str, size_t count); + +void *kai_alloc(size_t size, const char *purpose); + #endif |