Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Sven Gestegård Robertz
LabComm
Commits
81a9149b
Commit
81a9149b
authored
Feb 07, 2014
by
Sven Gestegård Robertz
Browse files
version 2013 still works, version 2006 untested
parent
45b8e760
Changes
7
Hide whitespace changes
Inline
Side-by-side
compiler/CS_CodeGen.jrag
View file @
81a9149b
...
...
@@ -8,12 +8,13 @@ aspect CS_CodeGenEnv {
public class CS_env {
public final int version;
private int indent;
private int depth;
private CS_printer printer;
private HashMap unique = new HashMap();
final private class CS_printer {
final private
static
class CS_printer {
private boolean newline = true;
private File file;
...
...
@@ -75,19 +76,18 @@ aspect CS_CodeGenEnv {
}
}
private CS_env(int indent, CS_printer printer) {
private CS_env(int indent, CS_printer printer, int version) {
this.version = version;
this.indent = indent;
this.printer = printer;
}
public CS_env(File f) {
this.indent = 0;
this.printer = new CS_printer(f);
public CS_env(File f, int version) {
this(0, new CS_printer(f), version);
}
public CS_env(PrintStream out) {
this.indent = 0;
this.printer = new CS_printer(out);
public CS_env(PrintStream out, int version) {
this(0, new CS_printer(out), version);
}
public void close() throws IOException {
...
...
@@ -196,9 +196,9 @@ aspect CS_Void {
aspect CS_CodeGen {
public void Program.CS_gen(String file,
String namespace) throws IOException {
String namespace
, int version
) throws IOException {
// Registration class
CS_env env = new CS_env(new File(file));
CS_env env = new CS_env(new File(file)
, version
);
if (namespace != null && namespace.length() > 0) {
env.println("namespace " + namespace + "{");
env.indent();
...
...
@@ -351,7 +351,7 @@ aspect CS_Class {
CS_emitDecoder(env);
env.println("private static byte[] signature = new byte[] {");
env.indent();
SignatureList signature = signature();
SignatureList signature = signature(
env.version
);
for (int i = 0 ; i < signature.size() ; i++) {
String comment = signature.getComment(i);
if (comment != null) {
...
...
@@ -752,8 +752,8 @@ aspect CS_Class {
aspect CS_Info {
public void Program.CS_info(PrintStream out, String namespace) {
CS_env env = new CS_env(out);
public void Program.CS_info(PrintStream out, String namespace
, int version
) {
CS_env env = new CS_env(out
, version
);
if (namespace == null) {
namespace = "";
} else {
...
...
compiler/C_CodeGen.jrag
View file @
81a9149b
...
...
@@ -8,7 +8,7 @@ aspect C_CodeGenEnv {
public class C_env {
final private class C_printer {
final private
static
class C_printer {
private boolean newline = true;
private PrintStream out;
...
...
@@ -33,6 +33,8 @@ aspect C_CodeGenEnv {
}
}
public final int version; //labcomm version (2006 or 2013)
public final String qualid;
public final String lcName;
public final String rawPrefix;
...
...
@@ -42,7 +44,8 @@ aspect C_CodeGenEnv {
private C_printer printer;
private C_env(String qualid, String lcName, String rawPrefix,
int indent, int depth, C_printer printer) {
int indent, int depth, C_printer printer, int version) {
this.version = version;
this.qualid = qualid;
this.lcName = lcName;
this.rawPrefix = rawPrefix;
...
...
@@ -57,28 +60,18 @@ aspect C_CodeGenEnv {
}
public C_env(String qualid, String lcName, String rawPrefix,
PrintStream out) {
this.qualid = qualid;
this.lcName = lcName;
this.rawPrefix = rawPrefix;
if (rawPrefix.equals("")) {
this.prefix = rawPrefix;
} else {
this.prefix = rawPrefix + "_";
}
this.depth = 0;
this.indent = 0;
this.printer = new C_printer(out);
PrintStream out, int version) {
this(qualid, lcName, rawPrefix, 0, 0, new C_printer(out), version);
}
public C_env nestArray(String suffix) {
return new C_env(qualid + suffix, lcName, rawPrefix,
indent, depth + 1, printer);
indent, depth + 1, printer
, version
);
}
public C_env nestStruct(String suffix) {
return new C_env(qualid + suffix, lcName, rawPrefix,
indent, depth, printer);
indent, depth, printer
, version
);
}
public void indent() {
...
...
@@ -147,8 +140,8 @@ aspect C_IsDynamic {
aspect C_CodeGen {
public void Program.C_genH(PrintStream out, Vector includes,
String lcName, String prefix) {
C_env env = new C_env("", lcName, prefix, out);
String lcName, String prefix
, int version
) {
C_env env = new C_env("", lcName, prefix, out
, version
);
// Hackish prettyprint preamble
out.println("/* LabComm declarations:");
...
...
@@ -174,8 +167,8 @@ aspect C_CodeGen {
}
public void Program.C_genC(PrintStream out, Vector includes,
String lcName, String prefix) {
C_env env = new C_env("", lcName, prefix, out);
String lcName, String prefix
, int version
) {
C_env env = new C_env("", lcName, prefix, out
, version
);
// Include
env.println("#include \"labcomm.h\"");
...
...
@@ -882,7 +875,7 @@ aspect C_Signature {
public void SampleDecl.C_emitSignature(C_env env) {
env.println("static unsigned char signature_bytes_" +
env.prefix + getName() + "[] = {");
SignatureList signature = signature();
SignatureList signature = signature(
env.version
);
for (int i = 0 ; i < signature.size() ; i++) {
String comment = signature.getComment(i);
if (comment != null) {
...
...
@@ -1146,8 +1139,8 @@ aspect C_forAll {
aspect C_Info {
public void Program.C_info(PrintStream out, String prefix) {
C_env env = new C_env("", "", prefix, out);
public void Program.C_info(PrintStream out, String prefix
, int version
) {
C_env env = new C_env("", "", prefix, out
, version
);
for (int i = 0; i < getNumDecl(); i++) {
getDecl(i).C_info(env);
}
...
...
compiler/Java_CodeGen.jrag
View file @
81a9149b
...
...
@@ -8,6 +8,7 @@ aspect Java_CodeGenEnv {
public class Java_env {
public final int version; //labcomm version to generate code for
private int indent;
private int depth;
private Java_printer printer;
...
...
@@ -75,18 +76,23 @@ aspect Java_CodeGenEnv {
}
}
private Java_env(int indent, Java_printer printer) {
private Java_env(int version, int indent) {
this.version = version;
this.indent = indent;
}
private Java_env(int version, Java_printer printer) {
this(version, 0);
this.printer = printer;
}
public Java_env(File f) {
this
.indent =
0;
public Java_env(
int version,
File f) {
this
(version,
0
)
;
this.printer = new Java_printer(f);
}
public Java_env(PrintStream out) {
this
.indent =
0;
public Java_env(
int version,
PrintStream out) {
this
(version,
0
)
;
this.printer = new Java_printer(out);
}
...
...
@@ -195,11 +201,11 @@ aspect Java_Void {
aspect Java_CodeGen {
public void Program.J_gen(PrintStream ps, String pack) throws IOException {
public void Program.J_gen(PrintStream ps, String pack
, int version
) throws IOException {
Java_env env;
/*
// Registration class
env = new Java_env(ps);
env = new Java_env(
version,
ps);
if (pack != null && pack.length() > 0) {
env.println("package " + pack + ";");
}
...
...
@@ -212,7 +218,7 @@ aspect Java_CodeGen {
env.println("}");
// env.close();
*/
env = new Java_env(ps);
env = new Java_env(
version,
ps);
for (int i = 0; i < getNumDecl(); i++) {
Decl d = getDecl(i);
try {
...
...
@@ -225,11 +231,11 @@ aspect Java_CodeGen {
env.close();
}
public void Program.J_gen(String dir, String pack) throws IOException {
public void Program.J_gen(String dir, String pack
, int version
) throws IOException {
Java_env env;
/*
// Registration class
env = new Java_env(new File(dir, "LabCommRegister.java"));
env = new Java_env(
version,
new File(dir, "LabCommRegister.java"));
if (pack != null && pack.length() > 0) {
env.println("package " + pack + ";");
}
...
...
@@ -245,7 +251,7 @@ aspect Java_CodeGen {
for (int i = 0; i < getNumDecl(); i++) {
Decl d = getDecl(i);
try {
env = new Java_env(new File(dir, d.getName() + ".java"));
env = new Java_env(
version,
new File(dir, d.getName() + ".java"));
d.Java_emitClass(env, pack);
env.close();
} catch (Error e) {
...
...
@@ -257,7 +263,7 @@ aspect Java_CodeGen {
/** Experimental method for generating code to a map <classname, source>
*/
public void Program.J_gen(Map<String,String> src, String pack) throws IOException {
public void Program.J_gen(Map<String,String> src, String pack
, int version
) throws IOException {
Java_env env;
/*
// Registration class was commented out, so got removed in this copy
...
...
@@ -267,7 +273,7 @@ aspect Java_CodeGen {
try {
ByteArrayOutputStream bs = new ByteArrayOutputStream();
PrintStream out = new PrintStream(bs);
env = new Java_env(out);
env = new Java_env(
version,
out);
d.Java_emitClass(env, pack);
env.close();
src.put(d.getName(), bs.toString());
...
...
@@ -449,7 +455,7 @@ aspect Java_Class {
Java_emitDecoder(env);
env.println("private static byte[] signature = new byte[] {");
env.indent();
SignatureList signature = signature();
SignatureList signature = signature(
env.version
);
for (int i = 0 ; i < signature.size() ; i++) {
String comment = signature.getComment(i);
if (comment != null) {
...
...
@@ -841,8 +847,8 @@ aspect Java_Class {
aspect Java_Info {
public void Program.Java_info(PrintStream out) {
Java_env env = new Java_env(out);
public void Program.Java_info(PrintStream out
, int version
) {
Java_env env = new Java_env(
version,
out);
for (int i = 0; i < getNumDecl(); i++) {
getDecl(i).Java_info(env);
}
...
...
compiler/LabComm.java
View file @
81a9149b
...
...
@@ -13,6 +13,7 @@ public class LabComm {
println
(
""
);
println
(
" --help Shows this help text"
);
println
(
" -v Be verbose"
);
println
(
" --ver=VERSION Generate code for labcomm VERSION (=2006 or 2013)"
);
println
(
"[ C options ]"
);
println
(
" -C Generates C/H code in FILE.[ch]"
);
println
(
" --cprefix=PREFIX Prefixes C types with PREFIX"
);
...
...
@@ -53,6 +54,16 @@ public class LabComm {
return
s
.
substring
(
s
.
lastIndexOf
(
'/'
)
+
1
,
s
.
length
());
}
/** To be cleaned up.
*/
private
static
void
checkVersion
(
int
v
)
{
if
(!
(
v
==
2006
||
v
==
2013
)
)
{
System
.
err
.
println
(
" Unknown version: "
+
v
);
System
.
err
.
println
(
" Supported versions: 2006, 2013 "
);
System
.
exit
(
2
);
}
}
public
static
void
main
(
String
[]
args
)
{
String
fileName
=
null
;
// Scan for first non-option
...
...
@@ -69,6 +80,7 @@ public class LabComm {
prefix
=
getPrefix
(
coreName
);
}
boolean
verbose
=
false
;
int
ver
=
2013
;
//Version 2013 as default
String
cFile
=
null
;
String
hFile
=
null
;
Vector
cIncludes
=
new
Vector
();
...
...
@@ -91,6 +103,9 @@ public class LabComm {
System
.
exit
(
0
);
}
else
if
(
args
[
i
].
equals
(
"-v"
))
{
verbose
=
true
;
}
else
if
(
args
[
i
].
startsWith
(
"--ver="
))
{
ver
=
Integer
.
parseInt
(
args
[
i
].
substring
(
6
));
checkVersion
(
ver
);
}
else
if
(
args
[
i
].
equals
(
"-C"
))
{
cFile
=
coreName
+
".c"
;
hFile
=
coreName
+
".h"
;
...
...
@@ -170,36 +185,36 @@ public class LabComm {
boolean
prettyOnStdout
=
true
;
if
(
cFile
!=
null
)
{
if
(
verbose
)
{
System
.
err
.
println
(
"Generating C: "
+
cFile
);
}
genC
(
ast
,
cFile
,
cIncludes
,
coreName
,
cPrefix
);
genC
(
ast
,
cFile
,
cIncludes
,
coreName
,
cPrefix
,
ver
);
prettyOnStdout
=
false
;
}
if
(
hFile
!=
null
)
{
if
(
verbose
)
{
System
.
err
.
println
(
"Generating H: "
+
hFile
);
}
genH
(
ast
,
hFile
,
hIncludes
,
coreName
,
cPrefix
);
genH
(
ast
,
hFile
,
hIncludes
,
coreName
,
cPrefix
,
ver
);
prettyOnStdout
=
false
;
}
if
(
csFile
!=
null
)
{
if
(
verbose
)
{
System
.
err
.
println
(
"Generating C#: "
+
csFile
);
}
genCS
(
ast
,
csFile
,
csNamespace
);
genCS
(
ast
,
csFile
,
csNamespace
,
ver
);
prettyOnStdout
=
false
;
}
if
(
javaDir
!=
null
)
{
if
(
verbose
)
{
System
.
err
.
println
(
"Generating Java: "
+
javaDir
);
}
genJava
(
ast
,
javaDir
,
javaPackage
);
genJava
(
ast
,
javaDir
,
javaPackage
,
ver
);
prettyOnStdout
=
false
;
}
if
(
pythonFile
!=
null
)
{
if
(
verbose
)
{
System
.
err
.
println
(
"Generating Python: "
+
pythonFile
);
}
genPython
(
ast
,
pythonFile
,
prefix
);
genPython
(
ast
,
pythonFile
,
prefix
,
ver
);
prettyOnStdout
=
false
;
}
if
(
rapidFile
!=
null
)
{
if
(
verbose
)
{
System
.
err
.
println
(
"Generating RAPID: "
+
rapidFile
);
}
genRAPID
(
ast
,
rapidFile
,
coreName
);
genRAPID
(
ast
,
rapidFile
,
coreName
,
ver
);
prettyOnStdout
=
false
;
}
if
(
prettyFile
!=
null
)
{
...
...
@@ -223,9 +238,9 @@ public class LabComm {
try
{
FileOutputStream
f
=
new
FileOutputStream
(
typeinfoFile
);
PrintStream
out
=
new
PrintStream
(
f
);
ast
.
C_info
(
out
,
cPrefix
);
ast
.
Java_info
(
out
);
ast
.
CS_info
(
out
,
csNamespace
);
ast
.
C_info
(
out
,
cPrefix
,
ver
);
ast
.
Java_info
(
out
,
ver
);
ast
.
CS_info
(
out
,
csNamespace
,
ver
);
prettyOnStdout
=
false
;
}
catch
(
IOException
e
)
{
System
.
err
.
println
(
"IOException: "
+
typeinfoFile
+
" "
+
e
);
...
...
@@ -239,14 +254,14 @@ public class LabComm {
}
private
static
void
genH
(
Program
p
,
String
hName
,
Vector
cIncludes
,
String
coreName
,
String
prefix
)
{
Vector
cIncludes
,
String
coreName
,
String
prefix
,
int
ver
)
{
try
{
FileOutputStream
f
;
PrintStream
out
;
f
=
new
FileOutputStream
(
hName
);
out
=
new
PrintStream
(
f
);
p
.
C_genH
(
out
,
cIncludes
,
coreName
,
prefix
);
p
.
C_genH
(
out
,
cIncludes
,
coreName
,
prefix
,
ver
);
out
.
close
();
}
catch
(
IOException
e
)
{
System
.
err
.
println
(
"IOException: "
+
hName
+
" "
+
e
);
...
...
@@ -254,59 +269,57 @@ public class LabComm {
}
private
static
void
genC
(
Program
p
,
String
cName
,
Vector
cIncludes
,
String
coreName
,
String
prefix
)
{
Vector
cIncludes
,
String
coreName
,
String
prefix
,
int
ver
)
{
try
{
FileOutputStream
f
;
PrintStream
out
;
f
=
new
FileOutputStream
(
cName
);
out
=
new
PrintStream
(
f
);
p
.
C_genC
(
out
,
cIncludes
,
coreName
,
prefix
);
p
.
C_genC
(
out
,
cIncludes
,
coreName
,
prefix
,
ver
);
out
.
close
();
}
catch
(
IOException
e
)
{
System
.
err
.
println
(
"IOException: "
+
cName
+
" "
+
e
);
}
}
private
static
void
genCS
(
Program
p
,
String
csName
,
String
csNamespace
)
{
private
static
void
genCS
(
Program
p
,
String
csName
,
String
csNamespace
,
int
ver
)
{
try
{
p
.
CS_gen
(
csName
,
csNamespace
);
p
.
CS_gen
(
csName
,
csNamespace
,
ver
);
}
catch
(
IOException
e
)
{
System
.
err
.
println
(
"IOException: "
+
csName
+
" "
+
csNamespace
+
" "
+
e
);
}
}
private
static
void
genJava
(
Program
p
,
String
dirName
,
String
packageName
)
{
private
static
void
genJava
(
Program
p
,
String
dirName
,
String
packageName
,
int
ver
)
{
try
{
p
.
J_gen
(
dirName
,
packageName
);
p
.
J_gen
(
dirName
,
packageName
,
ver
);
}
catch
(
IOException
e
)
{
System
.
err
.
println
(
"IOException: "
+
dirName
+
" "
+
packageName
+
" "
+
e
);
}
}
private
static
void
genPython
(
Program
p
,
String
filename
,
String
prefix
)
{
private
static
void
genPython
(
Program
p
,
String
filename
,
String
prefix
,
int
ver
)
{
try
{
FileOutputStream
f
;
PrintStream
out
;
f
=
new
FileOutputStream
(
filename
);
out
=
new
PrintStream
(
f
);
p
.
Python_gen
(
out
,
prefix
);
p
.
Python_gen
(
out
,
prefix
,
ver
);
out
.
close
();
}
catch
(
IOException
e
)
{
System
.
err
.
println
(
"IOException: "
+
filename
+
" "
+
e
);
}
}
private
static
void
genRAPID
(
Program
p
,
String
filename
,
String
prefix
)
{
private
static
void
genRAPID
(
Program
p
,
String
filename
,
String
prefix
,
int
ver
)
{
try
{
p
.
RAPID_gen
(
filename
,
prefix
);
p
.
RAPID_gen
(
filename
,
prefix
,
ver
);
}
catch
(
IOException
e
)
{
System
.
err
.
println
(
"IOException: "
+
filename
+
" "
+
e
);
}
}
}
compiler/Python_CodeGen.jrag
View file @
81a9149b
...
...
@@ -72,7 +72,10 @@ aspect Python_CodeGenEnv {
aspect Python_CodeGen {
public void Program.Python_gen(PrintStream out, String baseName) {
public void Program.Python_gen(PrintStream out, String baseName, int version) {
// Remove when Blomdell has verified that it is OK to ignore version
// when generating python code.
System.err.println("*** Warning! Python_gen ignores version: "+version);
Python_env env = new Python_env(out);
env.println("#!/usr/bin/python");
env.println("# Auto generated " + baseName);
...
...
@@ -217,4 +220,4 @@ aspect PythonTypes {
return "0";
}
}
\ No newline at end of file
}
compiler/RAPID_CodeGen.jrag
View file @
81a9149b
aspect RAPID_env {
public class RAPID_env {
public final int version;
private String prefix;
private StringBuilder types;
private StringBuilder constants;
private StringBuilder procedures;
private PrintStream ps;
public RAPID_env(PrintStream ps, String prefix)
public RAPID_env(PrintStream ps, String prefix
, int version
)
{
this.version = version;
this.types = new StringBuilder();
this.constants = new StringBuilder();
this.procedures = new StringBuilder();
...
...
@@ -75,11 +77,11 @@ aspect RAPID_CodeGen {
throw new UnsupportedOperationException();
}
public void Program.RAPID_gen(String file, String prefix)
public void Program.RAPID_gen(String file, String prefix
, int version
)
throws IOException
{
PrintStream ps = new PrintStream(new FileOutputStream(new File(file)));
RAPID_env env = new RAPID_env(ps, prefix);
RAPID_env env = new RAPID_env(ps, prefix
, version
);
RAPID_gen(env);
}
...
...
@@ -101,7 +103,7 @@ aspect RAPID_CodeGen {
// Add signature constants
String sig_len_name = "signature_len_" + getName();
String sig_name = "signature_" + getName();
SignatureList sig = signature();
SignatureList sig = signature(
env.version
);
StringBuilder sb = new StringBuilder();
sb.append("[");
byte[] d = null;
...
...
compiler/Signature.jrag
View file @
81a9149b
...
...
@@ -31,25 +31,42 @@ aspect Signature {
public class SignatureList {
private int indent;
private final int ver;
private ArrayList list = new ArrayList();
public SignatureList(int version) {
this.ver = version;
}
public void add(byte[] data, String comment) {
list.add(new SignatureLine(indent, data, comment));
}
public void addInt(int value, String comment) {
byte[] tmp = new byte[5];
long v = value & 0xffffffff;
int i, j;
for (i = 0 ; i == 0 || v != 0 ; i++, v = (v >> 7)) {
tmp[i] = (byte)(v & 0x7f);
}
byte[] packed = new byte[i];
for (i = i - 1, j = 0 ; i >= 0 ; i--, j++) {
packed[j] = (byte)(tmp[i] | (i!=0?0x80:0x00));
}
add(packed, comment);
switch(ver) {
case 2006: // Use old encoding with 32 bit integers
byte[] data = new byte[4];
for (int i = 0 ; i < 4 ; i++) {
data[3 - i] = (byte)((value >> (8 * i)) & 0xff);
}
add(data, comment);
break;
case 2013: // Use new encoding with varints
byte[] tmp = new byte[5];
long v = value & 0xffffffff;
int i, j;
for (i = 0 ; i == 0 || v != 0 ; i++, v = (v >> 7)) {
tmp[i] = (byte)(v & 0x7f);
}
byte[] packed = new byte[i];
for (i = i - 1, j = 0 ; i >= 0 ; i--, j++) {
packed[j] = (byte)(tmp[i] | (i!=0?0x80:0x00));
}
add(packed, comment);
break;
default:
throw new RuntimeException("Version = "+ver+". This should never happen.");
}
}
public void addString(String value, String comment) {
...
...
@@ -92,8 +109,8 @@ aspect Signature {
}
public SignatureList Decl.signature() {
SignatureList result = new SignatureList();
public SignatureList Decl.signature(
int version
) {
SignatureList result = new SignatureList(
version
);
flatSignature(result);
return result;
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment