Mercurial Hosting > luan
diff core/src/luan/modules/BinaryLuan.java @ 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 | 2f8938fc518c |
children | cbb94a7c7a9e |
line wrap: on
line diff
--- 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; + } + }