diff options
Diffstat (limited to 'src/kalmia.c')
-rw-r--r-- | src/kalmia.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/kalmia.c b/src/kalmia.c new file mode 100644 index 0000000..1ae0588 --- /dev/null +++ b/src/kalmia.c @@ -0,0 +1,54 @@ +#include <kalmia.h> +#include "geometry/geometry.h" +#include "util/util.h" +#include "xml/xml.h" + + +struct kalmia_t * kalmia_parse_file(const char *filename) +{ + struct kai_tag_t *document = kai_parse_file(filename); + if (document == NULL) { + return NULL; + } + + struct kai_tag_t *lib; + + /* create kalmia_t */ + struct kalmia_t *k = kai_alloc(sizeof(struct kalmia_t), "kalmia_t"); + if (k == NULL) { + kai_tag_destroy(document); + return NULL; + } + + /* parse geometry */ + lib = kai_tag_get_first_child_with_type(document, "library_geometries"); + if (lib == NULL) { + /* no geometry to read */ + k->library_geometries = NULL; + } + else { + k->library_geometries = kai_alloc(sizeof(struct ka_library_geometries_t), "library_geometries"); + if (k->library_geometries == NULL) { + kai_tag_destroy(document); + free(k); + return NULL; + } + kai_read_library_geometries(k->library_geometries, lib); + } + + /* clean up */ + kai_tag_destroy(document); + + return k; +} + + +void kalmia_destroy(struct kalmia_t *k) +{ + if (k->library_geometries != NULL) { + kai_release_library_geometries(*(k->library_geometries)); + free(k->library_geometries); + } + + free(k); +} |