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

View File

@@ -22,35 +22,41 @@
package org.luaj.vm2.ast;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import org.luaj.vm2.LuaString;
public class Str {
public final byte[] bytes;
public final boolean isutf8;
private Str() {}
public Str(byte[] bytes) {
this.bytes = bytes;
this.isutf8 = true; // TODO: scan to see
}
public static LuaString quoteString(String image) {
String s = image.substring(1, image.length()-1);
byte[] bytes = unquote(s);
// TODO: check for non-utf8
return LuaString.valueOf(bytes);
}
public static LuaString charString(String image) {
String s = image.substring(1, image.length()-1);
byte[] bytes = unquote(s);
// TODO: check for non-utf8
return LuaString.valueOf(bytes);
}
public static LuaString longString(String image) {
int i = image.indexOf('[', image.indexOf('[')+1);
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) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
char[] c = s.toCharArray();
@@ -84,13 +90,4 @@ public class Str {
}
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 org.luaj.vm2.Lua;
import org.luaj.vm2.LuaString;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.ast.Block;
import org.luaj.vm2.ast.Chunk;
@@ -88,7 +89,7 @@ public class JavaCodeGen {
JavaScope javascope = null;
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>();
@@ -359,8 +360,7 @@ public class JavaCodeGen {
public void visit(Constant exp) {
switch ( exp.value.type() ) {
case LuaValue.TSTRING: {
// TODO: non-UTF8 data
out( evalStringConstant(exp.value.tojstring()) );
out( evalLuaStringConstant(exp.value.checkstring()) );
break;
}
case LuaValue.TNIL:
@@ -379,11 +379,14 @@ public class JavaCodeGen {
}
private String evalStringConstant(String str) {
// TODO: quoting, data pooling
return evalLuaStringConstant( LuaValue.valueOf(str) );
}
private String evalLuaStringConstant(LuaString str) {
if ( stringConstants.containsKey(str) )
return stringConstants.get(str);
String declvalue = quotedStringInitializer(str.getBytes());
String javaname = javascope.createConstantName(str);
String declvalue = quotedStringInitializer(str);
String javaname = javascope.createConstantName(str.tojstring());
constantDeclarations.add( "static final LuaValue "+javaname+" = valueOf("+declvalue+");" );
stringConstants.put(str,javaname);
return javaname;
@@ -726,40 +729,41 @@ public class JavaCodeGen {
}
}
private static String quotedStringInitializer(byte[] bytes) {
int n = bytes.length;
private static String quotedStringInitializer(LuaString s) {
byte[] bytes = s.m_bytes;
int o = s.m_offset;
int n = s.m_length;
StringBuffer sb = new StringBuffer(n+2);
// check for characters beyond ascii 128
for ( int i=0; i<n; i++ )
if (bytes[i]<0) {
sb.append( "new byte[]{" );
for ( int j=0; j<n; j++ ) {
if ( j>0 ) sb.append(",");
byte b = bytes[j];
switch ( b ) {
case '\n': sb.append( "'\\n'" ); break;
case '\r': sb.append( "'\\r'" ); break;
case '\t': sb.append( "'\\t'" ); break;
case '\\': sb.append( "'\\\\'" ); break;
default:
if ( b >= ' ' ) {
sb.append( '\'');
sb.append( (char) b );
sb.append( '\'');
} else {
sb.append( String.valueOf((int)b) );
}
break;
}
// check for bytes not encodable as utf8
if ( ! s.isValidUtf8() ) {
sb.append( "new byte[]{" );
for ( int j=0; j<n; j++ ) {
if ( j>0 ) sb.append(",");
byte b = bytes[o+j];
switch ( b ) {
case '\n': sb.append( "'\\n'" ); break;
case '\r': sb.append( "'\\r'" ); break;
case '\t': sb.append( "'\\t'" ); break;
case '\\': sb.append( "'\\\\'" ); break;
default:
if ( b >= ' ' ) {
sb.append( '\'');
sb.append( (char) b );
sb.append( '\'');
} else {
sb.append( String.valueOf((int)b) );
}
break;
}
sb.append( "}" );
return sb.toString();
}
sb.append( "}" );
return sb.toString();
}
sb.append('"');
for ( int i=0; i<n; i++ ) {
byte b = bytes[i];
byte b = bytes[o+i];
switch ( b ) {
case '\b': sb.append( "\\b" ); break;
case '\f': sb.append( "\\f" ); break;