first sml_tree implementation and tests
This commit is contained in:
parent
5ab0ecca2d
commit
08d5f9ca86
5 changed files with 178 additions and 25 deletions
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
73
test/src/sml_tree_test.c
Normal file
73
test/src/sml_tree_test.c
Normal file
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include "../unity/unity_fixture.h"
|
||||
#include "test_helper.h"
|
||||
#include <sml/sml_tree.h>
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue