added sml_sequence, still some warnings
This commit is contained in:
parent
e3aa19f856
commit
10122403bb
4 changed files with 119 additions and 9 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue