Mercurial Hosting > luan
changeset 305:5e7450ac27f2
rename String.byte() to String.unicode();
improve Binary;
git-svn-id: https://luan-java.googlecode.com/svn/trunk@306 21e917c8-12df-6dd8-5cb6-c86387c605b9
author | fschmidt@gmail.com <fschmidt@gmail.com@21e917c8-12df-6dd8-5cb6-c86387c605b9> |
---|---|
date | Fri, 19 Dec 2014 07:50:46 +0000 |
parents | 03e9cda4748d |
children | 7f38793a99ee |
files | core/src/luan/LuanState.java core/src/luan/modules/Binary.luan core/src/luan/modules/BinaryLuan.java core/src/luan/modules/String.luan core/src/luan/modules/StringLuan.java core/src/luan/modules/Utils.java |
diffstat | 6 files changed, 66 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/core/src/luan/LuanState.java Thu Dec 18 12:06:56 2014 +0000 +++ b/core/src/luan/LuanState.java Fri Dec 19 07:50:46 2014 +0000 @@ -13,6 +13,7 @@ import luan.modules.PackageLuan; import luan.modules.JavaLuan; import luan.modules.StringLuan; +import luan.modules.BinaryLuan; public abstract class LuanState implements DeepCloneable<LuanState> { @@ -120,6 +121,11 @@ if( rtn != null ) return rtn; } + if( obj instanceof byte[] ) { + Object rtn = BinaryLuan.__index(luan,(byte[])obj,key); + if( rtn != null ) + return rtn; + } return JavaLuan.__index(luan,obj,key); }
--- a/core/src/luan/modules/Binary.luan Thu Dec 18 12:06:56 2014 +0000 +++ b/core/src/luan/modules/Binary.luan Fri Dec 19 07:50:46 2014 +0000 @@ -1,5 +1,5 @@ java() import "java:luan.modules.BinaryLuan" -pack = BinaryLuan.pack -unpack = BinaryLuan.unpack +byte = BinaryLuan.byte_ +binary = BinaryLuan.binary
--- a/core/src/luan/modules/BinaryLuan.java Thu Dec 18 12:06:56 2014 +0000 +++ b/core/src/luan/modules/BinaryLuan.java Fri Dec 19 07:50:46 2014 +0000 @@ -10,16 +10,56 @@ public final class BinaryLuan { - @LuanMethod public static byte[] pack(byte... bytes) { - return bytes; + public static Object __index(LuanState luan,final byte[] binary,Object key) throws LuanException { + LuanTable mod = (LuanTable)PackageLuan.loaded(luan).get("luan:Binary"); + if( mod!=null ) { + Object obj = mod.get(key); + if( obj instanceof LuanFunction ) { + final LuanFunction fn = (LuanFunction)obj; + return new LuanFunction() { + @Override public Object call(LuanState luan,Object[] args) throws LuanException { + Object[] a = new Object[args.length+1]; + a[0] = binary; + System.arraycopy(args,0,a,1,args.length); + return fn.call(luan,a); + } + }; + } + } + return null; } - @LuanMethod public static Byte[] unpack(byte[] binary) { - Byte[] bytes = new Byte[binary.length]; - for( int i=0; i<binary.length; i++ ) { - bytes[i] = binary[i]; + static int start(byte[] binary,int i) { + int len = binary.length; + return i==0 ? 0 : i > 0 ? Math.min(i-1,len) : Math.max(len+i,0); + } + + static int start(byte[] binary,Integer i,int dflt) { + return i==null ? dflt : start(binary,i); + } + + static int end(byte[] binary,int i) { + int len = binary.length; + return i==0 ? 0 : i > 0 ? Math.min(i,len) : Math.max(len+i+1,0); + } + + static int end(byte[] binary,Integer i,int dflt) { + return i==null ? dflt : end(binary,i); + } + + @LuanMethod public static Byte[] byte_(LuanState luan,byte[] binary,Integer i,Integer j) throws LuanException { + Utils.checkNotNull(luan,binary); + int start = start(binary,i,1); + int end = end(binary,j,start+1); + Byte[] bytes = new Byte[end-start]; + for( int k=0; k<bytes.length; k++ ) { + bytes[k] = binary[start+k]; } return bytes; } + @LuanMethod public static byte[] binary(byte... bytes) { + return bytes; + } + }
--- a/core/src/luan/modules/String.luan Thu Dec 18 12:06:56 2014 +0000 +++ b/core/src/luan/modules/String.luan Fri Dec 19 07:50:46 2014 +0000 @@ -1,7 +1,7 @@ java() import "java:luan.modules.StringLuan" -byte = StringLuan.byte_ +unicode = StringLuan.unicode char = StringLuan.char_ concat = StringLuan.concat find = StringLuan.find
--- a/core/src/luan/modules/StringLuan.java Thu Dec 18 12:06:56 2014 +0000 +++ b/core/src/luan/modules/StringLuan.java Fri Dec 19 07:50:46 2014 +0000 @@ -51,16 +51,13 @@ return i==null ? dflt : end(s,i); } - @LuanMethod public static Integer[] byte_(String s,Integer i,Integer j) { - if( i== null ) - i = 1; - if( j==null ) - j = i; - s = s.substring(i-1,j); - char[] a = s.toCharArray(); - Integer[] chars = new Integer[a.length]; - for( int k=0; k<a.length; k++ ) { - chars[k] = (int)a[k]; + @LuanMethod public static Integer[] unicode(LuanState luan,String s,Integer i,Integer j) throws LuanException { + Utils.checkNotNull(luan,s); + int start = start(s,i,1); + int end = end(s,j,start+1); + Integer[] chars = new Integer[end-start]; + for( int k=0; k<chars.length; k++ ) { + chars[k] = (int)s.charAt(start+k); } return chars; }
--- a/core/src/luan/modules/Utils.java Thu Dec 18 12:06:56 2014 +0000 +++ b/core/src/luan/modules/Utils.java Fri Dec 19 07:50:46 2014 +0000 @@ -27,6 +27,10 @@ checkNotNull(luan,s,"string"); } + public static void checkNotNull(LuanState luan,byte[] b) throws LuanException { + checkNotNull(luan,b,"binary"); + } + public static void checkNotNull(LuanState luan,LuanTable t) throws LuanException { checkNotNull(luan,t,"table"); }