From 417a77f2fcdb8583a4aee26f3bff37367f3f415b Mon Sep 17 00:00:00 2001
From: Anders Blomdell <anders.blomdell@control.lth.se>
Date: Sat, 23 May 2015 22:46:00 +0200
Subject: [PATCH] Made sample_ref a distinct (opaque) type in C

---
 compiler/2014/C_CodeGen.jrag                  |   6 +-
 examples/user_types/example_decoder.c         |   2 +-
 lib/c/2014/labcomm2014.h                      |   4 +-
 lib/c/2014/labcomm2014_decoder.c              |  16 +-
 lib/c/2014/labcomm2014_encoder.c              |  18 +-
 lib/c/2014/labcomm2014_private.h              |  31 +++-
 lib/c/2014/labcomm2014_renaming_decoder.c     |  14 +-
 lib/c/2014/labcomm2014_renaming_encoder.c     |  13 +-
 lib/c/2014/labcomm2014_type_signature.h       |   2 +
 lib/c/2014/test/test_labcomm_copy.c           |  12 +-
 .../test/test_labcomm_generated_encoding.c    |  12 +-
 .../2014/test/test_labcomm_renaming_decoder.c | 175 ++++++++++++++++++
 12 files changed, 256 insertions(+), 49 deletions(-)
 create mode 100644 lib/c/2014/test/test_labcomm_renaming_decoder.c

diff --git a/compiler/2014/C_CodeGen.jrag b/compiler/2014/C_CodeGen.jrag
index f5af035..11c94d5 100644
--- a/compiler/2014/C_CodeGen.jrag
+++ b/compiler/2014/C_CodeGen.jrag
@@ -311,7 +311,7 @@ aspect C_Type {
       case LABCOMM_DOUBLE: { env.print("double"); } break;
       case LABCOMM_STRING: { env.print("char*"); } break;
       case LABCOMM_SAMPLE: { 
-        env.print("const struct labcomm2014_signature *"); 
+        env.print("const struct labcomm2014_sample_ref *"); 
       } break;
     }
     env.print(" " + name);
@@ -528,7 +528,7 @@ aspect C_Decoder {
     env.print(env.qualid + " = ");
     switch (getToken()) {
       case LABCOMM_SAMPLE: { 
-        env.println("r->decoder->index_to_signature(" +
+        env.println("r->decoder->index_to_sample_ref(" +
                     "r->decoder, labcomm2014_read_int(r));");
       } break;
       default: {
@@ -1062,7 +1062,7 @@ aspect C_Encoder {
     switch (getToken()) {
       case LABCOMM_SAMPLE: { 
         env.println("labcomm2014_write_int(w, " + 
-                    "w->encoder->signature_to_index(w->encoder, " +
+                    "w->encoder->sample_ref_to_index(w->encoder, " +
                     env.qualid + "));");
       } break;
       default: {
diff --git a/examples/user_types/example_decoder.c b/examples/user_types/example_decoder.c
index 5d6062e..1874373 100644
--- a/examples/user_types/example_decoder.c
+++ b/examples/user_types/example_decoder.c
@@ -13,7 +13,7 @@ static void handle_test_doavoid(test_doavoid *v,void *context) {
 }
 
 static void handle_test_intAndRef(test_intAndRef *v,void *context) {
-  printf("Got intAndRef. (%d : %s) \n", v->x, v->reference->name); 
+  printf("Got intAndRef. (%d : %p) \n", v->x, v->reference); 
 }
 
 static void handle_test_twoInts(test_twoInts *v,void *context) {
diff --git a/lib/c/2014/labcomm2014.h b/lib/c/2014/labcomm2014.h
index 81acb04..5931e83 100644
--- a/lib/c/2014/labcomm2014.h
+++ b/lib/c/2014/labcomm2014.h
@@ -112,7 +112,7 @@ int labcomm2014_decoder_ioctl(struct labcomm2014_decoder *decoder,
                               uint32_t ioctl_action,
                               ...);
 
-const struct labcomm2014_signature *labcomm2014_decoder_get_ref_signature(
+const struct labcomm2014_sample_ref *labcomm2014_decoder_get_sample_ref(
   struct labcomm2014_decoder *decoder,
   const struct labcomm2014_signature *signature);
 
@@ -137,7 +137,7 @@ int labcomm2014_encoder_ioctl(struct labcomm2014_encoder *encoder,
                               uint32_t ioctl_action,
                               ...);
 
-const struct labcomm2014_signature *labcomm2014_encoder_get_sample_ref(
+const struct labcomm2014_sample_ref *labcomm2014_encoder_get_sample_ref(
   struct labcomm2014_encoder *encoder,
   const struct labcomm2014_signature *signature);
 
diff --git a/lib/c/2014/labcomm2014_decoder.c b/lib/c/2014/labcomm2014_decoder.c
index a248abe..f822288 100644
--- a/lib/c/2014/labcomm2014_decoder.c
+++ b/lib/c/2014/labcomm2014_decoder.c
@@ -619,7 +619,7 @@ out:
   return local_index;
 }
 
-static const struct labcomm2014_signature *do_index_to_signature(
+static const struct labcomm2014_sample_ref *do_index_to_sample_ref(
   struct labcomm2014_decoder *d, int index)
 {
   const struct labcomm2014_signature *result = 0;
@@ -635,14 +635,14 @@ static const struct labcomm2014_signature *do_index_to_signature(
                                          local_index, 0);
   }
   labcomm2014_scheduler_data_unlock(d->scheduler);
-  return result;
+  return labcomm2014_signature_to_sample_ref(result);
 }
 
-static const struct labcomm2014_signature *do_get_ref_signature(
+static const struct labcomm2014_sample_ref *do_ref_get(
   struct labcomm2014_decoder *d,
   const struct labcomm2014_signature *signature)
 {
-  return signature;
+  return (const struct labcomm2014_sample_ref *) signature;
 }
 
 static void do_free(struct labcomm2014_decoder* d)
@@ -693,8 +693,8 @@ struct labcomm2014_decoder *labcomm2014_decoder_new(
     result->decoder.ref_register = do_ref_register;
     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;
+    result->decoder.index_to_sample_ref = do_index_to_sample_ref;
+    result->decoder.ref_get = do_ref_get;
     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, 
@@ -705,10 +705,10 @@ struct labcomm2014_decoder *labcomm2014_decoder_new(
 }
 
 
-const struct labcomm2014_signature *labcomm2014_decoder_get_ref_signature(
+const struct labcomm2014_sample_ref *labcomm2014_decoder_get_sample_ref(
   struct labcomm2014_decoder *decoder,
   const struct labcomm2014_signature *signature)
 {
-  return decoder->get_ref_signature(decoder, signature);
+  return decoder->ref_get(decoder, signature);
 }
 
diff --git a/lib/c/2014/labcomm2014_encoder.c b/lib/c/2014/labcomm2014_encoder.c
index a2bf410..c49798d 100644
--- a/lib/c/2014/labcomm2014_encoder.c
+++ b/lib/c/2014/labcomm2014_encoder.c
@@ -194,14 +194,16 @@ static int do_ioctl(
   return result;
 }
 
-static int do_signature_to_index(
-  struct labcomm2014_encoder *e, const struct labcomm2014_signature *signature)
+static int do_sample_ref_to_index(
+  struct labcomm2014_encoder *e,
+  const struct labcomm2014_sample_ref *sample_ref)
 {
   /* writer_lock should be held at this point */
   struct encoder *ie = e->context;
   int index = 0;
-  if (signature != NULL) {
-    index = labcomm2014_get_local_index(signature);
+  if (sample_ref != NULL) {
+    index = labcomm2014_get_local_index(
+      (struct labcomm2014_signature *)sample_ref);
     if (! LABCOMM_SIGNATURE_ARRAY_GET(ie->sample_ref, int, index, 0)) {
       index = 0;
     }
@@ -345,11 +347,11 @@ out:
 #endif
 }
 
-static const struct labcomm2014_signature *do_ref_get(
+static const struct labcomm2014_sample_ref *do_ref_get(
   struct labcomm2014_encoder *e,
   const struct labcomm2014_signature *signature)
 {
-  return signature;
+  return (const struct labcomm2014_sample_ref *) signature;
 }
 
 void labcomm2014_encoder_free(struct labcomm2014_encoder* e)
@@ -400,7 +402,7 @@ static struct labcomm2014_encoder *internal_encoder_new(
     result->encoder.ref_register = do_ref_register;
     result->encoder.encode = do_encode;
     result->encoder.ioctl = do_ioctl;
-    result->encoder.signature_to_index = do_signature_to_index;
+    result->encoder.sample_ref_to_index = do_sample_ref_to_index;
     result->encoder.ref_get = do_ref_get;
     LABCOMM_SIGNATURE_ARRAY_INIT(result->registered, int);
     LABCOMM_SIGNATURE_ARRAY_INIT(result->sample_ref, int);
@@ -432,7 +434,7 @@ struct labcomm2014_encoder *labcomm2014_encoder_new(
 }
 
 
-const struct labcomm2014_signature *labcomm2014_encoder_get_sample_ref(
+const struct labcomm2014_sample_ref *labcomm2014_encoder_get_sample_ref(
   struct labcomm2014_encoder *encoder,
   const struct labcomm2014_signature *signature)
 {
diff --git a/lib/c/2014/labcomm2014_private.h b/lib/c/2014/labcomm2014_private.h
index ace311a..8f98fed 100644
--- a/lib/c/2014/labcomm2014_private.h
+++ b/lib/c/2014/labcomm2014_private.h
@@ -93,6 +93,25 @@ struct labcomm2014_memory {
   void *context;
 };
 
+/*
+ * sample_ref/signature helpers 
+ */
+static const inline
+struct labcomm2014_signature *labcomm2014_sample_ref_to_signature(
+  const struct labcomm2014_sample_ref *sample_ref
+  )
+{
+  return (struct labcomm2014_signature *)sample_ref;
+}
+
+static const inline
+struct labcomm2014_sample_ref *labcomm2014_signature_to_sample_ref(
+  const struct labcomm2014_signature *signature
+  )
+{
+  return (struct labcomm2014_sample_ref *)signature;
+}
+
 /*
  * Semi private decoder declarations
  */
@@ -211,9 +230,9 @@ 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)(
+  const struct labcomm2014_sample_ref *(*index_to_sample_ref)(
     struct labcomm2014_decoder *decoder, int index);
-  const struct labcomm2014_signature *(*get_ref_signature)(
+  const struct labcomm2014_sample_ref *(*ref_get)(
     struct labcomm2014_decoder *d,
     const struct labcomm2014_signature *signature);
 };
@@ -247,7 +266,7 @@ struct labcomm2014_decoder {
 	if (r->error < 0) {						\
 	  return 0;							\
 	}								\
-      }									\
+      }				>					\
       ((unsigned char*)(&result))[i] = r->data[r->pos];			\
       r->pos++;								\
     }									\
@@ -392,9 +411,9 @@ struct labcomm2014_encoder {
   int (*ioctl)(struct labcomm2014_encoder *e, 
              const struct labcomm2014_signature *signature,
              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)(
+  int (*sample_ref_to_index)(struct labcomm2014_encoder *e,
+                             const struct labcomm2014_sample_ref *s);
+  const struct labcomm2014_sample_ref *(*ref_get)(
     struct labcomm2014_encoder *e,
     const struct labcomm2014_signature *signature);
 };
diff --git a/lib/c/2014/labcomm2014_renaming_decoder.c b/lib/c/2014/labcomm2014_renaming_decoder.c
index 9a37d7a..acd8d35 100644
--- a/lib/c/2014/labcomm2014_renaming_decoder.c
+++ b/lib/c/2014/labcomm2014_renaming_decoder.c
@@ -147,15 +147,15 @@ static int do_ioctl(struct labcomm2014_decoder *d,
                          ioctl_action, args);
 }
 
-static const struct labcomm2014_signature *do_index_to_signature(
+static const struct labcomm2014_sample_ref *do_index_to_sample_ref(
   struct labcomm2014_decoder *d, int index)
 {
   struct decoder *id = d->context;
   
-  return id->next->index_to_signature(id->next, index);
+  return id->next->index_to_sample_ref(id->next, index);
 }
 
-static const struct labcomm2014_signature *do_get_ref_signature(
+static const struct labcomm2014_sample_ref *do_ref_get(
   struct labcomm2014_decoder *d,
   const struct labcomm2014_signature *signature)
 {
@@ -164,9 +164,9 @@ static const struct labcomm2014_signature *do_get_ref_signature(
   
  renamed = get_renamed(d, signature);
   if (renamed == NULL) {
-    return id->next->get_ref_signature(id->next, signature);
+    return id->next->ref_get(id->next, signature);
   } else {
-    return id->next->get_ref_signature(id->next, renamed);
+    return id->next->ref_get(id->next, renamed);
   }
 }
 
@@ -210,8 +210,8 @@ struct labcomm2014_decoder *labcomm2014_renaming_decoder_new(
       result->decoder.sample_register = do_sample_register;
       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->decoder.index_to_sample_ref = do_index_to_sample_ref;
+      result->decoder.ref_get = do_ref_get;
       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 cd44c1c..fbac1f0 100644
--- a/lib/c/2014/labcomm2014_renaming_encoder.c
+++ b/lib/c/2014/labcomm2014_renaming_encoder.c
@@ -171,15 +171,16 @@ static int do_ioctl(struct labcomm2014_encoder *e,
                          ioctl_action, args);
 }
 
-static int do_signature_to_index(struct labcomm2014_encoder *e,
-                                 const struct labcomm2014_signature *signature)
+static int do_sample_ref_to_index(
+  struct labcomm2014_encoder *e,
+  const struct labcomm2014_sample_ref *sample_ref)
 {
   struct encoder *ie = e->context;
-  
-  return ie->next->signature_to_index(ie->next, get_renamed(e, signature));
+
+  return ie->next->sample_ref_to_index(ie->next,sample_ref);
 }
 
-static const struct labcomm2014_signature *do_ref_get(
+static const struct labcomm2014_sample_ref *do_ref_get(
   struct labcomm2014_encoder *e,
   const struct labcomm2014_signature *signature)
 {
@@ -236,7 +237,7 @@ struct labcomm2014_encoder *labcomm2014_renaming_encoder_new(
       result->encoder.ref_register = do_ref_register;
       result->encoder.encode = do_encode;
       result->encoder.ioctl = do_ioctl;
-      result->encoder.signature_to_index = do_signature_to_index;
+      result->encoder.sample_ref_to_index = do_sample_ref_to_index;
       result->encoder.ref_get = do_ref_get;
       result->next = e;
       result->rename = rename;
diff --git a/lib/c/2014/labcomm2014_type_signature.h b/lib/c/2014/labcomm2014_type_signature.h
index 7c21b95..dfb7934 100644
--- a/lib/c/2014/labcomm2014_type_signature.h
+++ b/lib/c/2014/labcomm2014_type_signature.h
@@ -46,6 +46,8 @@ struct labcomm2014_signature_data {
 };
 
 #endif
+struct labcomm2014_sample_ref;
+
 struct labcomm2014_signature {
   char *name;
   int (*encoded_size)(void *); /* void* refers to sample_data */
diff --git a/lib/c/2014/test/test_labcomm_copy.c b/lib/c/2014/test/test_labcomm_copy.c
index d26ef96..173f152 100644
--- a/lib/c/2014/test/test_labcomm_copy.c
+++ b/lib/c/2014/test/test_labcomm_copy.c
@@ -166,10 +166,14 @@ int main(int argc, char **argv)
   labcomm2014_encoder_sample_ref_register(encoder, 
                                       labcomm2014_signature_generated_encoding_UnusedD);
   labcomm2014_encoder_sample_ref_register(encoder, labcomm2014_signature_generated_encoding_R);
-  r.a[0] = labcomm2014_signature_generated_encoding_V;
-  r.a[1] = labcomm2014_signature_generated_encoding_UnusedE;
-  r.a[2] = labcomm2014_signature_generated_encoding_UnusedD;
-  r.a[3] = labcomm2014_signature_generated_encoding_R;
+  r.a[0] = labcomm2014_encoder_get_sample_ref(
+    encoder, labcomm2014_signature_generated_encoding_V);
+  r.a[1] = labcomm2014_encoder_get_sample_ref(
+    encoder, labcomm2014_signature_generated_encoding_UnusedE);
+  r.a[2] = labcomm2014_encoder_get_sample_ref(
+    encoder, labcomm2014_signature_generated_encoding_UnusedD);
+  r.a[3] = labcomm2014_encoder_get_sample_ref(
+    encoder, labcomm2014_signature_generated_encoding_R);
   labcomm2014_encode_generated_encoding_R(encoder, &r);
 
   labcomm2014_encoder_free(encoder);
diff --git a/lib/c/2014/test/test_labcomm_generated_encoding.c b/lib/c/2014/test/test_labcomm_generated_encoding.c
index f728ac0..6b880d4 100644
--- a/lib/c/2014/test/test_labcomm_generated_encoding.c
+++ b/lib/c/2014/test/test_labcomm_generated_encoding.c
@@ -266,10 +266,14 @@ int main(void)
   EXPECT({VARIABLE(20), 0x01, 1});
 
   labcomm2014_encoder_ioctl(encoder, IOCTL_WRITER_RESET);
-  R.a[0] = labcomm2014_signature_generated_encoding_V;
-  R.a[1] = labcomm2014_signature_generated_encoding_B;
-  R.a[2] = labcomm2014_signature_generated_encoding_UnusedE;
-  R.a[3] = labcomm2014_signature_generated_encoding_R;
+  R.a[0] = labcomm2014_encoder_get_sample_ref(
+    encoder, labcomm2014_signature_generated_encoding_V);
+  R.a[1] = labcomm2014_encoder_get_sample_ref(
+    encoder, labcomm2014_signature_generated_encoding_B);
+  R.a[2] = labcomm2014_encoder_get_sample_ref(
+    encoder, labcomm2014_signature_generated_encoding_UnusedE);
+  R.a[3] = labcomm2014_encoder_get_sample_ref(
+    encoder, labcomm2014_signature_generated_encoding_R);
   labcomm2014_encode_generated_encoding_R(encoder, &R);
   EXPECT({VARIABLE(4), 0x10, 0x00, 0x00, 0x00, VARIABLE(5),
                              0x00, 0x00, 0x00, VARIABLE(6),
diff --git a/lib/c/2014/test/test_labcomm_renaming_decoder.c b/lib/c/2014/test/test_labcomm_renaming_decoder.c
new file mode 100644
index 0000000..9cafa7c
--- /dev/null
+++ b/lib/c/2014/test/test_labcomm_renaming_decoder.c
@@ -0,0 +1,175 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <assert.h>
+#include <err.h>
+
+#include "labcomm2014.h"
+#include "labcomm2014_private.h"
+#include "labcomm2014_default_error_handler.h"
+#include "labcomm2014_default_memory.h"
+#include "labcomm2014_default_scheduler.h"
+#include "labcomm2014_fd_writer.h"
+#include "labcomm2014_fd_reader.h"
+#include "labcomm2014_renaming.h"
+#include "labcomm2014_renaming_encoder.h"
+#include "labcomm2014_renaming_decoder.h"
+#include "test/gen/generated_encoding.h"
+
+#define DATA_FILE "renaming_test.dat"
+
+static void handle_r(generated_encoding_R *v, void *context)
+{
+  labcomm2014_copy_generated_encoding_R(labcomm2014_default_memory, context, v);
+}
+
+int main(int argc, char **argv)
+{
+  struct labcomm2014_encoder *encoder, *prefix_encoder, *suffix_encoder;
+  struct labcomm2014_decoder *decoder, *prefix_decoder, *suffix_decoder;
+  int fd;
+  generated_encoding_R r;
+  generated_encoding_R cache_r, prefix_cache_r, suffix_cache_r;
+
+  fd = open(DATA_FILE, O_RDWR | O_CREAT | O_TRUNC, 0644);
+  if (fd == -1) {
+    err(1, "open()");
+  }
+  encoder = labcomm2014_encoder_new(
+    labcomm2014_fd_writer_new(labcomm2014_default_memory, fd, 0),
+    labcomm2014_default_error_handler,
+    labcomm2014_default_memory,
+    labcomm2014_default_scheduler);
+  prefix_encoder = labcomm2014_renaming_encoder_new(
+    encoder, labcomm2014_renaming_prefix, "p.");
+  suffix_encoder = labcomm2014_renaming_encoder_new(
+    prefix_encoder, labcomm2014_renaming_suffix, ".s");
+
+  labcomm2014_encoder_register_generated_encoding_R(encoder);
+  labcomm2014_encoder_register_generated_encoding_R(prefix_encoder);
+  labcomm2014_encoder_register_generated_encoding_R(suffix_encoder);
+
+  labcomm2014_encoder_sample_ref_register(
+    encoder, labcomm2014_signature_generated_encoding_R);
+  labcomm2014_encoder_sample_ref_register(
+    prefix_encoder, labcomm2014_signature_generated_encoding_R);
+  labcomm2014_encoder_sample_ref_register(
+    suffix_encoder, labcomm2014_signature_generated_encoding_R);
+  r.a[0] = labcomm2014_encoder_get_sample_ref(
+    encoder, labcomm2014_signature_generated_encoding_R);
+  r.a[1] = labcomm2014_encoder_get_sample_ref(
+    prefix_encoder, labcomm2014_signature_generated_encoding_R);
+  r.a[2] = labcomm2014_encoder_get_sample_ref(
+    suffix_encoder, labcomm2014_signature_generated_encoding_R);
+
+  r.a[3] = labcomm2014_encoder_get_sample_ref(
+    encoder, labcomm2014_signature_generated_encoding_R);
+  labcomm2014_encode_generated_encoding_R(encoder, &r);
+
+  r.a[3] = labcomm2014_encoder_get_sample_ref(
+    prefix_encoder, labcomm2014_signature_generated_encoding_R);
+  labcomm2014_encode_generated_encoding_R(prefix_encoder, &r);
+
+  r.a[3] = labcomm2014_encoder_get_sample_ref(
+    suffix_encoder, labcomm2014_signature_generated_encoding_R);
+  labcomm2014_encode_generated_encoding_R(suffix_encoder, &r);
+
+  labcomm2014_encoder_free(suffix_encoder);
+  labcomm2014_encoder_free(prefix_encoder);
+  labcomm2014_encoder_free(encoder);
+  encoder = NULL;
+
+  lseek(fd, 0, SEEK_SET);
+  decoder =
+    labcomm2014_decoder_new(
+      labcomm2014_fd_reader_new(labcomm2014_default_memory, fd, 0),
+      labcomm2014_default_error_handler,
+      labcomm2014_default_memory,
+      labcomm2014_default_scheduler);
+  prefix_decoder = labcomm2014_renaming_decoder_new(
+    decoder, labcomm2014_renaming_prefix, "p.");
+  suffix_decoder = labcomm2014_renaming_decoder_new(
+    prefix_decoder, labcomm2014_renaming_suffix, ".s");
+
+  labcomm2014_decoder_register_generated_encoding_R(
+    decoder, handle_r, &cache_r);
+  labcomm2014_decoder_register_generated_encoding_R(
+    prefix_decoder, handle_r, &prefix_cache_r);
+  labcomm2014_decoder_register_generated_encoding_R(
+    suffix_decoder, handle_r, &suffix_cache_r);
+  labcomm2014_decoder_sample_ref_register(
+    decoder, labcomm2014_signature_generated_encoding_R);
+  labcomm2014_decoder_sample_ref_register(
+    prefix_decoder, labcomm2014_signature_generated_encoding_R);
+  labcomm2014_decoder_sample_ref_register(
+    suffix_decoder, labcomm2014_signature_generated_encoding_R);
+
+  while (labcomm2014_decoder_decode_one(decoder) > 0) ;
+
+  fprintf(stderr, "cache_r:\n");
+  fprintf(stderr, "%p %p %p %p\n",
+          cache_r.a[0],
+          cache_r.a[1],
+          cache_r.a[2],
+          cache_r.a[3]);
+          
+  fprintf(stderr, "prefix_cache_r:\n");
+  fprintf(stderr, "%p %p %p %p\n",
+          prefix_cache_r.a[0],
+          prefix_cache_r.a[1],
+          prefix_cache_r.a[2],
+          prefix_cache_r.a[3]);
+          
+  fprintf(stderr, "suffix_cache_r:\n");
+  fprintf(stderr, "%p %p %p %p\n",
+          suffix_cache_r.a[0],
+          suffix_cache_r.a[1],
+          suffix_cache_r.a[2],
+          suffix_cache_r.a[3]);
+          
+  assert(cache_r.a[0] ==
+         labcomm2014_decoder_get_sample_ref(
+           decoder, labcomm2014_signature_generated_encoding_R));
+  assert(cache_r.a[1] ==
+         labcomm2014_decoder_get_sample_ref(
+           prefix_decoder, labcomm2014_signature_generated_encoding_R));
+  assert(cache_r.a[2] ==
+         labcomm2014_decoder_get_sample_ref(
+           suffix_decoder, labcomm2014_signature_generated_encoding_R));
+  assert(cache_r.a[3] ==
+         labcomm2014_decoder_get_sample_ref(
+           decoder, labcomm2014_signature_generated_encoding_R));
+
+  assert(prefix_cache_r.a[0] ==
+         labcomm2014_decoder_get_sample_ref(
+           decoder, labcomm2014_signature_generated_encoding_R));
+  assert(prefix_cache_r.a[1] ==
+         labcomm2014_decoder_get_sample_ref(
+           prefix_decoder, labcomm2014_signature_generated_encoding_R));
+  assert(prefix_cache_r.a[2] ==
+         labcomm2014_decoder_get_sample_ref(
+           suffix_decoder, labcomm2014_signature_generated_encoding_R));
+  assert(prefix_cache_r.a[3] ==
+         labcomm2014_decoder_get_sample_ref(
+           prefix_decoder, labcomm2014_signature_generated_encoding_R));
+
+  assert(suffix_cache_r.a[0] ==
+         labcomm2014_decoder_get_sample_ref(
+           decoder, labcomm2014_signature_generated_encoding_R));
+  assert(suffix_cache_r.a[1] ==
+         labcomm2014_decoder_get_sample_ref(
+           prefix_decoder, labcomm2014_signature_generated_encoding_R));
+  assert(suffix_cache_r.a[2] ==
+         labcomm2014_decoder_get_sample_ref(
+           suffix_decoder, labcomm2014_signature_generated_encoding_R));
+  assert(suffix_cache_r.a[3] ==
+         labcomm2014_decoder_get_sample_ref(
+           suffix_decoder, labcomm2014_signature_generated_encoding_R));
+
+  labcomm2014_decoder_free(decoder);
+  close(fd);
+  unlink(DATA_FILE);
+}
-- 
GitLab