diff --git a/compiler/2014/Java_CodeGen.jrag b/compiler/2014/Java_CodeGen.jrag index c17cdb2a75c236c1fc2532611ac3003fce5e531c..e643aa4de53794f133c559f0b4fd40001e2d4695 100644 --- a/compiler/2014/Java_CodeGen.jrag +++ b/compiler/2014/Java_CodeGen.jrag @@ -570,11 +570,7 @@ aspect Java_Class { // env.println(); env.println("public void encodeTypeDef(Encoder e, int index) throws IOException{"); env.indent(); - env.println("e.begin(Constant.TYPE_DEF);"); - env.println("e.encodePacked32(index);"); - env.println("e.encodeString(getName());"); env.println("emitSignature(e);"); - env.println("e.end(null);"); env.unindent(); env.println("}"); env.println(); diff --git a/lib/c/2014/labcomm.c b/lib/c/2014/labcomm.c index 22da2e1ebbf60d41ae96ac8b52682201ff53f8d2..c11f50b0c634abdb925b4f4697cec10820475df4 100644 --- a/lib/c/2014/labcomm.c +++ b/lib/c/2014/labcomm.c @@ -47,19 +47,19 @@ UNWRAP_ac( __VA_ARGS__) = UNWRAP_ac(__VA_ARGS__)->next; \ } -int labcomm_reader_alloc(struct labcomm_reader *r, +int labcomm_reader_alloc(struct labcomm_reader *r, struct labcomm_reader_action_context *action_context) { UNWRAP(alloc, r, action_context); } -int labcomm_reader_free(struct labcomm_reader *r, +int labcomm_reader_free(struct labcomm_reader *r, struct labcomm_reader_action_context *action_context) { UNWRAP(free, r, action_context); } -int labcomm_reader_start(struct labcomm_reader *r, +int labcomm_reader_start(struct labcomm_reader *r, struct labcomm_reader_action_context *action_context, int local_index, int remote_index, const struct labcomm_signature *signature, @@ -68,41 +68,41 @@ int labcomm_reader_start(struct labcomm_reader *r, UNWRAP(start, r, action_context, local_index, remote_index, signature, value); } -int labcomm_reader_end(struct labcomm_reader *r, +int labcomm_reader_end(struct labcomm_reader *r, struct labcomm_reader_action_context *action_context) { UNWRAP(end, r, action_context); } -int labcomm_reader_fill(struct labcomm_reader *r, +int labcomm_reader_fill(struct labcomm_reader *r, struct labcomm_reader_action_context *action_context) { UNWRAP(fill, r, action_context); } -int labcomm_reader_ioctl(struct labcomm_reader *r, +int labcomm_reader_ioctl(struct labcomm_reader *r, struct labcomm_reader_action_context *action_context, int local_index, int remote_index, - const struct labcomm_signature *signature, + const struct labcomm_signature *signature, uint32_t ioctl_action, va_list args) { - UNWRAP(ioctl, r, action_context, + UNWRAP(ioctl, r, action_context, local_index, remote_index, signature, ioctl_action, args); } -int labcomm_writer_alloc(struct labcomm_writer *w, +int labcomm_writer_alloc(struct labcomm_writer *w, struct labcomm_writer_action_context *action_context) { UNWRAP(alloc, w, action_context); } -int labcomm_writer_free(struct labcomm_writer *w, +int labcomm_writer_free(struct labcomm_writer *w, struct labcomm_writer_action_context *action_context) { UNWRAP(free, w, action_context); } -int labcomm_writer_start(struct labcomm_writer *w, +int labcomm_writer_start(struct labcomm_writer *w, struct labcomm_writer_action_context *action_context, int index, const struct labcomm_signature *signature, void *value) @@ -110,26 +110,26 @@ int labcomm_writer_start(struct labcomm_writer *w, UNWRAP(start, w, action_context, index, signature, value); } -int labcomm_writer_end(struct labcomm_writer *w, +int labcomm_writer_end(struct labcomm_writer *w, struct labcomm_writer_action_context *action_context) { UNWRAP(end, w, action_context); -} +} -int labcomm_writer_flush(struct labcomm_writer *w, +int labcomm_writer_flush(struct labcomm_writer *w, struct labcomm_writer_action_context *action_context) { UNWRAP(flush, w, action_context); -} +} -int labcomm_writer_ioctl(struct labcomm_writer *w, - struct labcomm_writer_action_context *action_context, - int index, - const struct labcomm_signature *signature, +int labcomm_writer_ioctl(struct labcomm_writer *w, + struct labcomm_writer_action_context *action_context, + int index, + const struct labcomm_signature *signature, uint32_t ioctl_action, va_list args) { UNWRAP(ioctl, w, action_context, index, signature, ioctl_action, args); -} +} #undef UNWRAP #undef UNWRAP_ac @@ -137,12 +137,12 @@ int labcomm_writer_ioctl(struct labcomm_writer *w, -static const char *labcomm_error_string[] = { +static const char *labcomm_error_string[] = { #define LABCOMM_ERROR(name, description) description , #include "labcomm_error.h" #undef LABCOMM_ERROR }; -static const int labcomm_error_string_count = (sizeof(labcomm_error_string) / +static const int labcomm_error_string_count = (sizeof(labcomm_error_string) / sizeof(labcomm_error_string[0])); @@ -175,7 +175,7 @@ void labcomm2014_on_error_fprintf(enum labcomm_error error_id, size_t nbr_va_arg fprintf(stderr, "}\n"); va_end(arg_pointer); - } + } #else ; // If labcomm can't be compiled with stdio the user will have to make an own error callback functionif he/she needs error reporting. #endif @@ -207,8 +207,8 @@ void *labcomm_signature_array_ref(struct labcomm_memory *memory, *first = index; *last = index + 1; *data = labcomm_memory_alloc(memory, 0, size); - if (*data) { - memset(*data, 0, size); + if (*data) { + memset(*data, 0, size); } } else if (index < *first || *last <= index) { void *old_data = *data; @@ -221,8 +221,8 @@ void *labcomm_signature_array_ref(struct labcomm_memory *memory, *data = labcomm_memory_alloc(memory, 0, n * size); if (*data) { memset(*data, 0, n * size); - memcpy(*data + (old_first - *first) * size, - old_data, + memcpy(*data + (old_first - *first) * size, + old_data, (old_last - old_first) * size); } // dump(old_data, size, old_first, old_last); diff --git a/lib/c/2014/labcomm_decoder.c b/lib/c/2014/labcomm_decoder.c index 1d3c1f06a2fb77c3796850a7a50aa87e0c11ed0a..68f1e3ea021e878653bb1227733fe51758d01f95 100644 --- a/lib/c/2014/labcomm_decoder.c +++ b/lib/c/2014/labcomm_decoder.c @@ -166,6 +166,72 @@ static int handle_sample_ref(struct labcomm_decoder *d, int remote_index, return result; } +static int decoder_skip(struct labcomm_decoder *d, int len, int tag) +{ + int i; + printf("got tag 0x%x, skipping %d bytes\n", tag, len); + for(i = 0; i <len; i++){ + fprintf(stderr,"."); + labcomm_read_byte(d->reader); + if (d->reader->error < 0) { + fprintf(stderr, "\nerror while skipping: %d\n", d->reader->error); + return d->reader->error; + } + } + fprintf(stderr, "\n"); + return tag; +} + +static int decode_type_binding(struct labcomm_decoder *d, int kind) +{ + int sample_index = labcomm_read_packed32(d->reader); + int typedef_index = labcomm_read_packed32(d->reader); + printf("type_binding: 0x%x -> 0x%x\n", sample_index, typedef_index); + int result = kind; + return result; +} +static int decode_type_def(struct labcomm_decoder *d, int kind){ + int i, remote_index, result; + char *name; + int size; + remote_index = labcomm_read_packed32(d->reader); + result = remote_index; + if (d->reader->error < 0) { + result = d->reader->error; + goto out; + } + name = labcomm_read_string(d->reader); + if (d->reader->error < 0) { + result = d->reader->error; + goto out; + } + size = labcomm_read_packed32(d->reader); + if (d->reader->error < 0) { + result = d->reader->error; + goto free_signature_name; + } + //printf("got typedef 0x%x : %s, skipping %d signature bytes", remote_index, name, size); +#if 0 + signature.signature = labcomm_memory_alloc(d->memory, 1, signature.size); + if (d->reader->error < 0) { + result = d->reader->error; + goto free_signature_name; + } +#endif + for (i = 0 ; i < size ; i++) { + /*signature.signature[i] =*/ labcomm_read_byte(d->reader); + if (d->reader->error < 0) { + result = d->reader->error; + goto free_signature_signature; + } + } +free_signature_signature: +// labcomm_memory_free(d->memory, 1, signature.signature); +free_signature_name: + labcomm_memory_free(d->memory, 0, name); +out: + return result; +} static int decode_sample_def_or_ref(struct labcomm_decoder *d, int kind) { @@ -200,16 +266,31 @@ static int decode_sample_def_or_ref(struct labcomm_decoder *d, int kind) goto free_signature_signature; } } - if (kind == LABCOMM_SAMPLE_DEF) { - result = handle_sample_def(d, remote_index, &signature); - } else if (kind == LABCOMM_SAMPLE_REF) { - result = handle_sample_ref(d, remote_index, &signature); - if (result == -ENOENT) { - /* Dummy value to silently continue */ - result = LABCOMM_SAMPLE_REF; + switch (kind) { + case LABCOMM_SAMPLE_DEF: { + result = handle_sample_def(d, remote_index, &signature); + break; + } + case LABCOMM_SAMPLE_REF: { + result = handle_sample_ref(d, remote_index, &signature); + if (result == -ENOENT) { + /* Dummy value to silently continue */ + result = LABCOMM_SAMPLE_REF; + } + break; + } + case LABCOMM_TYPE_DEF: { + int i; + printf("labcomm_decoder: ignoring TYPE_DEF 0x%x\n", remote_index); + for(i = 0; i < signature.size; i++){ + printf("%x ",signature.signature[i]); + } + printf("\n"); + result = LABCOMM_SAMPLE_DEF; + break; } - } else { - result = -EINVAL; + default: + result = -EINVAL; } free_signature_signature: labcomm_memory_free(d->memory, 1, signature.signature); @@ -249,18 +330,6 @@ static void reader_alloc(struct labcomm_decoder *d) } } -static int decoder_skip(struct labcomm_decoder *d, int len, int tag) -{ - int i; - printf("got tag 0x%x, skipping %d bytes\n", tag, len); - for(i = 0; i <len; i++){ - labcomm_read_byte(d->reader); - if (d->reader->error < 0) { - return d->reader->error; - } - } - return tag; -} /* d - decoder to read from registry - decoder to lookup signatures (registry != d only if nesting decoders, e.g., when decoding pragma) @@ -375,9 +444,9 @@ int labcomm_decoder_decode_one(struct labcomm_decoder *d) } else if (remote_index == LABCOMM_SAMPLE_REF) { result = decode_sample_def_or_ref(d, LABCOMM_SAMPLE_REF); } else if (remote_index == LABCOMM_TYPE_DEF) { - result = decoder_skip(d, length, remote_index); + result = decode_type_def(d, LABCOMM_TYPE_DEF); } else if (remote_index == LABCOMM_TYPE_BINDING) { - result = decoder_skip(d, length, remote_index); + result = decode_type_binding(d, LABCOMM_TYPE_BINDING); } else if (remote_index == LABCOMM_PRAGMA) { result = decode_pragma(d, d, length); } else if (remote_index < LABCOMM_USER) { diff --git a/lib/c/2014/labcomm_encoder.c b/lib/c/2014/labcomm_encoder.c index f8fd9ae8553b560dde77e3daf526a684823d7e79..56af811048ce40e992176dc1ff326499abf10996 100644 --- a/lib/c/2014/labcomm_encoder.c +++ b/lib/c/2014/labcomm_encoder.c @@ -240,6 +240,36 @@ static void do_write_signature(struct labcomm_encoder * e, const struct labcomm_ #endif } +#ifdef TEST_MAP +static void sig_size(char b, const struct labcomm_signature *signature, + void *context) +{ + int *result = context; + int diff; + if(signature) { + int idx = labcomm_get_local_index(signature); + diff = labcomm_size_packed32(idx); + //printf("== diff = %d, idx = 0x%d\n",diff, idx); + }else { + diff = 1; + //printf("== diff = %d, byte = 0x%d\n",diff, b); + } + (*result)+=diff; +} +#endif +static int calc_sig_encoded_size(struct labcomm_encoder *e, + const struct labcomm_signature *sig) +{ + int result=0; +#ifdef TEST_MAP + map_signature(sig_size, &result, sig, FALSE); +#else + fprintf("warning! calc_sig_encoded_size not implemented without map...\n"); +#endif + //printf("calc_sig_encoded_size: %s == %d\n",sig->name,result); + return result; +} + static int internal_reg_type( struct labcomm_encoder *e, const struct labcomm_signature *signature, @@ -263,6 +293,7 @@ static int internal_reg_type( labcomm_write_string(e->writer, signature->name); //XXX flush for debugging, can be removed when working // labcomm_writer_flush(e->writer, e->writer->action_context); + labcomm_write_packed32(e->writer, calc_sig_encoded_size(e, signature)); do_write_signature(e, signature, FALSE); // for (i = 0 ; i < signature->size ; i++) { // if (e->writer->pos >= e->writer->count) { diff --git a/lib/c/2014/test/test_labcomm.c b/lib/c/2014/test/test_labcomm.c index e37950e612d3ffb38c08bdec4b31c0325cb851a7..7c617f8164690b6028f69f1f6b4f50ff3d476493 100644 --- a/lib/c/2014/test/test_labcomm.c +++ b/lib/c/2014/test/test_labcomm.c @@ -125,6 +125,8 @@ int test_decode_one(struct labcomm_decoder *decoder) for (reader.count = 0 ; reader.count < writer.pos ; reader.count++) { reader.error = 0; reader.pos = 0; + labcomm_decoder_decode_one(decoder); + labcomm_decoder_decode_one(decoder); result = labcomm_decoder_decode_one(decoder); if (result >= 0 ) { fprintf(stderr, "Got result from buffer with bogus length (%d)\n", diff --git a/lib/c/2014/test/test_labcomm_copy.c b/lib/c/2014/test/test_labcomm_copy.c index 728195582a491be649adcb05c4aaa3c930456f69..9261e666cd723d47ddcc97714b4c374eee55f001 100644 --- a/lib/c/2014/test/test_labcomm_copy.c +++ b/lib/c/2014/test/test_labcomm_copy.c @@ -199,6 +199,7 @@ int main(int argc, char **argv) while (labcomm_decoder_decode_one(decoder) > 0) ; + printf("cache_s1.i = %d, s1.i = %d\n", cache_s1.i, s1.i); assert(cache_s1.i == s1.i); puts("S1 copied ok"); diff --git a/lib/c/Makefile b/lib/c/Makefile index a85a91cd77acbdaf3e09890d4b4f3b912fd795a3..de73c0473010a4d81e80cb18f356bb08561afb6d 100644 --- a/lib/c/Makefile +++ b/lib/c/Makefile @@ -9,4 +9,5 @@ all: .PHONY: distclean distclean: rm *.o *.so *.so.1 *.a + for v in $(VERSIONS) ; do $(MAKE) -C $${v} distclean ; done diff --git a/lib/c/os_compat.mk b/lib/c/os_compat.mk index 23b66f2faa2e425e1fb0be3eb0f8772cdd972d60..b916df333d7ef6023694e44cecbafccb13bd6685 100644 --- a/lib/c/os_compat.mk +++ b/lib/c/os_compat.mk @@ -10,15 +10,18 @@ ifeq ($(UNAME_S),Linux) LDLIBS=-llabcomm$(LIBVERSION) -lrt MAKESHARED=gcc -o $1 -shared -Wl,-soname,$2 $3 -lc -lrt else ifeq ($(UNAME_S),Darwin) - CC=$(CROSS_COMPILE)clang - LD=$(CROSS_COMPILE)ld + #CC=$(CROSS_COMPILE)clang + #LD=$(CROSS_COMPILE)ld + CC=$(CROSS_COMPILE)gcc + LD=$(CROSS_COMPILE)gcc CFLAGS=-g -Wall -Werror -O3 -I. -Itest \ -DLABCOMM_COMPAT=\"labcomm_compat_osx.h\" \ - -DLABCOMM_OS_DARWIN=1\ - -Wno-tautological-compare -Wno-unused-function - LDFLAGS=-L.. + -DLABCOMM_OS_DARWIN=1 +# -Wno-tautological-compare -Wno-unused-function + CFLAGS+=-std=c99 + LDFLAGS=-L.. LDLIBS=-llabcomm$(LIBVERSION) - MAKESHARED=clang -o $1 -shared -Wl,-install_name,$2 $3 -lc + MAKESHARED=clang -o $1 -shared -Wl,-install_name,$2 $3 -lc else ifneq ($(findstring CYGWIN,$(UNAME_S)),) CC=$(CROSS_COMPILE)gcc LD=$(CROSS_COMPILE)ld diff --git a/lib/java/se/lth/control/labcomm/DecoderChannel.java b/lib/java/se/lth/control/labcomm/DecoderChannel.java index dc25d2366ad4752d56660a2628d6f1c1219c396f..45dd0cc8992c7f23f64eaaa3bf142985d4795579 100644 --- a/lib/java/se/lth/control/labcomm/DecoderChannel.java +++ b/lib/java/se/lth/control/labcomm/DecoderChannel.java @@ -35,10 +35,18 @@ public class DecoderChannel implements Decoder { } private void processTypeDef(int len) throws IOException { - System.err.println("Got TypeDef: skipping "+len+" bytes"); - for(int i=0; i<len; i++) { - decodeByte(); + //System.err.println("Got TypeDef: skipping "+len+" bytes"); + int idx = decodePacked32(); + String name = decodeString(); + System.err.println("Got TypeDef: "+idx+" "+name); + int siglen = decodePacked32(); + System.err.println("siglen="+siglen); + for(int i=0; i<siglen; i++) { + byte b = decodeByte(); + System.out.print(b); + System.out.print(" "); } + System.out.println(); } private void processTypeBinding(int len) throws IOException { diff --git a/lib/java/se/lth/control/labcomm/EncoderChannel.java b/lib/java/se/lth/control/labcomm/EncoderChannel.java index 0872414cad14518ebb330ec0914830ea47798d5d..c3b16a280c981817d0cfe4551077452e589cd787 100644 --- a/lib/java/se/lth/control/labcomm/EncoderChannel.java +++ b/lib/java/se/lth/control/labcomm/EncoderChannel.java @@ -15,18 +15,26 @@ public class EncoderChannel implements Encoder { private EncoderRegistry type_def_registry = new EncoderRegistry(); private int current_tag; - public EncoderChannel(Writer writer) throws IOException { + private EncoderChannel(Writer writer, boolean emitVersion) throws IOException { this.writer = writer; - begin(Constant.VERSION); - encodeString(Constant.CURRENT_VERSION); - end(null); + if(emitVersion){ + begin(Constant.VERSION); + encodeString(Constant.CURRENT_VERSION); + end(null); + } + } + public EncoderChannel(Writer writer) throws IOException { + this(writer, true); } public EncoderChannel(OutputStream writer) throws IOException { - this(new WriterWrapper(writer)); + this(new WriterWrapper(writer), true); } + private EncoderChannel(OutputStream writer, boolean emitVersion) throws IOException { + this(new WriterWrapper(writer), emitVersion); + } private void bindType(int sampleId, int typeId) throws IOException { begin(Constant.TYPE_BINDING); encodePacked32(sampleId); @@ -50,6 +58,19 @@ public class EncoderChannel implements Encoder { } + private static class WrappedEncoder extends EncoderChannel{ + private Encoder wrapped; + + public WrappedEncoder(Encoder e, OutputStream s, boolean emitVersion) throws IOException { + super(s,emitVersion); + this.wrapped = e; + } + public int getTypeId(Class<? extends SampleType> c) throws IOException{ + return wrapped.getTypeId(c); + } + } + + private int registerTypeDef(SampleDispatcher dispatcher) throws IOException { //XXX A bit crude; maybe add boolean registry.contains(...) and check // if already registered @@ -57,11 +78,24 @@ public class EncoderChannel implements Encoder { return type_def_registry.getTag(dispatcher); } catch (IOException e) { int index = type_def_registry.add(dispatcher); - begin(dispatcher.getTypeDeclTag()); + System.out.println("registered "+dispatcher.getName()); + // + //wrap encoder to get encoded length of signature + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + EncoderChannel wrapped = new WrappedEncoder(this, baos, false); + dispatcher.encodeTypeDef(wrapped, index); + wrapped.flush(); + byte b[] = baos.toByteArray(); + + begin(Constant.TYPE_DEF); encodePacked32(index); encodeString(dispatcher.getName()); - dispatcher.encodeTypeDef(this, index); + encodePacked32(b.length); + for(int i = 0; i<b.length; i++) { + encodeByte(b[i]); + } end(null); + return index; } } @@ -104,6 +138,12 @@ public class EncoderChannel implements Encoder { begin(sample_def_registry.getTag(c)); } + /* temporary(?) fix to allow nesting encoders to find encoded size */ + private void flush() throws IOException{ + data.flush(); + writer.write(bytes.toByteArray()); + bytes.reset(); + } public void end(Class<? extends SampleType> c) throws IOException { data.flush(); WritePacked32(writer, current_tag); @@ -112,8 +152,8 @@ public class EncoderChannel implements Encoder { bytes.reset(); } - /** - * @return the id of a TYPE_DEF + /** + * @return the id of a TYPE_DEF */ public int getTypeId(Class<? extends SampleType> c) throws IOException { return type_def_registry.getTag(c);