diff --git a/lib/c/2014/Makefile b/lib/c/2014/Makefile index 596658bd06fb5693984d39c3f7f3a8409b76a330..81c0244deaa0578339cb541395c263c012b4a0e2 100644 --- a/lib/c/2014/Makefile +++ b/lib/c/2014/Makefile @@ -50,7 +50,8 @@ TESTS=test_labcomm_basic_type_encoding \ test_labcomm \ test_labcomm_pthread_scheduler \ test_labcomm_copy \ - test_labcomm_renaming_encoder + test_labcomm_renaming_encoder \ + test_labcomm_renaming_decoder #FIXME: test_labcomm_errors TEST_DIR=test @@ -176,3 +177,6 @@ $(TEST_DIR)/gen/test_labcomm_copy: \ $(TEST_DIR)/gen/test_labcomm_renaming_encoder: \ $(TEST_DIR)/gen/generated_encoding.o + +$(TEST_DIR)/gen/test_labcomm_renaming_decoder: \ + $(TEST_DIR)/gen/generated_encoding.o diff --git a/lib/c/2014/labcomm2014.h b/lib/c/2014/labcomm2014.h index c9e173fade4f41eb002a995602bf4a006066a423..81acb047afd5de485cb8bbf4c83feb8726927038 100644 --- a/lib/c/2014/labcomm2014.h +++ b/lib/c/2014/labcomm2014.h @@ -109,8 +109,12 @@ int labcomm2014_decoder_sample_ref_register( /* See labcomm2014_ioctl.h for predefined ioctl_action values */ int labcomm2014_decoder_ioctl(struct labcomm2014_decoder *decoder, - uint32_t ioctl_action, - ...); + uint32_t ioctl_action, + ...); + +const struct labcomm2014_signature *labcomm2014_decoder_get_ref_signature( + struct labcomm2014_decoder *decoder, + const struct labcomm2014_signature *signature); /* * Encoder @@ -130,7 +134,11 @@ int labcomm2014_encoder_sample_ref_register( /* See labcomm2014_ioctl.h for predefined ioctl_action values */ int labcomm2014_encoder_ioctl(struct labcomm2014_encoder *encoder, - uint32_t ioctl_action, - ...); + uint32_t ioctl_action, + ...); + +const struct labcomm2014_signature *labcomm2014_encoder_get_sample_ref( + struct labcomm2014_encoder *encoder, + const struct labcomm2014_signature *signature); #endif diff --git a/lib/c/2014/labcomm2014_decoder.c b/lib/c/2014/labcomm2014_decoder.c index def7cf48e6501e08ae13318d0c64a04a89339126..a248abea04f902c13629570103309a47d303ff1a 100644 --- a/lib/c/2014/labcomm2014_decoder.c +++ b/lib/c/2014/labcomm2014_decoder.c @@ -638,6 +638,13 @@ static const struct labcomm2014_signature *do_index_to_signature( return result; } +static const struct labcomm2014_signature *do_get_ref_signature( + struct labcomm2014_decoder *d, + const struct labcomm2014_signature *signature) +{ + return signature; +} + static void do_free(struct labcomm2014_decoder* d) { struct decoder *id = d->context; @@ -687,6 +694,7 @@ struct labcomm2014_decoder *labcomm2014_decoder_new( result->decoder.sample_register = do_register_sample; result->decoder.ioctl = do_ioctl; result->decoder.index_to_signature = do_index_to_signature; + result->decoder.get_ref_signature = do_get_ref_signature; LABCOMM_SIGNATURE_ARRAY_INIT(result->local, struct sample_entry); LABCOMM_SIGNATURE_ARRAY_INIT(result->remote_to_local, int); LABCOMM_SIGNATURE_ARRAY_INIT(result->local_ref, @@ -697,3 +705,10 @@ struct labcomm2014_decoder *labcomm2014_decoder_new( } +const struct labcomm2014_signature *labcomm2014_decoder_get_ref_signature( + struct labcomm2014_decoder *decoder, + const struct labcomm2014_signature *signature) +{ + return decoder->get_ref_signature(decoder, signature); +} + diff --git a/lib/c/2014/labcomm2014_encoder.c b/lib/c/2014/labcomm2014_encoder.c index e2168e1e3d3172f2a1f120ef4f6322eef21eeac5..a2bf410e0aecab024253089cee9626e63ed2edb3 100644 --- a/lib/c/2014/labcomm2014_encoder.c +++ b/lib/c/2014/labcomm2014_encoder.c @@ -345,6 +345,13 @@ out: #endif } +static const struct labcomm2014_signature *do_ref_get( + struct labcomm2014_encoder *e, + const struct labcomm2014_signature *signature) +{ + return signature; +} + void labcomm2014_encoder_free(struct labcomm2014_encoder* e) { e->free(e); @@ -394,6 +401,7 @@ static struct labcomm2014_encoder *internal_encoder_new( result->encoder.encode = do_encode; result->encoder.ioctl = do_ioctl; result->encoder.signature_to_index = do_signature_to_index; + result->encoder.ref_get = do_ref_get; LABCOMM_SIGNATURE_ARRAY_INIT(result->registered, int); LABCOMM_SIGNATURE_ARRAY_INIT(result->sample_ref, int); LABCOMM_SIGNATURE_ARRAY_INIT(result->typedefs, int); @@ -424,3 +432,10 @@ struct labcomm2014_encoder *labcomm2014_encoder_new( } +const struct labcomm2014_signature *labcomm2014_encoder_get_sample_ref( + struct labcomm2014_encoder *encoder, + const struct labcomm2014_signature *signature) +{ + return encoder->ref_get(encoder, signature); +} + diff --git a/lib/c/2014/labcomm2014_private.h b/lib/c/2014/labcomm2014_private.h index 2afcf0b035ea0bd9d5607906972af772b3662685..ace311ad19235f8da7b9de36436729b418d65f7b 100644 --- a/lib/c/2014/labcomm2014_private.h +++ b/lib/c/2014/labcomm2014_private.h @@ -211,16 +211,17 @@ struct labcomm2014_decoder { int (*ioctl)(struct labcomm2014_decoder *d, const struct labcomm2014_signature *s, uint32_t ioctl_action, va_list args); - const struct labcomm2014_signature *(*index_to_signature)( struct labcomm2014_decoder *decoder, int index); - + const struct labcomm2014_signature *(*get_ref_signature)( + struct labcomm2014_decoder *d, + const struct labcomm2014_signature *signature); }; #if __BYTE_ORDER == __LITTLE_ENDIAN #define LABCOMM_DECODE(name, type) \ - static inline type labcomm2014_read_##name(struct labcomm2014_reader *r) { \ + static inline type labcomm2014_read_##name(struct labcomm2014_reader *r) { \ type result; int i; \ for (i = sizeof(type) - 1 ; i >= 0 ; i--) { \ if (r->pos >= r->count) { \ @@ -393,6 +394,9 @@ struct labcomm2014_encoder { uint32_t ioctl_action, va_list args); int (*signature_to_index)(struct labcomm2014_encoder *e, const struct labcomm2014_signature *signature); + const struct labcomm2014_signature *(*ref_get)( + struct labcomm2014_encoder *e, + const struct labcomm2014_signature *signature); }; diff --git a/lib/c/2014/labcomm2014_renaming.c b/lib/c/2014/labcomm2014_renaming.c index aeaee5378107f9da589aa88db47781c8377d7ee6..332c63843c7ec2cb8841ed1fe76fe97207332e5d 100644 --- a/lib/c/2014/labcomm2014_renaming.c +++ b/lib/c/2014/labcomm2014_renaming.c @@ -22,7 +22,6 @@ #include "labcomm2014_renaming.h" #include <string.h> -#include <stdio.h> char *labcomm2014_renaming_prefix(struct labcomm2014_memory *m, char *name, void *context) @@ -36,7 +35,6 @@ char *labcomm2014_renaming_prefix(struct labcomm2014_memory *m, strcpy(result, prefix); strcat(result, name); } - fprintf(stderr, "%s + %s -> %s\n", prefix, name, result); return result; } diff --git a/lib/c/2014/labcomm2014_renaming_decoder.c b/lib/c/2014/labcomm2014_renaming_decoder.c index a7f8c1dd6f2614573767f2e98eb83b67c84b1ddc..9a37d7aa5e57a1a2301f543ba23a124dfbfe7151 100644 --- a/lib/c/2014/labcomm2014_renaming_decoder.c +++ b/lib/c/2014/labcomm2014_renaming_decoder.c @@ -155,6 +155,21 @@ static const struct labcomm2014_signature *do_index_to_signature( return id->next->index_to_signature(id->next, index); } +static const struct labcomm2014_signature *do_get_ref_signature( + struct labcomm2014_decoder *d, + const struct labcomm2014_signature *signature) +{ + const struct labcomm2014_signature *renamed; + struct decoder *id = d->context; + + renamed = get_renamed(d, signature); + if (renamed == NULL) { + return id->next->get_ref_signature(id->next, signature); + } else { + return id->next->get_ref_signature(id->next, renamed); + } +} + static void do_free(struct labcomm2014_decoder *d) { struct decoder *id = d->context; @@ -196,6 +211,7 @@ struct labcomm2014_decoder *labcomm2014_renaming_decoder_new( result->decoder.ref_register = do_ref_register; result->decoder.ioctl = do_ioctl; result->decoder.index_to_signature = do_index_to_signature; + result->decoder.get_ref_signature = do_get_ref_signature; result->next = d; result->rename = rename; result->context = context; diff --git a/lib/c/2014/labcomm2014_renaming_encoder.c b/lib/c/2014/labcomm2014_renaming_encoder.c index 414702e8e2ae5600f501c3591af151cdec3c0354..cd44c1c03af08e789da4cdb22757896facfab1ee 100644 --- a/lib/c/2014/labcomm2014_renaming_encoder.c +++ b/lib/c/2014/labcomm2014_renaming_encoder.c @@ -179,6 +179,21 @@ static int do_signature_to_index(struct labcomm2014_encoder *e, return ie->next->signature_to_index(ie->next, get_renamed(e, signature)); } +static const struct labcomm2014_signature *do_ref_get( + struct labcomm2014_encoder *e, + const struct labcomm2014_signature *signature) +{ + const struct labcomm2014_signature *renamed; + struct encoder *ie = e->context; + + renamed = get_renamed(e, signature); + if (renamed == NULL) { + return ie->next->ref_get(ie->next, signature); + } else { + return ie->next->ref_get(ie->next, renamed); + } +} + static void do_free(struct labcomm2014_encoder *e) { struct encoder *ie = e->context; @@ -222,6 +237,7 @@ struct labcomm2014_encoder *labcomm2014_renaming_encoder_new( result->encoder.encode = do_encode; result->encoder.ioctl = do_ioctl; result->encoder.signature_to_index = do_signature_to_index; + result->encoder.ref_get = do_ref_get; result->next = e; result->rename = rename; result->context = context;