From 245a4f7cb3221261f4a82d04b17026faa0a2d4db Mon Sep 17 00:00:00 2001 From: Sven Robertz <sven@cs.lth.se> Date: Thu, 7 Mar 2013 09:31:37 +0100 Subject: [PATCH] started refactoring for separate writer action for sending signatures --- examples/simple/example_encoder.c | 3 ++- lib/c/labcomm.c | 40 +++++++++++++++++++------------ lib/c/labcomm.h | 8 +++++-- lib/c/labcomm_fd_reader_writer.c | 15 +++++++++++- lib/c/labcomm_private.h | 2 +- 5 files changed, 48 insertions(+), 20 deletions(-) diff --git a/examples/simple/example_encoder.c b/examples/simple/example_encoder.c index 70a38c8..33b5c4c 100644 --- a/examples/simple/example_encoder.c +++ b/examples/simple/example_encoder.c @@ -15,7 +15,6 @@ int main(int argc, char *argv[]) { encoder = labcomm_encoder_new(labcomm_fd_writer, &fd); labcomm_encoder_register_simple_TwoInts(encoder); labcomm_encoder_register_simple_IntString(encoder); - labcomm_encoder_register_simple_TwoArrays(encoder); simple_IntString is; is.x = 24; is.s = "Hello, LabComm!"; @@ -30,6 +29,8 @@ int main(int argc, char *argv[]) { int foo[20]; + labcomm_encoder_register_simple_TwoArrays(encoder); + simple_TwoArrays ta; ta.fixed.a[0] = 17; ta.fixed.a[1] = 42; diff --git a/lib/c/labcomm.c b/lib/c/labcomm.c index ac8cf56..2b982e6 100644 --- a/lib/c/labcomm.c +++ b/lib/c/labcomm.c @@ -181,13 +181,30 @@ static int get_encoder_index( return result; } +void labcomm_encode_signature(struct labcomm_encoder *e, + labcomm_signature_t *signature) +{ + int i; + e->writer.write(&e->writer, labcomm_writer_start); + labcomm_encode_packed32(e, signature->type); + labcomm_encode_type_index(e, signature); + labcomm_encode_string(e, signature->name); + for (i = 0 ; i < signature->size ; i++) { + if (e->writer.pos >= e->writer.count) { + e->writer.write(&e->writer, labcomm_writer_continue); + } + e->writer.data[e->writer.pos] = signature->signature[i]; + e->writer.pos++; + } + e->writer.write(&e->writer, labcomm_writer_end); +} + static void do_encoder_register(struct labcomm_encoder *e, labcomm_signature_t *signature, labcomm_encode_typecast_t encode) { if (signature->type == LABCOMM_SAMPLE) { if (get_encoder_index(e, signature) == 0) { - int i; labcomm_encoder_context_t *context = e->context; labcomm_sample_entry_t *sample = (labcomm_sample_entry_t*)malloc(sizeof(labcomm_sample_entry_t)); @@ -198,18 +215,11 @@ static void do_encoder_register(struct labcomm_encoder *e, context->index++; context->sample = sample; - e->writer.write(&e->writer, labcomm_writer_start); - labcomm_encode_packed32(e, signature->type); - labcomm_encode_type_index(e, signature); - labcomm_encode_string(e, signature->name); - for (i = 0 ; i < signature->size ; i++) { - if (e->writer.pos >= e->writer.count) { - e->writer.write(&e->writer, labcomm_writer_continue); - } - e->writer.data[e->writer.pos] = signature->signature[i]; - e->writer.pos++; - } - e->writer.write(&e->writer, labcomm_writer_end); +#ifdef OLD_STUFF + labcomm_encode_signature(e, signature); +#else + e->writer.write(&e->writer, labcomm_writer_send_signature, signature, e); +#endif } } } @@ -231,7 +241,7 @@ static void do_encode( } labcomm_encoder_t *labcomm_encoder_new( - int (*writer)(labcomm_writer_t *, labcomm_writer_action_t), + int (*writer)(labcomm_writer_t *, labcomm_writer_action_t, ...), void *writer_context) { labcomm_encoder_t *result = malloc(sizeof(labcomm_encoder_t)); @@ -314,7 +324,7 @@ void labcomm_encode_type_index(labcomm_encoder_t *e, labcomm_signature_t *s) static int signature_writer( labcomm_writer_t *w, - labcomm_writer_action_t action) + labcomm_writer_action_t action, ...) { switch (action) { case labcomm_writer_alloc: { diff --git a/lib/c/labcomm.h b/lib/c/labcomm.h index 5763b8d..6d67fb2 100644 --- a/lib/c/labcomm.h +++ b/lib/c/labcomm.h @@ -31,6 +31,9 @@ typedef struct { unsigned char *signature; } labcomm_signature_t; +//TODO: something along the lines of... +void labcomm_encode_signature(struct labcomm_encoder*, labcomm_signature_t*); + /* * Error handling. */ @@ -127,6 +130,7 @@ typedef enum { labcomm_writer_continue, labcomm_writer_end, labcomm_writer_available, + labcomm_writer_send_signature } labcomm_writer_action_t; typedef struct labcomm_writer { @@ -135,12 +139,12 @@ typedef struct labcomm_writer { int data_size; int count; int pos; - int (*write)(struct labcomm_writer *, labcomm_writer_action_t); + int (*write)(struct labcomm_writer *, labcomm_writer_action_t, ...); labcomm_error_handler_callback on_error; } labcomm_writer_t; struct labcomm_encoder *labcomm_encoder_new( - int (*writer)(labcomm_writer_t *, labcomm_writer_action_t), + int (*writer)(labcomm_writer_t *, labcomm_writer_action_t, ...), void *writer_context); void labcomm_encoder_free( struct labcomm_encoder *encoder); diff --git a/lib/c/labcomm_fd_reader_writer.c b/lib/c/labcomm_fd_reader_writer.c index 2774b37..77b5273 100644 --- a/lib/c/labcomm_fd_reader_writer.c +++ b/lib/c/labcomm_fd_reader_writer.c @@ -59,8 +59,9 @@ int labcomm_fd_reader( int labcomm_fd_writer( labcomm_writer_t *w, - labcomm_writer_action_t action) + labcomm_writer_action_t action, ...) { + va_list argp; int result = 0; int *fd = w->context; @@ -99,6 +100,18 @@ int labcomm_fd_writer( case labcomm_writer_available: { result = w->count - w->pos; } break; + case labcomm_writer_send_signature: { + //TODO: move to generic auxilliary writer functions file in lib? + + va_start(argp, action); + labcomm_signature_t *signature = va_arg(argp, labcomm_signature_t*); + struct labcomm_encoder *e = va_arg(argp, struct labcomm_encoder*); + va_end(argp); + + printf("Sending signature: %s\n", signature->name); + labcomm_encode_signature(e, signature); + + } break; } return result; } diff --git a/lib/c/labcomm_private.h b/lib/c/labcomm_private.h index 637828c..dffa349 100644 --- a/lib/c/labcomm_private.h +++ b/lib/c/labcomm_private.h @@ -335,7 +335,7 @@ static inline void labcomm_encode_string(labcomm_encoder_t *e, void labcomm_encode_type_index(labcomm_encoder_t *e, labcomm_signature_t *s); static inline int labcomm_buffer_write(struct labcomm_writer *w, - labcomm_writer_action_t action) + labcomm_writer_action_t action, ...) { // If this gets called, it is an error, // so note error and let producer proceed -- GitLab