added sml_sequence, still some warnings

This commit is contained in:
Juri Glass 2011-09-02 20:30:26 +02:00
parent e3aa19f856
commit 10122403bb
4 changed files with 119 additions and 9 deletions

View file

@ -31,6 +31,19 @@
extern "C" {
#endif
typedef struct {
void **elems;
int elems_len;
void (*elem_free) (void *elem);
} sml_sequence;
sml_sequence *sml_sequence_init(void (*elem_free) (void *elem));
sml_sequence *sml_sequence_parse(sml_buffer *buf, void *(*elem_parse) (sml_buffer *buf), void (*elem_free) (void *elem));
void sml_sequence_write(sml_sequence *seq, sml_buffer *buf, void (*elem_write) (void *elem, sml_buffer *buf));
void sml_sequence_free(sml_sequence *seq);
void sml_sequence_add(sml_sequence *list, void *new_entry);
typedef struct sml_list_entry {
octet_string *obj_name;
@ -46,12 +59,9 @@ typedef struct sml_list_entry {
} sml_list;
sml_list *sml_list_init();
sml_list *sml_list_parse(sml_buffer *buf);
void sml_list_write(sml_list *list, sml_buffer *buf);
void sml_list_add(sml_list *list, sml_list *new_entry);
sml_list *sml_list_parse(sml_buffer *buf);
void sml_list_free(sml_list *list);
#ifdef __cplusplus

View file

@ -25,15 +25,66 @@
#include <sml/sml_value.h>
#include <stdio.h>
void sml_list_entry_free(sml_list *list) ;
sml_list *sml_list_entry_parse(sml_buffer *buf);
void sml_list_entry_write(sml_list *list, sml_buffer *buf);
sml_sequence *sml_sequence_init(void (*elem_free) (void *elem)) {
sml_sequence *seq = (sml_sequence *) malloc(sizeof(sml_sequence));
memset(seq, 0, sizeof(sml_sequence));
seq->elem_free = elem_free;
return seq;
}
sml_sequence *sml_sequence_parse(sml_buffer *buf,
void *(*elem_parse) (sml_buffer *buf),
void (*elem_free) (void *elem)) {
if (sml_buf_get_next_type(buf) != SML_TYPE_LIST) {
buf->error = 1;
goto error;
}
sml_sequence *seq = sml_sequence_init(elem_free);
int i, len = sml_buf_get_next_length(buf);
void *p;
for (i = 0; i < len; i++) {
p = elem_parse(buf);
if (sml_buf_has_errors(buf)) goto error;
sml_sequence_add(seq, p);
}
return seq;
error:
buf->error = 1;
sml_sequence_free(seq->elem_free);
return 0;
}
void sml_sequence_write(sml_sequence *seq, sml_buffer *buf, void (*elem_write) (void *elem, sml_buffer *buf)) {
if (seq == 0) {
sml_buf_optional_write(buf);
return;
}
sml_buf_set_type_and_length(buf, SML_TYPE_LIST, seq->elems_len);
int i;
for (i = 0; i < seq->elems_len; i++) {
elem_write((seq->elems)[i], buf);
}
}
void sml_sequence_free(sml_sequence *seq) {
}
void sml_sequence_add(sml_sequence *seq, void *new_entry) {
seq->elems_len++;
seq->elems = (void **) realloc(seq->elems, sizeof(void *) * seq->elems_len);
seq->elems[seq->elems_len - 1] = new_entry;
}
sml_list *sml_list_init(){
sml_list *s = (sml_list *)malloc(sizeof(sml_list));
memset(s, 0, sizeof(sml_list));
return s;
return s;
}
void sml_list_add(sml_list *list, sml_list *new_entry) {
@ -121,6 +172,7 @@ error:
return 0;
}
void sml_list_entry_write(sml_list *list, sml_buffer *buf) {
sml_buf_set_type_and_length(buf, SML_TYPE_LIST, 7);
sml_octet_string_write(list->obj_name, buf);

View file

@ -88,3 +88,50 @@ TEST_GROUP_RUNNER(sml_list) {
RUN_TEST_CASE(sml_list, write_one_entry);
RUN_TEST_CASE(sml_list, write_optional);
}
TEST_GROUP(sml_sequence);
sml_buffer *buf;
TEST_SETUP(sml_sequence) {
buf = sml_buffer_init(512);
}
TEST_TEAR_DOWN(sml_sequence) {
sml_buffer_free(buf);
}
TEST(sml_sequence, init) {
sml_sequence *seq = sml_sequence_init(&free);
TEST_ASSERT_NOT_NULL(seq);
}
TEST(sml_sequence, parse_octet_string) {
hex2binary("720648616C6C6F0648616C6C6F", sml_buf_get_current_buf(buf));
sml_sequence *seq = sml_sequence_parse(buf, &sml_octet_string_parse, &sml_octet_string_free);
TEST_ASSERT_NOT_NULL(seq);
TEST_ASSERT_EQUAL(2, seq->elems_len);
}
TEST(sml_sequence, write_octet_string) {
sml_sequence *seq = sml_sequence_init(&sml_octet_string_free);
sml_sequence_add(seq, sml_octet_string_init((unsigned char *)"Hallo", 5));
sml_sequence_add(seq, sml_octet_string_init((unsigned char *)"Hallo", 5));
sml_sequence_write(seq, buf, &sml_octet_string_write);
expected_buf(buf, "720648616C6C6F0648616C6C6F", 13);
}
TEST_GROUP_RUNNER(sml_sequence) {
RUN_TEST_CASE(sml_sequence, init);
RUN_TEST_CASE(sml_sequence, parse_octet_string);
RUN_TEST_CASE(sml_sequence, write_octet_string);
}

View file

@ -26,6 +26,7 @@ static void runAllTests() {
RUN_TEST_GROUP(sml_value);
RUN_TEST_GROUP(sml_status);
RUN_TEST_GROUP(sml_list);
RUN_TEST_GROUP(sml_sequence);
RUN_TEST_GROUP(sml_time);
RUN_TEST_GROUP(sml_tree);
RUN_TEST_GROUP(sml_tree_path);