From 6f97ea58dab6b1f6704bb76fa116efa41ac14c4e Mon Sep 17 00:00:00 2001 From: Sven Gestegard Robertz <sven.robertz@cs.lth.se> Date: Wed, 25 Jun 2014 11:13:45 +0200 Subject: [PATCH] added user_types example (from explicit-types branch) --- examples/user_types/Decoder.java | 49 ++++++++++++++ examples/user_types/Encoder.java | 88 ++++++++++++++++++++++++++ examples/user_types/compile.sh | 23 +++++++ examples/user_types/example_decoder.c | 44 +++++++++++++ examples/user_types/example_encoder.c | 40 ++++++++++++ examples/user_types/example_encoder.py | 52 +++++++++++++++ examples/user_types/run.sh | 39 ++++++++++++ examples/user_types/test.lc | 25 ++++++++ 8 files changed, 360 insertions(+) create mode 100644 examples/user_types/Decoder.java create mode 100644 examples/user_types/Encoder.java create mode 100644 examples/user_types/compile.sh create mode 100644 examples/user_types/example_decoder.c create mode 100644 examples/user_types/example_encoder.c create mode 100755 examples/user_types/example_encoder.py create mode 100644 examples/user_types/run.sh create mode 100644 examples/user_types/test.lc diff --git a/examples/user_types/Decoder.java b/examples/user_types/Decoder.java new file mode 100644 index 0000000..01bea43 --- /dev/null +++ b/examples/user_types/Decoder.java @@ -0,0 +1,49 @@ +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; + +import se.lth.control.labcomm.LabCommDecoderChannel; + +public class Decoder + implements twoLines.Handler + +{ + + LabCommDecoderChannel decoder; + + public Decoder(InputStream in) + throws Exception + { + decoder = new LabCommDecoderChannel(in); + twoLines.register(decoder, this); + + try { + System.out.println("Running decoder."); + decoder.run(); + } catch (java.io.EOFException e) { + System.out.println("Decoder reached end of file."); + } + } + + private String genPoint(point p) { + return "("+p.x.val+", "+p.y.val+")"; + } + + private String genLine(line l) { + return "Line from "+genPoint(l.start)+" to "+genPoint(l.end); + } + + public void handle_twoLines(twoLines d) throws java.io.IOException { + System.out.print("Got twoLines: "); + System.out.println("Line l1: "+genLine(d.l1)); + System.out.println(" Line l2: "+genLine(d.l2)); + } + + + public static void main(String[] arg) throws Exception { + Decoder example = new Decoder( + new FileInputStream(new File(arg[0])) + ); + } +} + diff --git a/examples/user_types/Encoder.java b/examples/user_types/Encoder.java new file mode 100644 index 0000000..8cdbba8 --- /dev/null +++ b/examples/user_types/Encoder.java @@ -0,0 +1,88 @@ +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStream; + +import se.lth.control.labcomm.LabCommEncoderChannel; + +/** + * Simple encoder + */ +public class Encoder +{ + + LabCommEncoderChannel encoder; + + public Encoder(OutputStream out) + throws Exception + { + encoder = new LabCommEncoderChannel(out); + twoLines.register(encoder); + } + + public void doEncode() throws java.io.IOException { + twoLines x = new twoLines(); + line l1 = new line(); + point p11 = new point(); + coord c11x = new coord(); + coord c11y = new coord(); + c11x.val = 11; + c11y.val = 99; + p11.x = c11x; + p11.y = c11y; + + l1.start = p11; + + point p12 = new point(); + coord c12x = new coord(); + coord c12y = new coord(); + c12x.val = 22; + c12y.val = 88; + p12.x = c12x; + p12.y = c12y; + + l1.end = p12; + + line l2 = new line(); + point p21 = new point(); + coord c21x = new coord(); + coord c21y = new coord(); + c21x.val = 17; + c21y.val = 42; + p21.x = c21x; + p21.y = c21y; + + l2.start = p21; + + point p22 = new point(); + coord c22x = new coord(); + coord c22y = new coord(); + c22x.val = 13; + c22y.val = 37; + p22.x = c22x; + p22.y = c22y; + + l2.end = p22; + + foo f = new foo(); + f.a = 10; + f.b = 20; + f.c = false; + + x.l1 = l1; + x.l2 = l2; + x.f = f; + + System.out.println("Encoding theTwoLines"); + twoLines.encode(encoder, x); + } + + + public static void main(String[] arg) throws Exception { + FileOutputStream fos = new FileOutputStream(arg[0]); + Encoder example = new Encoder(fos); + example.doEncode(); + fos.close(); + } + +} + diff --git a/examples/user_types/compile.sh b/examples/user_types/compile.sh new file mode 100644 index 0000000..37df26f --- /dev/null +++ b/examples/user_types/compile.sh @@ -0,0 +1,23 @@ +### Example compile script, showing the steps required to build a labcomm application +### (including compiler and libs). + +# For current version (2013) +(cd ../..; make all) + +mkdir -p gen +java -jar ../../compiler/labComm.jar --java=gen --c=gen/test.c --h=gen/test.h --python=gen/test.py test.lc + +javac -cp ../../lib/java:. gen/*.java Encoder.java Decoder.java + +gcc -Wall -Werror -Wno-unused-function \ + -I. -I../../lib/c -L../../lib/c \ + -DLABCOMM_COMPAT=\"labcomm_compat_osx.h\" \ + -llabcomm2013 \ + -o example_encoder example_encoder.c gen/test.c + +gcc -Wall -Werror -I . -I ../../lib/c -L../../lib/c \ + -DLABCOMM_COMPAT=\"labcomm_compat_osx.h\" \ + -o example_decoder example_decoder.c gen/test.c \ + -llabcomm2013 + #-Tlabcomm.linkscript + diff --git a/examples/user_types/example_decoder.c b/examples/user_types/example_decoder.c new file mode 100644 index 0000000..1edc52f --- /dev/null +++ b/examples/user_types/example_decoder.c @@ -0,0 +1,44 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <labcomm_fd_reader.h> +#include <labcomm_default_error_handler.h> +#include <labcomm_default_memory.h> +#include <labcomm_default_scheduler.h> +#include "gen/test.h" +#include <stdio.h> + +static void handle_test_twoLines(test_twoLines *v,void *context) { + printf("Got theTwoInts. (%d,%d) -> (%d,%d), (%d,%d) -> (%d,%d)\n", v->l1.start.x.val, v->l1.start.y.val, + v->l1.end.x.val, v->l1.end.y.val, + v->l2.start.x.val, v->l2.start.y.val, + v->l2.end.x.val, v->l2.end.y.val); +} + +int main(int argc, char *argv[]) { + int fd; + struct labcomm_decoder *decoder; + void *context = NULL; + + char *filename = argv[1]; + printf("C decoder reading from %s\n", filename); + fd = open(filename, O_RDONLY); + decoder = labcomm_decoder_new(labcomm_fd_reader_new( + labcomm_default_memory, fd, 1), + labcomm_default_error_handler, + labcomm_default_memory, + labcomm_default_scheduler); + if (!decoder) { + printf("Failed to allocate decoder %s:%d\n", __FUNCTION__, __LINE__); + return 1; + } + + labcomm_decoder_register_test_twoLines(decoder, handle_test_twoLines, context); + + printf("Decoding:\n"); + labcomm_decoder_run(decoder); + printf("--- End Of File ---:\n"); + labcomm_decoder_free(decoder); + + return 0; +} diff --git a/examples/user_types/example_encoder.c b/examples/user_types/example_encoder.c new file mode 100644 index 0000000..3c76dcd --- /dev/null +++ b/examples/user_types/example_encoder.c @@ -0,0 +1,40 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <labcomm_fd_writer.h> +#include <labcomm_default_error_handler.h> +#include <labcomm_default_memory.h> +#include <labcomm_default_scheduler.h> +#include "gen/test.h" +#include <stdio.h> + +int main(int argc, char *argv[]) { + int fd; + struct labcomm_encoder *encoder; + + char *filename = argv[1]; + printf("C encoder writing to %s\n", filename); + fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0644); + encoder = labcomm_encoder_new(labcomm_fd_writer_new( + labcomm_default_memory, fd, 1), + labcomm_default_error_handler, + labcomm_default_memory, + labcomm_default_scheduler); + labcomm_encoder_register_test_twoLines(encoder); + + test_twoLines tl; + + tl.l1.start.x.val = 11; + tl.l1.start.y.val = 13; + tl.l1.end.x.val = 21; + tl.l1.end.y.val = 23; + tl.l2.start.x.val = 11; + tl.l2.start.y.val = 13; + tl.l2.end.x.val = 21; + tl.l2.end.y.val = 23; + + printf("Encoding twoLines...\n"); + labcomm_encode_test_twoLines(encoder, &tl); + + return 0; +} diff --git a/examples/user_types/example_encoder.py b/examples/user_types/example_encoder.py new file mode 100755 index 0000000..f20d42c --- /dev/null +++ b/examples/user_types/example_encoder.py @@ -0,0 +1,52 @@ +#!/usr/bin/python + +import labcomm +import sys +import test + +if __name__ == '__main__': + version = sys.argv[2] if len(sys.argv) == 3 else "LabComm2013" + encoder = labcomm.Encoder(labcomm.StreamWriter(open(sys.argv[1], 'w')), version) + encoder.add_decl(test.twoLines.signature) + l1 = test.line() + c1s = test.point() + c1sx = test.coord() + c1sx.val = 1 + c1sy = test.coord() + c1sy.val = 11 + c1s.x = c1sx; + c1s.y = c1sy; + c1e = test.point() + c1ex = test.coord() + c1ex.val = 2 + c1ey = test.coord() + c1ey.val = 22 + c1e.x = c1ex; + c1e.y = c1ey; + l1.start=c1s + l1.end = c1e + l2 = test.line() + c2s = test.point() + c2sx = test.coord() + c2sx.val = 3 + c2sy = test.coord() + c2sy.val = 33 + c2s.x = c2sx; + c2s.y = c2sy; + c2e = test.point() + c2ex = test.coord() + c2ex.val = 4 + c2ey = test.coord() + c2ey.val = 44 + c2e.x = c2ex; + c2e.y = c2ey; + l2.start=c2s + l2.end = c2e + tl = test.twoLines() + tl.l1 = l1 + tl.l2 = l2 + tl.f = test.foo() + tl.f.a = 10; + tl.f.b = 20; + tl.f.c = False; + encoder.encode(tl, test.twoLines.signature) diff --git a/examples/user_types/run.sh b/examples/user_types/run.sh new file mode 100644 index 0000000..09bdcd7 --- /dev/null +++ b/examples/user_types/run.sh @@ -0,0 +1,39 @@ +export LD_LIBRARY_PATH=../../lib/c/ +echo +echo "********************************************" +echo "*** Running example for version 2013 ***" +echo "********************************************" +echo + +java -cp .:../../lib/java:gen Encoder encoded_data + +echo "running Java decoder:" +java -cp .:../../lib/java:gen Decoder encoded_data + +echo "running C decoder:" +./example_decoder encoded_data + +echo "running python decoder (from wiki_example):" +PYTHONPATH=../../lib/python ../wiki_example/example_decoder.py encoded_data LabComm2013 + +echo "running C encoder:" +./example_encoder encoded_data + +echo "running Java decoder:" +java -cp .:../../lib/java:gen Decoder encoded_data + +echo "running C decoder:" +./example_decoder encoded_data + +echo "running python decoder (from wiki_example):" +PYTHONPATH=../../lib/python ../wiki_example/example_decoder.py encoded_data LabComm2013 + +echo "running python encoder:" +PYTHONPATH=../../lib/python:gen ./example_encoder.py encoded_data2 + +echo "running Java decoder:" +java -cp .:../../lib/java:gen Decoder encoded_data2 + +echo "running C decoder:" +./example_decoder encoded_data2 + diff --git a/examples/user_types/test.lc b/examples/user_types/test.lc new file mode 100644 index 0000000..d222539 --- /dev/null +++ b/examples/user_types/test.lc @@ -0,0 +1,25 @@ +typedef struct { + int val; +} coord; + +typedef struct { + coord x; + coord y; +} point; + +typedef struct { + point start; + point end; +} line; + +typedef struct { + int a; + int b; + boolean c; +} foo; + +sample struct { + line l1; + line l2; + foo f; +} twoLines; -- GitLab