summaryrefslogtreecommitdiff
path: root/src/geometry
diff options
context:
space:
mode:
Diffstat (limited to 'src/geometry')
-rw-r--r--src/geometry/geometry.c30
-rw-r--r--src/geometry/geometry.h1
-rw-r--r--src/geometry/geometry.test.c49
3 files changed, 76 insertions, 4 deletions
diff --git a/src/geometry/geometry.c b/src/geometry/geometry.c
index ad23853..6f6cbae 100644
--- a/src/geometry/geometry.c
+++ b/src/geometry/geometry.c
@@ -6,12 +6,16 @@
#include "geometry.h"
+/* macro to ensure tag type matches what we expect */
+#define CHECK_TAG_TYPE(expected) \
+if (strcmp(src->type, expected) != 0) { \
+ return -1; \
+}
+
+
int kai_read_float_array(struct ka_float_array_t *dest, struct kai_tag_t *src)
{
- if (strcmp(src->type, "float_array") != 0) {
- /* incorrect tag type */
- return -1;
- }
+ CHECK_TAG_TYPE("float_array");
long count = kai_tag_attr_to_long(src, "count", -1);
if (count == -1) {
@@ -30,3 +34,21 @@ int kai_read_float_array(struct ka_float_array_t *dest, struct kai_tag_t *src)
return 0;
}
+
+
+int kai_read_param(struct ka_param_t *dest, struct kai_tag_t *src)
+{
+ CHECK_TAG_TYPE("param");
+
+ char *type = kai_tag_attr_to_dup(src, "type");
+ if (type == NULL) {
+ return -1;
+ }
+
+ dest->name = kai_tag_attr_to_dup(src, "name");
+ dest->sid = kai_tag_attr_to_dup(src, "sid");
+ dest->type = type;
+ dest->semantic = kai_tag_attr_to_dup(src, "semantic");
+
+ return 0;
+}
diff --git a/src/geometry/geometry.h b/src/geometry/geometry.h
index 1672ffa..acb27ee 100644
--- a/src/geometry/geometry.h
+++ b/src/geometry/geometry.h
@@ -5,5 +5,6 @@
#include "xml/xml.h"
int kai_read_float_array(struct ka_float_array_t *dest, struct kai_tag_t *src);
+int kai_read_param(struct ka_param_t *dest, struct kai_tag_t *src);
#endif
diff --git a/src/geometry/geometry.test.c b/src/geometry/geometry.test.c
index 56673a4..dec16e9 100644
--- a/src/geometry/geometry.test.c
+++ b/src/geometry/geometry.test.c
@@ -68,5 +68,54 @@ LILY_TEST("read normal float_array")
#include LILY_PUSH_TEST()
+LILY_TEST("fail to read non-param tag")
+{
+ struct kai_tag_t *t = kai_parse_string(
+ "<tag />"
+ );
+
+ struct ka_param_t param;
+ int result = kai_read_param(&param, t);
+ CHECK_EQ(result, -1, "%d");
+
+ kai_tag_destroy(t);
+}
+#include LILY_PUSH_TEST()
+
+
+LILY_TEST("fail to read param tag with no specified type")
+{
+ struct kai_tag_t *t = kai_parse_string(
+ "<param />"
+ );
+
+ struct ka_param_t param;
+ int result = kai_read_param(&param, t);
+ CHECK_EQ(result, -1, "%d");
+
+ kai_tag_destroy(t);
+}
+#include LILY_PUSH_TEST()
+
+
+LILY_TEST("read param tag")
+{
+ struct kai_tag_t *t = kai_parse_string(
+ "<param type=\"float\" name=\"x\" />"
+ );
+
+ struct ka_param_t param;
+ int result = kai_read_param(&param, t);
+ kai_tag_destroy(t);
+
+ REQUIRE_EQ(result, 0, "%d");
+ CHECK_EQS(param.name, "x");
+ CHECK_EQ(param.sid, NULL, "%p");
+ CHECK_EQS(param.type, "float");
+ CHECK_EQ(param.semantic, NULL, "%p");
+}
+#include LILY_PUSH_TEST()
+
+
#define LILY_FILE_END
#include LILY_REGISTER_TESTS()