Handle source files as byte streams for lua2java conversions.

This commit is contained in:
James Roseborough
2010-07-23 04:54:14 +00:00
parent 6f01f9784a
commit 346e0ef465
3 changed files with 62 additions and 53 deletions

View File

@@ -47,6 +47,7 @@ public class lua2java {
" -s src source directory\n" + " -s src source directory\n" +
" -d dir destination directory\n" + " -d dir destination directory\n" +
" -p pkg package prefix to apply to all classes\n" + " -p pkg package prefix to apply to all classes\n" +
" -e enc override default character encoding\n" +
" -r recursively compile all\n" + " -r recursively compile all\n" +
" -v verbose\n"; " -v verbose\n";
@@ -58,6 +59,7 @@ public class lua2java {
private String srcdir = null; private String srcdir = null;
private String destdir = null; private String destdir = null;
private String pkgprefix = null; private String pkgprefix = null;
private String encoding = "ISO8859-1";
private boolean recurse = false; private boolean recurse = false;
private boolean verbose = false; private boolean verbose = false;
private List<InputFile> files = new ArrayList<InputFile>(); private List<InputFile> files = new ArrayList<InputFile>();
@@ -93,6 +95,11 @@ public class lua2java {
usageExit(); usageExit();
pkgprefix = args[i]; pkgprefix = args[i];
break; break;
case 'e':
if ( ++i >= args.length )
usageExit();
encoding = args[i];
break;
case 'r': case 'r':
recurse = true; recurse = true;
break; break;
@@ -112,6 +119,7 @@ public class lua2java {
System.out.println("srcdir: "+srcdir); System.out.println("srcdir: "+srcdir);
System.out.println("destdir: "+destdir); System.out.println("destdir: "+destdir);
System.out.println("files: "+files); System.out.println("files: "+files);
System.out.println("encoding: "+encoding);
System.out.println("recurse: "+recurse); System.out.println("recurse: "+recurse);
} }
@@ -186,7 +194,7 @@ public class lua2java {
FileInputStream in = new FileInputStream(inf.infile); FileInputStream in = new FileInputStream(inf.infile);
FileOutputStream out = new FileOutputStream(inf.outfile); FileOutputStream out = new FileOutputStream(inf.outfile);
PrintWriter pw = new PrintWriter(out); PrintWriter pw = new PrintWriter(out);
LuaParser parser = new LuaParser(in); LuaParser parser = new LuaParser(in,encoding);
Chunk chunk = parser.Chunk(); Chunk chunk = parser.Chunk();
new JavaCodeGen(chunk,pw,inf.javapackage,inf.javaclassname); new JavaCodeGen(chunk,pw,inf.javapackage,inf.javaclassname);
pw.close(); pw.close();

View File

@@ -22,35 +22,41 @@
package org.luaj.vm2.ast; package org.luaj.vm2.ast;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import org.luaj.vm2.LuaString; import org.luaj.vm2.LuaString;
public class Str { public class Str {
public final byte[] bytes; private Str() {}
public final boolean isutf8;
public Str(byte[] bytes) {
this.bytes = bytes;
this.isutf8 = true; // TODO: scan to see
}
public static LuaString quoteString(String image) { public static LuaString quoteString(String image) {
String s = image.substring(1, image.length()-1); String s = image.substring(1, image.length()-1);
byte[] bytes = unquote(s); byte[] bytes = unquote(s);
// TODO: check for non-utf8
return LuaString.valueOf(bytes); return LuaString.valueOf(bytes);
} }
public static LuaString charString(String image) { public static LuaString charString(String image) {
String s = image.substring(1, image.length()-1); String s = image.substring(1, image.length()-1);
byte[] bytes = unquote(s); byte[] bytes = unquote(s);
// TODO: check for non-utf8
return LuaString.valueOf(bytes); return LuaString.valueOf(bytes);
} }
public static LuaString longString(String image) { public static LuaString longString(String image) {
int i = image.indexOf('[', image.indexOf('[')+1); int i = image.indexOf('[', image.indexOf('[')+1);
String s = image.substring(i,image.length()-i); String s = image.substring(i,image.length()-i);
return LuaString.valueOf(s); byte[] b = iso88591bytes(s);
return LuaString.valueOf(b);
} }
public static byte[] iso88591bytes( String s ) {
try {
return s.getBytes("ISO8859-1");
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException("ISO8859-1 not supported");
}
}
public static byte[] unquote(String s) { public static byte[] unquote(String s) {
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
char[] c = s.toCharArray(); char[] c = s.toCharArray();
@@ -84,13 +90,4 @@ public class Str {
} }
return baos.toByteArray(); return baos.toByteArray();
} }
/*
private static byte[] utf8decode(String s) {
try {
return s.getBytes("UTF8");
} catch ( Exception e ) {
throw new RuntimeException("utf8 not found: "+e);
}
}
*/
} }

View File

@@ -30,6 +30,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.luaj.vm2.Lua; import org.luaj.vm2.Lua;
import org.luaj.vm2.LuaString;
import org.luaj.vm2.LuaValue; import org.luaj.vm2.LuaValue;
import org.luaj.vm2.ast.Block; import org.luaj.vm2.ast.Block;
import org.luaj.vm2.ast.Chunk; import org.luaj.vm2.ast.Chunk;
@@ -88,7 +89,7 @@ public class JavaCodeGen {
JavaScope javascope = null; JavaScope javascope = null;
List<String> constantDeclarations = new ArrayList<String>(); List<String> constantDeclarations = new ArrayList<String>();
Map<String,String> stringConstants = new HashMap<String,String>(); Map<LuaString,String> stringConstants = new HashMap<LuaString,String>();
Map<Double,String> numberConstants = new HashMap<Double,String>(); Map<Double,String> numberConstants = new HashMap<Double,String>();
@@ -359,8 +360,7 @@ public class JavaCodeGen {
public void visit(Constant exp) { public void visit(Constant exp) {
switch ( exp.value.type() ) { switch ( exp.value.type() ) {
case LuaValue.TSTRING: { case LuaValue.TSTRING: {
// TODO: non-UTF8 data out( evalLuaStringConstant(exp.value.checkstring()) );
out( evalStringConstant(exp.value.tojstring()) );
break; break;
} }
case LuaValue.TNIL: case LuaValue.TNIL:
@@ -379,11 +379,14 @@ public class JavaCodeGen {
} }
private String evalStringConstant(String str) { private String evalStringConstant(String str) {
// TODO: quoting, data pooling return evalLuaStringConstant( LuaValue.valueOf(str) );
}
private String evalLuaStringConstant(LuaString str) {
if ( stringConstants.containsKey(str) ) if ( stringConstants.containsKey(str) )
return stringConstants.get(str); return stringConstants.get(str);
String declvalue = quotedStringInitializer(str.getBytes()); String declvalue = quotedStringInitializer(str);
String javaname = javascope.createConstantName(str); String javaname = javascope.createConstantName(str.tojstring());
constantDeclarations.add( "static final LuaValue "+javaname+" = valueOf("+declvalue+");" ); constantDeclarations.add( "static final LuaValue "+javaname+" = valueOf("+declvalue+");" );
stringConstants.put(str,javaname); stringConstants.put(str,javaname);
return javaname; return javaname;
@@ -726,40 +729,41 @@ public class JavaCodeGen {
} }
} }
private static String quotedStringInitializer(byte[] bytes) { private static String quotedStringInitializer(LuaString s) {
int n = bytes.length; byte[] bytes = s.m_bytes;
int o = s.m_offset;
int n = s.m_length;
StringBuffer sb = new StringBuffer(n+2); StringBuffer sb = new StringBuffer(n+2);
// check for characters beyond ascii 128 // check for bytes not encodable as utf8
for ( int i=0; i<n; i++ ) if ( ! s.isValidUtf8() ) {
if (bytes[i]<0) { sb.append( "new byte[]{" );
sb.append( "new byte[]{" ); for ( int j=0; j<n; j++ ) {
for ( int j=0; j<n; j++ ) { if ( j>0 ) sb.append(",");
if ( j>0 ) sb.append(","); byte b = bytes[o+j];
byte b = bytes[j]; switch ( b ) {
switch ( b ) { case '\n': sb.append( "'\\n'" ); break;
case '\n': sb.append( "'\\n'" ); break; case '\r': sb.append( "'\\r'" ); break;
case '\r': sb.append( "'\\r'" ); break; case '\t': sb.append( "'\\t'" ); break;
case '\t': sb.append( "'\\t'" ); break; case '\\': sb.append( "'\\\\'" ); break;
case '\\': sb.append( "'\\\\'" ); break; default:
default: if ( b >= ' ' ) {
if ( b >= ' ' ) { sb.append( '\'');
sb.append( '\''); sb.append( (char) b );
sb.append( (char) b ); sb.append( '\'');
sb.append( '\''); } else {
} else { sb.append( String.valueOf((int)b) );
sb.append( String.valueOf((int)b) ); }
} break;
break; }
}
}
sb.append( "}" );
return sb.toString();
} }
sb.append( "}" );
return sb.toString();
}
sb.append('"'); sb.append('"');
for ( int i=0; i<n; i++ ) { for ( int i=0; i<n; i++ ) {
byte b = bytes[i]; byte b = bytes[o+i];
switch ( b ) { switch ( b ) {
case '\b': sb.append( "\\b" ); break; case '\b': sb.append( "\\b" ); break;
case '\f': sb.append( "\\f" ); break; case '\f': sb.append( "\\f" ); break;