From 08d5f9ca86ad4dd3ab89bf7dacb5803989db3d9b Mon Sep 17 00:00:00 2001 From: Juri Glass Date: Thu, 18 Aug 2011 13:42:47 +0200 Subject: [PATCH] first sml_tree implementation and tests --- sml/include/sml/sml_tree.h | 40 +++++++++--------- sml/src/sml_tree.c | 87 +++++++++++++++++++++++++++++++++++--- test/Makefile | 1 + test/src/sml_tree_test.c | 73 ++++++++++++++++++++++++++++++++ test/test_main.c | 2 + 5 files changed, 178 insertions(+), 25 deletions(-) create mode 100644 test/src/sml_tree_test.c 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);