// Generate glue code
import java.io.*;
import java.util.*;
class typeinfo
{
String scm_name;
String java_name;
String java_inp_type[];
typeinfo(String sname, String jname, String jit[])
{
scm_name = sname;
java_name = jname;
java_inp_type = jit;
}
void write(PrintStream out)
{
int mode;
out.println("//Autogenerated by typeinfo on " + new Date());
out.println("class scm" + java_name + " extends Procedure implements Obj");
out.println("{");
out.println(" Obj apply(Cell args, Env f)\n throws Exception\n {");
out.println(" Cell t = args;");
out.println(" Obj tmp;");
for (int i=0; i<java_inp_type.length; i++)
{
out.println(" if (t == null) { throw new SchemeError(\""
+ scm_name + " expects "
+ java_inp_type.length +
" arguments\"); }");
out.println(" tmp = (t.car!=null)?t.car.eval(f):null; t = t.cdr;");
if (java_inp_type[i].equals("String")) { mode = 0; }
else if ((java_inp_type[i].equals("short")) ||
(java_inp_type[i].equals("int")) ||
(java_inp_type[i].equals("long"))) { mode = 1; }
else if ((java_inp_type[i].equals("float")) ||
(java_inp_type[i].equals("double"))) { mode = 3; }
else { mode = 2; }
switch(mode)
{
case 0: // String
out.println
(" if ((tmp != null) && !(tmp instanceof Selfrep))" +
" { throw new SchemeError(\"" +
scm_name + " expects a String for arg #" + (i+1) +
"\"); }");
out.println
(" String arg" + i + " = (tmp!=null)?((Selfrep)tmp).val:null;");
break;
case 1: // number
case 3:
out.println
(" if (!(tmp instanceof Selfrep))" +
" { throw new SchemeError(\"" +
scm_name + " expects a number for arg #" + (i+1) +
"\"); }");
if (mode == 1)
{
out.println
(" "+java_inp_type[i]+" arg" + i +
" = (" + java_inp_type[i] + ")(Math.round(((Selfrep)tmp).num));");
}
else
{
out.println
(" "+java_inp_type[i]+" arg" + i +
" = (" + java_inp_type[i] + ")(((Selfrep)tmp).num);");
}
break;
default: // primnode
out.println
(" if ((tmp != null) && !(tmp instanceof primnode))" +
" { throw new SchemeError(\"" +
scm_name + " expects a " + java_inp_type[i] +
" for arg #" + (i+1) + "\"); }");
out.println
(" if ((tmp != null) && !((((primnode)tmp).val) instanceof " +
java_inp_type[i] + ")) { throw new SchemeError(\"" +
scm_name + " expects a " + java_inp_type[i] +
" for arg #" + (i+1) + "\"); }");
out.println
(" "+java_inp_type[i]+" arg" + i +
" = (tmp != null)?(" + java_inp_type[i] + ")(((primnode)tmp).val):null;");
break;
}
}
// Now create the new object
out.print(" return new primnode(new " +
java_name + "(");
if (java_inp_type.length != 0) out.print("arg0");
for (int i=1; i<java_inp_type.length; i++)
{ out.print(", arg" + i); }
out.println("));\n }");
out.println(" public String toString()");
out.println(" { return (\"<#" + scm_name + "#>\"); }");
out.println("}");
}
}
class procinfo
// Create simple procedures
// automatically
{
String java_name;
String scm_name;
String java_inp_type[];
procinfo(String sname, String jname, String jit[])
{
java_name = jname;
scm_name = sname;
java_inp_type = jit;
}
void write(PrintStream out)
{
int mode;
out.println("//Autogenerated by procinfo on " + new Date());
out.println
("class scm" + java_name + " extends Procedure implements Obj\n{");
out.println
(" Obj apply(Cell args, Env f)\n throws Exception\n {\n");
out.println
(" Cell t = args;");
out.println
(" Obj tmp;");
for (int i=0; i<java_inp_type.length; i++)
{
out.println
(" if (t == null) { throw new SchemeError(\""
+ scm_name + " expects "
+ java_inp_type.length +
" arguments\"); }");
out.println
(" tmp = (t.car!=null)?t.car.eval(f):null; t = t.cdr;");
if (java_inp_type[i].equals("String")) { mode = 0; }
else if ((java_inp_type[i].equals("short")) ||
(java_inp_type[i].equals("int")) ||
(java_inp_type[i].equals("float")) ||
(java_inp_type[i].equals("double")) ||
(java_inp_type[i].equals("long"))) { mode = 1; }
else { mode = 2; }
switch(mode)
{
case 0: // String
out.println
(" if ((tmp != null) && !(tmp instanceof Selfrep))" +
" { throw new SchemeError(\"" +
scm_name + " expects a String for arg #" + (i+1) +
"\"); }");
out.println
(" String arg" + i + " = (tmp!=null)?((Selfrep)tmp).val:null;");
break;
case 1: // number
out.println
(" if (!(tmp instanceof Selfrep))" +
" { throw new SchemeError(\"" +
scm_name + " expects a number for arg #" + (i+1) +
"\"); }");
out.println
(" "+java_inp_type[i]+" arg" + i +
" = (" + java_inp_type[i] + ")(((Selfrep)tmp).num);");
break;
default: // primnode
out.println
(" if ((tmp != null) && !(tmp instanceof primnode))" +
" { throw new SchemeError(\"" +
scm_name + " expects a " + java_inp_type[i] +
" for arg #" + (i+1) + "\"); }");
out.println
(" if ((tmp != null) && !((((primnode)tmp).val) instanceof " +
java_inp_type[i] + ")) { throw new SchemeError(\"" +
scm_name + " expects a " + java_inp_type[i] +
" for arg #" + (i+1) + "\"); }");
out.println
(" "+java_inp_type[i]+" arg" + i +
" = (tmp != null)?(" + java_inp_type[i] + ")(((primnode)tmp).val):null;");
break;
}
}
// now call the method
out.print(" arg0." + java_name + "(arg1");
for (int i=2; i<java_inp_type.length; i++)
{ out.print(", arg" + i); }
out.println(");\n return null;\n }");
out.println(" public String toString()");
out.println(" { return (\"<#" + scm_name + "#>\"); }");
out.println("}");
}
}
class autogen implements jas.RuntimeConstants
{
static String procs[][] =
{
// Manipulate class env
{"ClassEnv", "CP"}, {"jas-class-addcpe", "addCPItem"},
{"ClassEnv", "Var"}, {"jas-class-addfield", "addField"},
{"ClassEnv", "CP"}, {"jas-class-addinterface", "addInterface"},
{"ClassEnv", "CP"}, {"jas-class-setclass", "setClass"},
{"ClassEnv", "CP"}, {"jas-class-setsuperclass", "setSuperClass"},
{"ClassEnv", "short", "String", "String", "CodeAttr", "ExceptAttr"},
{"jas-class-addmethod", "addMethod"},
{"ClassEnv", "short"}, {"jas-class-setaccess", "setClassAccess"},
{"ClassEnv", "String"}, {"jas-class-setsource", "setSource"},
{"ClassEnv", "scmOutputStream"}, {"jas-class-write", "write"},
// Add things to exceptions
{"ExceptAttr", "CP"}, {"jas-exception-add", "addException"},
// Manipulate code attrs
{"CodeAttr", "Insn"}, {"jas-code-addinsn", "addInsn"},
{"CodeAttr", "short"}, {"jas-code-stack-size", "setStackSize"},
{"CodeAttr", "short"}, {"jas-code-var-size", "setVarSize"},
{"CodeAttr", "Catchtable"}, {"jas-set-catchtable", "setCatchtable"},
// add things to catchtables
{"Catchtable", "CatchEntry"}, {"jas-add-catch-entry", "addEntry"},
};
static String types[][] =
{
{"String"}, {"make-ascii-cpe", "AsciiCP"},
{"String"}, {"make-class-cpe", "ClassCP"},
{"String", "String"}, {"make-name-type-cpe", "NameTypeCP"},
{"String", "String", "String"}, {"make-field-cpe", "FieldCP"},
{"String", "String", "String"}, {"make-interface-cpe", "InterfaceCP"},
{"String", "String", "String"}, {"make-method-cpe", "MethodCP"},
{"int"}, {"make-integer-cpe", "IntegerCP"},
{"float"}, {"make-float-cpe", "FloatCP"},
{"long"}, {"make-long-cpe", "LongCP"},
{"double"}, {"make-double-cpe", "DoubleCP"},
{"String"}, {"make-string-cpe", "StringCP"},
{"short", "CP", "CP", "ConstAttr"}, {"make-field", "Var"},
{"CP"}, {"make-const", "ConstAttr"},
{"String"}, {"make-outputstream", "scmOutputStream"},
{"String"}, {"make-label", "Label"},
{}, {"make-class-env", "ClassEnv"},
{}, {"make-code", "CodeAttr"},
{}, {"make-exception", "ExceptAttr"},
{}, {"make-catchtable", "Catchtable"},
{"Label", "Label", "Label", "CP"}, {"make-catch-entry", "CatchEntry"},
{"int", "int"}, {"iinc", "IincInsn"},
{"CP", "int"}, {"multianewarray", "MultiarrayInsn"},
{"CP", "int"}, {"invokeinterface", "InvokeinterfaceInsn"},
};
public static void main(String argv[])
throws IOException
{
PrintStream initer =
new PrintStream(new FileOutputStream("AutoInit.java"));
initer.println("package scm;\n\nimport jas.*;");
initer.println("class AutoInit\n{\n static void fillit(Env e)\n {");
// Generate types in the system.
PrintStream doit = new PrintStream(new FileOutputStream("AutoTypes.java"));
doit.println("package scm;\n\nimport jas.*;");
for (int x = 0; x<types.length; x += 2)
{
typeinfo tp = new typeinfo(types[x+1][0], types[x+1][1], types[x]);
tp.write(doit);
initer.println("e.definevar(Symbol.intern(\"" +
types[x+1][0] + "\"), new scm" +
types[x+1][1] + "());");
}
// Add some simple procedures
doit = new PrintStream(new FileOutputStream("AutoProcs.java"));
doit.println("package scm;\n\nimport jas.*;");
for (int x = 0; x<procs.length; x += 2)
{
procinfo p = new procinfo(procs[x+1][0], procs[x+1][1], procs[x]);
initer.println("e.definevar(Symbol.intern(\"" +
procs[x+1][0] + "\"), new scm" +
procs[x+1][1] + "());");
p.write(doit);
}
initer.println(" }\n}");
}
}