Mercurial Hosting > luan
diff src/luan/modules/BasicLuan.java @ 775:1a68fc55a80c
simplify dir structure
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Fri, 26 Aug 2016 14:36:40 -0600 |
parents | core/src/luan/modules/BasicLuan.java@b21d82ee5756 |
children | 60661a8e738c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/luan/modules/BasicLuan.java Fri Aug 26 14:36:40 2016 -0600 @@ -0,0 +1,244 @@ +package luan.modules; + +import java.io.InputStreamReader; +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.Iterator; +import java.util.Map; +import java.util.List; +import java.util.ArrayList; +import luan.Luan; +import luan.LuanState; +import luan.LuanTable; +import luan.LuanFunction; +import luan.LuanException; +import luan.LuanMethod; +import luan.LuanMeta; + + +public final class BasicLuan { + + public static String type(Object obj) { + return Luan.type(obj); + } + + public static LuanFunction load(String text,String sourceName,LuanTable env) + throws LuanException + { + Utils.checkNotNull(text); + Utils.checkNotNull(sourceName,1); + return Luan.load(text,sourceName,env); + } + + public static LuanFunction load_file(LuanState luan,String fileName) throws LuanException { + if( fileName == null ) { + fileName = "stdin:"; + } else if( fileName.indexOf(':') == -1 ) { + fileName = "file:" + fileName; + } + String src = PackageLuan.read(luan,fileName); + if( src == null ) + throw new LuanException("file '"+fileName+"' not found" ); + return load(src,fileName,null); + } + + public static LuanFunction pairs(final LuanState luan,final LuanTable t) throws LuanException { + Utils.checkNotNull(t); + return t.pairs(luan); + } + + public static LuanFunction ipairs(final LuanTable t) throws LuanException { + Utils.checkNotNull(t); + return new LuanFunction() { + List<Object> list = t.asList(); + int i = 0; + final int size = list.size(); + + @Override public Object[] call(LuanState luan,Object[] args) { + if( i >= size ) + return LuanFunction.NOTHING; + Object val = list.get(i++); + return new Object[]{i,val}; + } + }; + } + + public static Object get_metatable(LuanTable table) throws LuanException { + Utils.checkNotNull(table); + LuanTable metatable = table.getMetatable(); + if( metatable == null ) + return null; + Object obj = metatable.rawGet("__metatable"); + return obj!=null ? obj : metatable; + } + + public static void set_metatable(LuanTable table,LuanTable metatable) throws LuanException { + Utils.checkNotNull(table); + if( table.getHandler("__metatable") != null ) + throw new LuanException("cannot change a protected metatable"); + table.setMetatable(metatable); + } + + public static boolean raw_equal(Object v1,Object v2) { + return v1 == v2 || v1 != null && v1.equals(v2); + } + + public static Object raw_get(LuanTable table,Object index) { + return table.rawGet(index); + } + + public static void raw_set(LuanTable table,Object index,Object value) { + table.rawPut(index,value); + } + + public static int raw_len(Object v) throws LuanException { + if( v instanceof String ) { + String s = (String)v; + return s.length(); + } + if( v instanceof LuanTable ) { + LuanTable t = (LuanTable)v; + return t.rawLength(); + } + throw new LuanException( "bad argument #1 to 'raw_len' (table or string expected)" ); + } + + public static String to_string(LuanState luan,Object v) throws LuanException { + return luan.toString(v); + } + + public static LuanTable new_error(LuanState luan,Object msg) throws LuanException { + String s = luan.toString(msg); + LuanTable tbl = new LuanException(s).table(); + tbl.rawPut( "message", msg ); + return tbl; + } + + public static String assert_string(String v) throws LuanException { + Utils.checkNotNull(v); + return v; + } + + public static Number assert_number(Number v) throws LuanException { + Utils.checkNotNull(v); + return v; + } + + public static LuanTable assert_table(LuanTable v) throws LuanException { + Utils.checkNotNull(v); + return v; + } + + public static boolean assert_boolean(boolean v) throws LuanException { + return v; + } + + public static int assert_integer(int v) throws LuanException { + return v; + } + + public static long assert_long(long v) throws LuanException { + return v; + } + + public static double assert_double(double v) throws LuanException { + return v; + } + + @LuanMethod public static byte[] assert_binary(byte[] v) throws LuanException { + Utils.checkNotNull(v); + return v; + } + + public static LuanFunction assert_function(LuanFunction v) throws LuanException { + Utils.checkNotNull(v); + return v; + } + + public static LuanFunction range(final double from,final double to,Double stepV) throws LuanException { + final double step = stepV==null ? 1.0 : stepV; + if( step == 0.0 ) + throw new LuanException("bad argument #3 (step may not be zero)"); + return new LuanFunction() { + double v = from; + + @Override public Object call(LuanState luan,Object[] args) { + if( step > 0.0 && v > to || step < 0.0 && v < to ) + return LuanFunction.NOTHING; + double rtn = v; + v += step; + return rtn; + } + }; + } + + public static LuanFunction values(final Object... args) throws LuanException { + return new LuanFunction() { + int i = 0; + + @Override public Object call(LuanState luan,Object[] unused) { + if( i >= args.length ) + return LuanFunction.NOTHING; + return args[i++]; + } + }; + } + + private LuanFunction fn(Object obj) { + return obj instanceof LuanFunction ? (LuanFunction)obj : null; + } + + public static Object try_(LuanState luan,LuanTable blocks,Object... args) throws LuanException { + Utils.checkNotNull(blocks); + Object obj = blocks.get(luan,1); + if( obj == null ) + throw new LuanException("missing 'try' value"); + if( !(obj instanceof LuanFunction) ) + throw new LuanException("bad 'try' value (function expected, got "+Luan.type(obj)+")"); + LuanFunction tryFn = (LuanFunction)obj; + LuanFunction catchFn = null; + obj = blocks.get(luan,"catch"); + if( obj != null ) { + if( !(obj instanceof LuanFunction) ) + throw new LuanException("bad 'catch' value (function expected, got "+Luan.type(obj)+")"); + catchFn = (LuanFunction)obj; + } + LuanFunction finallyFn = null; + obj = blocks.get(luan,"finally"); + if( obj != null ) { + if( !(obj instanceof LuanFunction) ) + throw new LuanException("bad 'finally' value (function expected, got "+Luan.type(obj)+")"); + finallyFn = (LuanFunction)obj; + } + try { + return tryFn.call(luan,args); + } catch(LuanException e) { + if( catchFn == null ) + throw e; + return catchFn.call(luan,new Object[]{e.table()}); + } finally { + if( finallyFn != null ) + finallyFn.call(luan); + } + } + + @LuanMethod public static Object[] pcall(LuanState luan,LuanFunction f,Object... args) { + try { + Object[] r = Luan.array(f.call(luan,args)); + Object[] rtn = new Object[r.length+1]; + rtn[0] = true; + for( int i=0; i<r.length; i++ ) { + rtn[i+1] = r[i]; + } + return rtn; + } catch(LuanException e) { + return new Object[]{false,e.table()}; + } + } + + public static String number_type(Number v) throws LuanException { + Utils.checkNotNull(v); + return v.getClass().getSimpleName().toLowerCase(); + } + +}