changeset 29:9bc66d09ea48

CmdLine improvements git-svn-id: https://luan-java.googlecode.com/svn/trunk@30 21e917c8-12df-6dd8-5cb6-c86387c605b9
author fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9>
date Fri, 07 Dec 2012 09:33:31 +0000
parents df923e5835b2
children 8d8f4f5caef4
files src/luan/CmdLine.java src/luan/lib/BasicLib.java
diffstat 2 files changed, 82 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/src/luan/CmdLine.java	Fri Dec 07 05:49:17 2012 +0000
+++ b/src/luan/CmdLine.java	Fri Dec 07 09:33:31 2012 +0000
@@ -1,31 +1,61 @@
 package luan;
 
+import java.io.InputStreamReader;
 import java.util.Arrays;
 import java.util.Scanner;
 import luan.lib.BasicLib;
 
 
 public class CmdLine {
+	static final String version = "Luan 0.0";
 
 	public static void main(String[] args) throws Exception {
 		LuaState lua = new LuaState();
 		BasicLib.register(lua);
 		boolean interactive = false;
+		boolean showVersion = false;
 		int i = 0;
-		while( i < args.length ) {
-			String arg = args[i];
-			if( !arg.startsWith("-") )
-				break;
-			if( arg.equals("-i") ) {
-				interactive = true;
-			} else {
-				throw new RuntimeException("invalid option: "+arg);
+		if( args.length == 0 ) {
+			interactive = true;
+			showVersion = true;
+		} else {
+			while( i < args.length ) {
+				String arg = args[i++];
+				if( !arg.startsWith("-") || arg.equals("--") )
+					break;
+				if( arg.equals("-i") ) {
+					interactive = true;
+				} else if( arg.equals("-v") ) {
+					showVersion = true;
+				} else if( arg.equals("-e") ) {
+					if( i == args.length )
+						error("'-e' needs argument");
+					String cmd = args[i++];
+					try {
+						LuaFunction fn = BasicLib.load(lua,cmd);
+						fn.call(lua);
+					} catch(LuaException e) {
+						System.err.println("command line error: "+e.getMessage());
+						System.exit(-1);
+					}
+				} else if( arg.equals("-") ) {
+					String cmd = BasicLib.readAll(new InputStreamReader(System.in));
+					try {
+						LuaFunction fn = BasicLib.load(lua,cmd);
+						fn.call(lua);
+					} catch(LuaException e) {
+						System.err.println(e.getMessage());
+						System.exit(-1);
+					}
+					System.exit(0);
+				} else {
+					error("unrecognized option '"+arg+"'");
+				}
 			}
-			i++;
 		}
-		if( i == args.length ) {
-			interactive = true;
-		} else {
+		if( showVersion )
+			System.out.println(version);
+		if( i < args.length ) {
 			String file = args[i++];
 			Object[] varArgs = new Object[args.length-1];
 			System.arraycopy(args,1,varArgs,0,varArgs.length);
@@ -35,18 +65,32 @@
 			}
 			lua.env().set("arg",argsTable);
 			try {
-				LuaFunction fn = BasicLib.loadFile(lua,file);
+				LuaFunction fn = BasicLib.loadfile(lua,file);
 				fn.call(lua,varArgs);
 			} catch(LuaException e) {
-//				System.out.println(e.getMessage());
+//				System.err.println(e.getMessage());
 				e.printStackTrace();
-				return;
+				System.exit(-1);
 			}
 		}
 		if( interactive )
 			interactive(lua);
 	}
 
+	private static void error(String msg) {
+		System.err.println(msg);
+		System.err.println("usage: java luan.CmdLine [options] [script [args]]");
+		System.err.println("Available options are:");
+		System.err.println("  -e stat  execute string 'stat'");
+		System.err.println("  -i       enter interactive mode after executing 'script'");
+//		System.err.println("  -l name  require library 'name'");
+		System.err.println("  -v       show version information");
+//		System.err.println("  -E       ignore environment variables");
+		System.err.println("  --       stop handling options");
+		System.err.println("  -        stop handling options and execute stdin");
+		System.exit(-1);
+	}
+
 	static void interactive(LuaState lua) {
 		while( true ) {
 			System.out.print("> ");
--- a/src/luan/lib/BasicLib.java	Fri Dec 07 05:49:17 2012 +0000
+++ b/src/luan/lib/BasicLib.java	Fri Dec 07 09:33:31 2012 +0000
@@ -1,5 +1,7 @@
 package luan.lib;
 
+import java.io.File;
+import java.io.Reader;
 import java.io.FileReader;
 import java.io.IOException;
 import java.lang.reflect.Method;
@@ -29,7 +31,7 @@
 		add( t, "print", new Object[0].getClass() );
 		add( t, "type", Object.class );
 		add( t, "load", LuaState.class, String.class );
-		add( t, "loadFile", LuaState.class, String.class );
+		add( t, "loadfile", LuaState.class, String.class );
 		add( t, "pairs", LuaTable.class );
 		add( t, "ipairs", LuaTable.class );
 	}
@@ -74,19 +76,30 @@
 		return chunk.newClosure(lua);
 	}
 
-	public static String readFile(String fileName) throws IOException {
-		StringBuilder sb = new StringBuilder();
-		FileReader in = new FileReader(fileName);
-		char[] buf = new char[8192];
+	public static String readAll(Reader in)
+		throws IOException
+	{
+		char[] a = new char[8192];
+		StringBuilder buf = new StringBuilder();
 		int n;
-		while( (n=in.read(buf)) != -1 ) {
-			sb.append(buf,0,n);
+		while( (n=in.read(a)) != -1 ) {
+			buf.append(a,0,n);
 		}
-		return sb.toString();
+		return buf.toString();
 	}
 
-	public static LuaFunction loadFile(LuaState lua,String fileName) throws LuaException,IOException {
-		return load(lua,readFile(fileName));
+	public static String read(File file)
+		throws IOException
+	{
+		Reader in = new FileReader(file);
+		String s = readAll(in);
+		in.close();
+		return s;
+	}
+
+
+	public static LuaFunction loadfile(LuaState lua,String fileName) throws LuaException,IOException {
+		return load(lua,read(new File(fileName)));
 	}
 
 	private static class TableIter {