From 3b18c8bf3e3785682f5185378223c1852ed37c49 Mon Sep 17 00:00:00 2001
From: Sven Robertz <sven@cs.lth.se>
Date: Fri, 22 Mar 2013 13:22:17 +0100
Subject: [PATCH] applied patch from Anders Blomdell plus minor fixes

---
 lib/c/Makefile                               | 12 +--
 lib/c/labcomm.c                              | 93 +++++++++-----------
 lib/c/labcomm.h                              | 46 ++++++----
 lib/c/labcomm_dynamic_buffer_reader_writer.c | 40 +++++++++
 lib/c/labcomm_dynamic_buffer_reader_writer.h | 14 +++
 lib/c/labcomm_fd_reader_writer.c             | 31 +++----
 lib/c/labcomm_fd_reader_writer.h             | 12 ++-
 lib/c/labcomm_ioctl.h                        | 11 +++
 lib/c/labcomm_private.h                      | 10 +--
 lib/c/{ => test}/labcomm_mem_reader.c        |  3 +
 lib/c/{ => test}/labcomm_mem_reader.h        |  0
 lib/c/{ => test}/labcomm_mem_writer.c        | 28 ++----
 lib/c/{ => test}/labcomm_mem_writer.h        |  2 +-
 lib/csharp/se/lth/control/labcomm/LabComm.cs |  2 +-
 lib/java/se/lth/control/labcomm/LabComm.java |  2 +-
 lib/python/labcomm/LabComm.py                |  2 +-
 16 files changed, 178 insertions(+), 130 deletions(-)
 create mode 100644 lib/c/labcomm_dynamic_buffer_reader_writer.c
 create mode 100644 lib/c/labcomm_dynamic_buffer_reader_writer.h
 create mode 100644 lib/c/labcomm_ioctl.h
 rename lib/c/{ => test}/labcomm_mem_reader.c (96%)
 rename lib/c/{ => test}/labcomm_mem_reader.h (100%)
 rename lib/c/{ => test}/labcomm_mem_writer.c (85%)
 rename lib/c/{ => test}/labcomm_mem_writer.h (98%)

diff --git a/lib/c/Makefile b/lib/c/Makefile
index 6d6c81f..742ae35 100644
--- a/lib/c/Makefile
+++ b/lib/c/Makefile
@@ -2,11 +2,11 @@
 
 # Use LLVM clang if it's found.
 CC = $(shell hash clang 2>/dev/null && echo clang || echo gcc)
-CFLAGS = -g -Wall -I .
+CFLAGS = -g -Wall -Werror -I. -Itest
 LDFLAGS = -L .
 LDLIBS_TEST = -lcunit -llabcomm
 
-OBJS= labcomm.o labcomm_fd_reader_writer.o labcomm_mem_reader.o labcomm_mem_writer.o
+OBJS= labcomm.o labcomm_dynamic_buffer_reader_writer.o labcomm_fd_reader_writer.o labcomm_mem_reader.o labcomm_mem_writer.o
 LABCOMMC_PATH=../../compiler
 LABCOMMC_JAR=$(LABCOMMC_PATH)/labComm.jar
 
@@ -14,9 +14,11 @@ TEST_DIR=test
 TESTDATA_DIR=$(TEST_DIR)/testdata
 TEST_GEN_DIR=$(TESTDATA_DIR)/gen
 
+VPATH=$(TEST_DIR)
+
 CREATED_DIRS=$(TEST_DIR) $(TESTDATA_DIR) $(TEST_GEN_DIR)
 
-# Enable experimental objects by invoking make like `make -e LABCOMM_EXPERIMENTAL=true`
+# Enable experimental objects by invoking make like `make LABCOMM_EXPERIMENTAL=true`
 ifeq ($(LABCOMM_EXPERIMENTAL),true)
 	OBJS += experimental/udp_hack.o experimental/ethaddr.o \
 		experimental/labcomm_thr_reader_writer.o \
@@ -39,9 +41,9 @@ labcomm.o : labcomm.c labcomm.h  labcomm_private.h
 
 labcomm_fd_reader_writer.o : labcomm_fd_reader_writer.c  labcomm_fd_reader_writer.h  labcomm.h  labcomm_private.h
 
-labcomm_mem_reader.o: labcomm_fd_reader_writer.c labcomm_fd_reader_writer.h
+$(TEST_DIR)/labcomm_mem_reader.o: labcomm_fd_reader_writer.c labcomm_fd_reader_writer.h
 
-labcomm_mem_writer.o: labcomm_mem_writer.c labcomm_mem_writer.h cppmacros.h
+$(TEST_DIR)/labcomm_mem_writer.o: labcomm_mem_writer.c labcomm_mem_writer.h cppmacros.h
 
 ethaddr.o: ethaddr.c
 
diff --git a/lib/c/labcomm.c b/lib/c/labcomm.c
index bb487c0..fd19058 100644
--- a/lib/c/labcomm.c
+++ b/lib/c/labcomm.c
@@ -29,6 +29,8 @@
 
 #include "labcomm.h"
 #include "labcomm_private.h"
+#include "labcomm_ioctl.h"
+#include "labcomm_dynamic_buffer_reader_writer.h"
 
 typedef struct labcomm_sample_entry {
   struct labcomm_sample_entry *next;
@@ -185,7 +187,7 @@ void labcomm_encode_signature(struct labcomm_encoder *e,
                               labcomm_signature_t *signature) 
 {
   int i;
-  e->writer.write(&e->writer, labcomm_writer_start);
+  e->writer.write(&e->writer, labcomm_writer_start_signature);
   labcomm_encode_packed32(e, signature->type);
   labcomm_encode_type_index(e, signature);
   labcomm_encode_string(e, signature->name);
@@ -196,7 +198,7 @@ void labcomm_encode_signature(struct labcomm_encoder *e,
     e->writer.data[e->writer.pos] = signature->signature[i];
     e->writer.pos++;
   }
-  e->writer.write(&e->writer, labcomm_writer_end);
+  e->writer.write(&e->writer, labcomm_writer_end_signature);
 }
 
 static void do_encoder_register(struct labcomm_encoder *e,
@@ -215,11 +217,16 @@ static void do_encoder_register(struct labcomm_encoder *e,
       context->index++;
       context->sample = sample;
 
-#ifdef OLD_STUFF
-      labcomm_encode_signature(e, signature);
-#else
-      e->writer.write(&e->writer, labcomm_writer_send_signature, signature, e);
-#endif
+      struct labcomm_ioctl_register_signature ioctl_data;
+      int err;
+
+      ioctl_data.index = sample->index;
+      ioctl_data.signature = signature;	
+      err = labcomm_encoder_ioctl(e, LABCOMM_IOCTL_REGISTER_SIGNATURE,
+				  &ioctl_data);
+      if (err != 0) {
+	labcomm_encode_signature(e, signature);
+      }
     }
   }
 }
@@ -241,7 +248,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));
@@ -257,12 +264,14 @@ labcomm_encoder_t *labcomm_encoder_new(
     result->writer.data_size = 0;
     result->writer.count = 0;
     result->writer.pos = 0;
+    result->writer.error = 0;
     result->writer.write = writer;
-    result->writer.write(&result->writer, labcomm_writer_alloc);
+    result->writer.ioctl = NULL;
     result->writer.on_error = on_error_fprintf;
     result->do_register = do_encoder_register;
     result->do_encode = do_encode;
     result->on_error = on_error_fprintf;
+    result->writer.write(&result->writer, labcomm_writer_alloc);
   }
   return result;
 }
@@ -316,51 +325,27 @@ void labcomm_encoder_free(labcomm_encoder_t* e)
   free(e);
 }
 
-void labcomm_encode_type_index(labcomm_encoder_t *e, labcomm_signature_t *s)
+int labcomm_encoder_ioctl(struct labcomm_encoder *encoder, 
+                           int action,
+                           ...)
 {
-  int index = get_encoder_index(e, s);
-  labcomm_encode_packed32(e, index);
+  int result = -ENOTSUP;
+  
+  if (encoder->writer.ioctl != NULL) {
+    va_list va;
+    
+    va_start(va, action);
+    result = encoder->writer.ioctl(&encoder->writer, action, va);
+    va_end(va);
+  }
+  return result;
 }
 
-static int signature_writer(
-  labcomm_writer_t *w,
-  labcomm_writer_action_t action, ...)
-{
-  switch (action) {
-    case labcomm_writer_alloc: {
-      w->data_size = 1000;
-      w->count = w->data_size;
-      w->data = malloc(w->data_size);
-      w->pos = 0;
-    } break;
-    case labcomm_writer_start: {
-      w->data_size = 1000;
-      w->count = w->data_size;
-      w->data = realloc(w->data, w->data_size);
-      w->pos = 0;
-    } break;
-    case labcomm_writer_continue: {
-      w->data_size += 1000;
-      w->count = w->data_size;
-      w->data = realloc(w->data, w->data_size);
-    } break;
-    case labcomm_writer_end: {
-    } break;
-    case labcomm_writer_free: {
-      free(w->data);
-      w->data = 0;
-      w->data_size = 0;
-      w->count = 0;
-      w->pos = 0;
-    } break;
-    case labcomm_writer_available: {
-    } break;
-    case labcomm_writer_send_signature:
-    case labcomm_writer_user_action:
-      return -ENOTSUP;  //HERE BE DRAGONS: should probably be cleaned up 
-  }
-  return 0;
 
+void labcomm_encode_type_index(labcomm_encoder_t *e, labcomm_signature_t *s)
+{
+  int index = get_encoder_index(e, s);
+  labcomm_encode_packed32(e, index);
 }
 
 static void collect_flat_signature(
@@ -455,7 +440,8 @@ static int do_decode_one(labcomm_decoder_t *d)
       result = labcomm_decode_packed32(d);
 //      printf("do_decode_one: result(2) = %x\n", result);
       if (result == LABCOMM_TYPEDEF || result == LABCOMM_SAMPLE) {
-	labcomm_encoder_t *e = labcomm_encoder_new(signature_writer, 0);
+	labcomm_encoder_t *e = labcomm_encoder_new(
+	  labcomm_dynamic_buffer_writer, 0);
 	labcomm_signature_t signature;
 	labcomm_sample_entry_t *entry;
 	int index;
@@ -521,12 +507,13 @@ labcomm_decoder_t *labcomm_decoder_new(
     result->reader.count = 0;
     result->reader.pos = 0;
     result->reader.read = reader;
-    result->reader.read(&result->reader, labcomm_reader_alloc);
+    result->reader.ioctl = NULL;
     result->reader.on_error = on_error_fprintf;
     result->do_register = do_decoder_register;
     result->do_decode_one = do_decode_one;
     result->on_error = on_error_fprintf;
-	result->on_new_datatype = on_new_datatype;
+    result->on_new_datatype = on_new_datatype;
+    result->reader.read(&result->reader, labcomm_reader_alloc);
   }
   return result;
 }
diff --git a/lib/c/labcomm.h b/lib/c/labcomm.h
index 9770188..d99d8fa 100644
--- a/lib/c/labcomm.h
+++ b/lib/c/labcomm.h
@@ -59,12 +59,15 @@ enum labcomm_error {
 /* Error strings. _must_ be the same order as in enum labcomm_error */
 extern const char *labcomm_error_strings[];
 
-/* The callback prototype for error handling.\
+/* The callback prototype for error handling.
  * First parameter is the error ID.
- * The second paramters is the number of va_args that comes after this one. If noneit should be 0.
- * Optionaly other paramters can be supplied depending on what is needed for this error ID.
+ * The second paramters is the number of va_args that comes after this 
+ * one. If none it should be 0.
+ * Optionaly other paramters can be supplied depending on what is needed 
+ * for this error ID.
  */
-typedef void (* labcomm_error_handler_callback)(enum labcomm_error error_id, size_t nbr_va_args, ...); 
+typedef void (*labcomm_error_handler_callback)(enum labcomm_error error_id, 
+					       size_t nbr_va_args, ...); 
 
 /* Default error handler, prints message to stderr. 
  * Extra info about the error can be supplied as char* as VA-args. Especially user defined errors should supply a describing string. if nbr_va_args > 1 the first variable argument must be a printf format string and the possibly following arguments are passed as va_args to vprintf. 
@@ -80,8 +83,9 @@ void labcomm_register_error_handler_decoder(struct labcomm_decoder *decoder, lab
 /* Get a string describing the supplied standrad labcomm error. */
 const char *labcomm_error_get_str(enum labcomm_error error_id);
 
-typedef int (* labcomm_handle_new_datatype_callback)(struct labcomm_decoder *decoder,
-		labcomm_signature_t *sig);
+typedef int (*labcomm_handle_new_datatype_callback)(
+  struct labcomm_decoder *decoder,
+  labcomm_signature_t *sig);
 
 void labcomm_decoder_register_new_datatype_handler(struct labcomm_decoder *d,
 		labcomm_handle_new_datatype_callback on_new_datatype);
@@ -96,7 +100,8 @@ typedef enum {
   labcomm_reader_free,
   labcomm_reader_start, 
   labcomm_reader_continue, 
-  labcomm_reader_end
+  labcomm_reader_end,
+  labcomm_reader_ioctl
 } labcomm_reader_action_t;
 
 typedef struct labcomm_reader {
@@ -106,6 +111,7 @@ typedef struct labcomm_reader {
   int count;
   int pos;
   int (*read)(struct labcomm_reader *, labcomm_reader_action_t);
+  int (*ioctl)(struct labcomm_reader *, int, va_list);
   labcomm_error_handler_callback on_error;
 }  labcomm_reader_t;
 
@@ -124,14 +130,14 @@ void labcomm_decoder_free(
  */
 
 typedef enum { 
-  labcomm_writer_alloc,          // no args
-  labcomm_writer_free,           // no args
-  labcomm_writer_start,          // no args
-  labcomm_writer_continue,       // no args
-  labcomm_writer_end,            // no args
-  labcomm_writer_available,      // no args
-  labcomm_writer_send_signature, // args = (labcomm_signature_t*, struct labcomm_encoder*)
-  labcomm_writer_user_action	 // args = (int user_action, ... defined by the writer)
+  labcomm_writer_alloc,              /* Allocate all neccessary data */
+  labcomm_writer_free,               /* Free all allocated data */
+  labcomm_writer_start,              /* Start writing an ordinary sample */
+  labcomm_writer_continue,           /* Buffer full during ordinary sample */
+  labcomm_writer_end,                /* End writing ordinary sample */
+  labcomm_writer_start_signature,    /* Start writing signature */
+  labcomm_writer_continue_signature, /* Buffer full during signature */
+  labcomm_writer_end_signature,      /* End writing signature */
 } labcomm_writer_action_t;
 
 typedef struct labcomm_writer {
@@ -140,14 +146,20 @@ typedef struct labcomm_writer {
   int data_size;
   int count;
   int pos;
-  int (*write)(struct labcomm_writer *, labcomm_writer_action_t, ...);
+  int error;
+  int (*write)(struct labcomm_writer *, labcomm_writer_action_t);
+  int (*ioctl)(struct labcomm_writer *, int, va_list);
   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);
+/* See labcomm_ioctl.h for predefined ioctl_action values */
+int labcomm_encoder_ioctl(struct labcomm_encoder *encoder, 
+			  int ioctl_action,
+			  ...);
 
 #endif
diff --git a/lib/c/labcomm_dynamic_buffer_reader_writer.c b/lib/c/labcomm_dynamic_buffer_reader_writer.c
new file mode 100644
index 0000000..1e55c41
--- /dev/null
+++ b/lib/c/labcomm_dynamic_buffer_reader_writer.c
@@ -0,0 +1,40 @@
+#include "labcomm_dynamic_buffer_reader_writer.h"
+
+int labcomm_dynamic_buffer_writer(
+  labcomm_writer_t *w,
+  labcomm_writer_action_t action)
+{
+  switch (action) {
+    case labcomm_writer_alloc: {
+      w->data_size = 1000;
+      w->count = w->data_size;
+      w->data = malloc(w->data_size);
+      w->pos = 0;
+    } break;
+    case labcomm_writer_start: 
+    case labcomm_writer_start_signature: {
+      w->data_size = 1000;
+      w->count = w->data_size;
+      w->data = realloc(w->data, w->data_size);
+      w->pos = 0;
+    } break;
+    case labcomm_writer_continue: 
+    case labcomm_writer_continue_signature: {
+      w->data_size += 1000;
+      w->count = w->data_size;
+      w->data = realloc(w->data, w->data_size);
+    } break;
+    case labcomm_writer_end: 
+    case labcomm_writer_end_signature: {
+    } break;
+    case labcomm_writer_free: {
+      free(w->data);
+      w->data = 0;
+      w->data_size = 0;
+      w->count = 0;
+      w->pos = 0;
+    } break;
+  }
+  return 0;
+}
+
diff --git a/lib/c/labcomm_dynamic_buffer_reader_writer.h b/lib/c/labcomm_dynamic_buffer_reader_writer.h
new file mode 100644
index 0000000..d82152c
--- /dev/null
+++ b/lib/c/labcomm_dynamic_buffer_reader_writer.h
@@ -0,0 +1,14 @@
+#ifndef _LABCOMM_DYNAMIC_BUFFER_READER_WRITER_H_
+#define _LABCOMM_DYNAMIC_BUFFER_READER_WRITER_H_
+
+#include "labcomm.h"
+
+extern int labcomm_dynamic_buffer_reader(
+  labcomm_reader_t *reader, 
+  labcomm_reader_action_t action);
+
+extern int labcomm_dynamic_buffer_writer(
+  labcomm_writer_t *writer, 
+  labcomm_writer_action_t action);
+
+#endif
diff --git a/lib/c/labcomm_fd_reader_writer.c b/lib/c/labcomm_fd_reader_writer.c
index c76f7ac..bd81f7b 100644
--- a/lib/c/labcomm_fd_reader_writer.c
+++ b/lib/c/labcomm_fd_reader_writer.c
@@ -53,15 +53,17 @@ int labcomm_fd_reader(
       r->pos = 0;
       result = 0;
     } break;
+    case labcomm_reader_ioctl: {
+      result = -ENOTSUP;
+    }
   }
   return result;
 }
 
 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;
 
@@ -86,33 +88,20 @@ int labcomm_fd_writer(
       w->count = 0;
       w->pos = 0;
     } break;
-    case labcomm_writer_start: {
+    case labcomm_writer_start: 
+    case labcomm_writer_start_signature: {
       w->pos = 0;
     } break;
-    case labcomm_writer_continue: {
+    case labcomm_writer_continue: 
+    case labcomm_writer_continue_signature: {
       result = write(*fd, w->data, w->pos);
       w->pos = 0;
     } break;
-    case labcomm_writer_end: {
+    case labcomm_writer_end: 
+    case labcomm_writer_end_signature: {
       result = write(*fd, w->data, w->pos);
       w->pos = 0;
     } break;
-    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);
-
-      labcomm_encode_signature(e, signature);
-    } break;
-    case labcomm_writer_user_action: {
-      result = -ENOTSUP;
-    } break;
   }
   return result;
 }
diff --git a/lib/c/labcomm_fd_reader_writer.h b/lib/c/labcomm_fd_reader_writer.h
index 2d08cf1..ef6b637 100644
--- a/lib/c/labcomm_fd_reader_writer.h
+++ b/lib/c/labcomm_fd_reader_writer.h
@@ -1,10 +1,14 @@
+#ifndef _LABCOMM_FD_READER_WRITER_H_
+#define _LABCOMM_FD_READER_WRITER_H_
+
 #include "labcomm.h"
 
 extern int labcomm_fd_reader(
-  labcomm_reader_t *r, 
+  labcomm_reader_t *reader, 
   labcomm_reader_action_t action);
 
 extern int labcomm_fd_writer(
-  labcomm_writer_t *r, 
-  labcomm_writer_action_t action,
-  ...);
+  labcomm_writer_t *writer, 
+  labcomm_writer_action_t action);
+
+#endif
diff --git a/lib/c/labcomm_ioctl.h b/lib/c/labcomm_ioctl.h
new file mode 100644
index 0000000..04dff0f
--- /dev/null
+++ b/lib/c/labcomm_ioctl.h
@@ -0,0 +1,11 @@
+#include "labcomm.h"
+
+struct labcomm_ioctl_register_signature {
+  int index;
+  labcomm_signature_t *signature;
+};
+
+#define LABCOMM_IOCTL_REGISTER_SIGNATURE         0x0001
+#define LABCOMM_IOCTL_WRITER_GET_BYTES_WRITTEN   0x0002
+#define LABCOMM_IOCTL_WRITER_GET_BYTE_POINTER    0x0003
+#define LABCOMM_IOCTL_WRITER_COPY_BYTES          0x0004
diff --git a/lib/c/labcomm_private.h b/lib/c/labcomm_private.h
index dffa349..7638d73 100644
--- a/lib/c/labcomm_private.h
+++ b/lib/c/labcomm_private.h
@@ -39,7 +39,7 @@
 /*
  * Start index for user defined types
  */
-#define LABCOMM_USER     0x60
+#define LABCOMM_USER     0x40
 
 /*
  * Semi private decoder declarations
@@ -196,7 +196,7 @@ static inline void labcomm_buffer_reader_setup(
   void *data,
   int length)
 {
-  r->context = NULL; // Used as errer flag
+  r->context = NULL; // Used as error flag
   r->data = data;  
   r->data_size = length;
   r->count = length;
@@ -233,10 +233,6 @@ void labcomm_internal_encode(
   labcomm_signature_t *signature, 
   void *value);
 
-#define LABCOMM_USER_ACTION(i) (i + 100)
-void labcomm_internal_encoder_user_action(struct labcomm_encoder *encoder, 
-					  int action);
-
 #if __BYTE_ORDER == __LITTLE_ENDIAN
 
 #define LABCOMM_ENCODE(name, type)					\
@@ -335,7 +331,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
diff --git a/lib/c/labcomm_mem_reader.c b/lib/c/test/labcomm_mem_reader.c
similarity index 96%
rename from lib/c/labcomm_mem_reader.c
rename to lib/c/test/labcomm_mem_reader.c
index 088123d..0c4e3f1 100644
--- a/lib/c/labcomm_mem_reader.c
+++ b/lib/c/test/labcomm_mem_reader.c
@@ -67,6 +67,9 @@ int labcomm_mem_reader(labcomm_reader_t *r, labcomm_reader_action_t action)
       r->pos = 0;
       result = 0;
     } break;
+    case labcomm_reader_ioctl: {
+      result = -ENOTSUP;
+    }
   }
   return result;
 }
diff --git a/lib/c/labcomm_mem_reader.h b/lib/c/test/labcomm_mem_reader.h
similarity index 100%
rename from lib/c/labcomm_mem_reader.h
rename to lib/c/test/labcomm_mem_reader.h
diff --git a/lib/c/labcomm_mem_writer.c b/lib/c/test/labcomm_mem_writer.c
similarity index 85%
rename from lib/c/labcomm_mem_writer.c
rename to lib/c/test/labcomm_mem_writer.c
index dab69f1..6f26e69 100644
--- a/lib/c/labcomm_mem_writer.c
+++ b/lib/c/test/labcomm_mem_writer.c
@@ -27,9 +27,8 @@ static void copy_data(labcomm_writer_t *w, labcomm_mem_writer_context_t *mcontex
  * Write encoded messages to memory. w->context is assumed to be a pointer to a
  * labcomm_mem_writer_context_t structure.
  */
-int labcomm_mem_writer(labcomm_writer_t *w, labcomm_writer_action_t action, ...)
+int labcomm_mem_writer(labcomm_writer_t *w, labcomm_writer_action_t action)
 {
-  va_list argp;
   int result = 0;
   // Unwrap pointers for easy access.
   labcomm_mem_writer_context_t *mcontext = (labcomm_mem_writer_context_t *) w->context;
@@ -66,14 +65,17 @@ int labcomm_mem_writer(labcomm_writer_t *w, labcomm_writer_action_t action, ...)
     w->count = 0;
     w->pos = 0;
    } break;
-  case labcomm_writer_start:{
+  case labcomm_writer_start:
+    case labcomm_writer_start_signature: {
 #if (ENCODED_BUFFER == 1)
     w->pos = 0;
 #elif (ENCODED_BUFFER == 2)
     w->pos = mcontext->write_pos;
 #endif
     } break;
-  case labcomm_writer_continue:{ // Encode-buffer(w->data) is full; empty/handle it. (w->pos == w->count) most likely.
+  case labcomm_writer_continue:
+  case labcomm_writer_continue_signature: { 
+    // Encode-buffer(w->data) is full; empty/handle it. (w->pos == w->count) most likely.
 #if (ENCODED_BUFFER == 1)
     copy_data(w, mcontext, mbuf);
     result = w->pos; // Assume result here should be number of bytes written.
@@ -82,8 +84,9 @@ int labcomm_mem_writer(labcomm_writer_t *w, labcomm_writer_action_t action, ...)
     mcontext->write_pos = w->pos;
 #endif
      result = 0;
-       } break;
-  case labcomm_writer_end:{ // Nothing more to encode, handle encode-buffer(w->data).
+    } break;
+  case labcomm_writer_end:
+  case labcomm_writer_end_signature:{ // Nothing more to encode, handle encode-buffer(w->data).
 #if (ENCODED_BUFFER == 1)
     copy_data(w, mcontext, mbuf);
     result = w->pos;
@@ -93,19 +96,6 @@ int labcomm_mem_writer(labcomm_writer_t *w, labcomm_writer_action_t action, ...)
 #endif
     result = 0;
     } break;
-  case labcomm_writer_available:{
-    result = w->count - w->pos;
-     } break;
-  case labcomm_writer_send_signature: {
-    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);
-    labcomm_encode_signature(e, signature);
-    } break;
-  case labcomm_writer_user_action:{
-     result = -ENOTSUP;
-    } break;
   }
   return result;
 }
diff --git a/lib/c/labcomm_mem_writer.h b/lib/c/test/labcomm_mem_writer.h
similarity index 98%
rename from lib/c/labcomm_mem_writer.h
rename to lib/c/test/labcomm_mem_writer.h
index 7506342..4585903 100644
--- a/lib/c/labcomm_mem_writer.h
+++ b/lib/c/test/labcomm_mem_writer.h
@@ -11,7 +11,7 @@ struct labcomm_mem_writer_context_t {
   unsigned char *buf;  // Allocated destination buffer.
 };
 
-int labcomm_mem_writer(labcomm_writer_t *w, labcomm_writer_action_t action, ...);
+int labcomm_mem_writer(labcomm_writer_t *w, labcomm_writer_action_t action);
 
 /* Wrapper the internal static function copy_data. This is needed so that the exceptions can be unit tested. */
 void test_copy_data(labcomm_writer_t *w, labcomm_mem_writer_context_t *mcontext, unsigned char *mbuf);
diff --git a/lib/csharp/se/lth/control/labcomm/LabComm.cs b/lib/csharp/se/lth/control/labcomm/LabComm.cs
index d37db36..21f613c 100644
--- a/lib/csharp/se/lth/control/labcomm/LabComm.cs
+++ b/lib/csharp/se/lth/control/labcomm/LabComm.cs
@@ -25,7 +25,7 @@ namespace se.lth.control.labcomm {
     /*
      * start of user defined types 
      */
-    public const int FIRST_USER_INDEX = 0x60;
+    public const int FIRST_USER_INDEX = 0x40;
 
   }
 
diff --git a/lib/java/se/lth/control/labcomm/LabComm.java b/lib/java/se/lth/control/labcomm/LabComm.java
index 7a82e76..07d1705 100644
--- a/lib/java/se/lth/control/labcomm/LabComm.java
+++ b/lib/java/se/lth/control/labcomm/LabComm.java
@@ -25,6 +25,6 @@ public class LabComm {
   /*
    * Start of 
    */
-  public static final int FIRST_USER_INDEX = 0x60;
+  public static final int FIRST_USER_INDEX = 0x40;
 
 }
diff --git a/lib/python/labcomm/LabComm.py b/lib/python/labcomm/LabComm.py
index 24a757c..1dfc4e0 100644
--- a/lib/python/labcomm/LabComm.py
+++ b/lib/python/labcomm/LabComm.py
@@ -113,7 +113,7 @@ i_FLOAT   = 0x25
 i_DOUBLE  = 0x26
 i_STRING  = 0x27
 
-i_USER    = 0x60
+i_USER    = 0x40
 
 def indent(i, s):
     return ("\n%s" % (" " * i)).join(s.split("\n"))
-- 
GitLab