diff --git a/sml/include/sml/sml_tree.h b/sml/include/sml/sml_tree.h
index 217d987..d7336ab 100644
--- a/sml/include/sml/sml_tree.h
+++ b/sml/include/sml/sml_tree.h
@@ -28,14 +28,11 @@
extern "C" {
#endif
+#define SML_PROC_PAR_VALUE_TAG_VALUE 0x01
+#define SML_PROC_PAR_VALUE_TAG_PERIOD_ENTRY 0x02
+#define SML_PROC_PAR_VALUE_TAG_TUPEL_ENTRY 0x03
+#define SML_PROC_PAR_VALUE_TAG_TIME 0x04
-#define SML_PROC_PAR_VALUE_TAG_VALUE 0x01
-#define SML_PROC_PAR_VALUE_TAG_PERIOD_ENTRY 0x02
-#define SML_PROC_PAR_VALUE_TAG_TUPEL_ENTRY 0x03
-#define SML_PROC_PAR_VALUE_TAG_TIME 0x04
-
-
-// TODO
typedef struct {
u8 *tag;
union {
@@ -46,32 +43,35 @@ typedef struct {
} data;
} sml_proc_par_value;
+typedef struct s_tree{
+ octet_string *parameter_name;
+ sml_proc_par_value *parameter_value; // optional
+ struct s_tree **child_list; // optional
+
+ int child_list_len;
+} sml_tree;
+
typedef struct {
octet_string **path_entries;
int path_entries_len;
} sml_tree_path;
-typedef struct s_tree{
- octet_string *parameter_name;
- sml_proc_par_value *parameter_value; // optional
- struct s_tree **child_list; // optional
- int child_list_len;
-} sml_tree;
+// SML_TREE
+sml_tree *sml_tree_init();
+sml_tree *sml_tree_parse(sml_buffer *buf);
+void sml_tree_write(sml_tree *tree, sml_buffer *buf);
+void sml_tree_free(sml_tree *tree);
// SML_TREE_PATH
sml_tree_path *sml_tree_path_init();
+sml_tree_path *sml_tree_path_parse(sml_buffer *buf);
void sml_tree_path_add_path_entry(sml_tree_path *tree_path, octet_string *entry);
void sml_tree_path_write(sml_tree_path *tree_path, sml_buffer *buf);
void sml_tree_path_free(sml_tree_path *tree_path);
-// SML_TREE
-sml_tree *sml_tree_init(octet_string *parameter_name);
-void sml_tree_write(sml_tree *tree, sml_buffer *buf);
-sml_tree *sml_tree_parse(sml_buffer *buf);
-void sml_tree_free(sml_tree *tree);
-
// SML_PROC_PAR_VALUE
-sml_proc_par_value *sml_proc_par_value_init(u8 tag, void *data);
+sml_proc_par_value *sml_proc_par_value_init();
+sml_proc_par_value *sml_proc_par_value_parse(sml_buffer *buf);
void sml_proc_par_value_write(sml_proc_par_value *value, sml_buffer *buf);
void sml_proc_par_value_free(sml_proc_par_value *value);
diff --git a/sml/src/sml_tree.c b/sml/src/sml_tree.c
index ae4a1af..2691df2 100644
--- a/sml/src/sml_tree.c
+++ b/sml/src/sml_tree.c
@@ -27,6 +27,11 @@ sml_tree_path *sml_tree_path_init() {
return tree_path;
}
+sml_tree_path *sml_tree_path_parse(sml_buffer *buf) {
+ printf("NYI: %s\n", __FUNCTION__);
+ return 0;
+}
+
void sml_tree_path_add_path_entry(sml_tree_path *tree_path, octet_string *entry) {
tree_path->path_entries_len++;
tree_path->path_entries = (octet_string **) realloc(tree_path->path_entries, sizeof(octet_string *) * tree_path->path_entries_len);
@@ -73,12 +78,13 @@ void sml_tree_write(sml_tree *tree, sml_buffer *buf) {
sml_buf_optional_write(buf);
}
-sml_proc_par_value *sml_proc_par_value_init(u8 tag, void *data) {
+sml_proc_par_value *sml_proc_par_value_init() {
sml_proc_par_value *value = (sml_proc_par_value *) malloc(sizeof(sml_proc_par_value));
memset(value, 0, sizeof(sml_proc_par_value));
- value->tag = sml_u8_init(tag);
+ //value->tag = sml_u8_init(tag);
+/*
switch (*(value->tag)) {
case SML_PROC_PAR_VALUE_TAG_VALUE:
value->data.value = (sml_value*)data;
@@ -98,10 +104,51 @@ sml_proc_par_value *sml_proc_par_value_init(u8 tag, void *data) {
}
return 0;
}
-
+*/
return value;
}
+sml_proc_par_value *sml_proc_par_value_parse(sml_buffer *buf) {
+ sml_proc_par_value *ppv = sml_proc_par_value_init();
+
+ if (sml_buf_get_next_type(buf) != SML_TYPE_LIST) {
+ buf->error = 1;
+ goto error;
+ }
+
+ if (sml_buf_get_next_length(buf) != 2) {
+ buf->error = 1;
+ goto error;
+ }
+
+ ppv->tag = sml_u8_parse(buf);
+ if (sml_buf_has_errors(buf)) goto error;
+
+ switch (*(ppv->tag)) {
+ case SML_PROC_PAR_VALUE_TAG_VALUE:
+ ppv->data.value = sml_value_parse(buf);
+ break;
+ case SML_PROC_PAR_VALUE_TAG_PERIOD_ENTRY:
+ printf("TODO: %s\n", __FUNCTION__);
+ break;
+ case SML_PROC_PAR_VALUE_TAG_TUPEL_ENTRY:
+ printf("TODO: %s\n", __FUNCTION__);
+ break;
+ case SML_PROC_PAR_VALUE_TAG_TIME:
+ ppv->data.time = sml_time_parse(buf);
+ break;
+ default:
+ buf->error = 1;
+ goto error;
+ }
+
+ return ppv;
+
+error:
+ sml_proc_par_value_free(ppv);
+ return 0;
+}
+
void sml_proc_par_value_write(sml_proc_par_value *value, sml_buffer *buf) {
sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 2);
sml_u8_write(value->tag, buf);
@@ -128,6 +175,36 @@ void sml_proc_par_value_write(sml_proc_par_value *value, sml_buffer *buf) {
}
-void sml_proc_par_value_free(sml_proc_par_value *value){
- printf("NYI: %s\n", __FUNCTION__);
+void sml_proc_par_value_free(sml_proc_par_value *ppv){
+ if (ppv) {
+
+ if (ppv->tag) {
+ switch (*(ppv->tag)) {
+ case SML_PROC_PAR_VALUE_TAG_VALUE:
+ sml_value_free(ppv->data.value);
+ break;
+ case SML_PROC_PAR_VALUE_TAG_PERIOD_ENTRY:
+ printf("TODO: %s\n", __FUNCTION__);
+ break;
+ case SML_PROC_PAR_VALUE_TAG_TUPEL_ENTRY:
+ printf("TODO: %s\n", __FUNCTION__);
+ break;
+ case SML_PROC_PAR_VALUE_TAG_TIME:
+ sml_time_free(ppv->data.time);
+ break;
+ default:
+ if (ppv->data.value) {
+ free(ppv->data.value);
+ }
+ }
+ sml_number_free(ppv->tag);
+ }
+ else {
+ // Without the tag, there might be a memory leak.
+ if (ppv->data.value) {
+ free(ppv->data.value);
+ }
+ }
+ free(ppv);
+ }
}
diff --git a/test/Makefile b/test/Makefile
index 8841875..87f376e 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -20,6 +20,7 @@ OBJS = \
src/sml_status_test.o \
src/sml_list_test.o \
src/sml_time_test.o \
+ src/sml_tree_test.o \
src/sml_file_test.o \
src/sml_open_request_test.o \
src/sml_message_test.o
diff --git a/test/src/sml_tree_test.c b/test/src/sml_tree_test.c
new file mode 100644
index 0000000..3096e21
--- /dev/null
+++ b/test/src/sml_tree_test.c
@@ -0,0 +1,73 @@
+// Copyright 2011 Juri Glass, Mathias Runge, Nadim El Sayed
+// DAI-Labor, TU-Berlin
+//
+// This file is part of libSML.
+//
+// libSML is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// libSML is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with libSML. If not, see .
+
+#include "../unity/unity_fixture.h"
+#include "test_helper.h"
+#include
+
+TEST_GROUP(sml_tree);
+
+sml_buffer *buf;
+
+TEST_SETUP(sml_tree) {
+ buf = sml_buffer_init(512);
+}
+
+TEST_TEAR_DOWN(sml_tree) {
+ sml_buffer_free(buf);
+}
+
+TEST(sml_tree, init) {
+ sml_tree *t = sml_tree_init();
+ TEST_ASSERT_NOT_NULL(t);
+}
+
+TEST_GROUP_RUNNER(sml_tree) {
+ RUN_TEST_CASE(sml_tree, init);
+}
+
+
+
+
+TEST_GROUP(sml_proc_par_value);
+
+TEST_SETUP(sml_proc_par_value) {
+ buf = sml_buffer_init(512);
+}
+
+TEST_TEAR_DOWN(sml_proc_par_value) {
+ sml_buffer_free(buf);
+}
+
+TEST(sml_proc_par_value, init) {
+ sml_proc_par_value *t = sml_proc_par_value_init();
+ TEST_ASSERT_NOT_NULL(t);
+}
+
+TEST(sml_proc_par_value, parse_time) {
+ hex2binary("72620472620265000000FF", sml_buf_get_current_buf(buf));
+ sml_proc_par_value *t = sml_proc_par_value_parse(buf);
+ TEST_ASSERT_NOT_NULL(t);
+ TEST_ASSERT_EQUAL(SML_PROC_PAR_VALUE_TAG_TIME, *(t->tag));
+}
+
+TEST_GROUP_RUNNER(sml_proc_par_value) {
+ RUN_TEST_CASE(sml_proc_par_value, init);
+ RUN_TEST_CASE(sml_proc_par_value, parse_time);
+}
+
diff --git a/test/test_main.c b/test/test_main.c
index 36833a5..8045095 100644
--- a/test/test_main.c
+++ b/test/test_main.c
@@ -27,6 +27,8 @@ static void runAllTests() {
RUN_TEST_GROUP(sml_status);
RUN_TEST_GROUP(sml_list);
RUN_TEST_GROUP(sml_time);
+ RUN_TEST_GROUP(sml_tree);
+ RUN_TEST_GROUP(sml_proc_par_value);
RUN_TEST_GROUP(sml_open_request);
RUN_TEST_GROUP(sml_message);
RUN_TEST_GROUP(sml_file);