Mercurial Hosting > luan
diff src/luan/modules/IoLuan.java @ 1267:9fa8b8389578
add LuanTable.luan;
support metatable __gc();
add luan.sql;
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 12 Nov 2018 02:10:41 -0700 |
parents | e38f5869e9df |
children | d83f6cc558de |
line wrap: on
line diff
--- a/src/luan/modules/IoLuan.java Sun Sep 30 19:10:48 2018 -0600 +++ b/src/luan/modules/IoLuan.java Mon Nov 12 02:10:41 2018 -0700 @@ -79,8 +79,8 @@ }; } - public static LuanTable textWriter(final PrintStream out) { - return writer(luanWriter(out)); + public static LuanTable textWriter(LuanState luan,final PrintStream out) { + return writer(luan,luanWriter(out)); } private static LuanWriter luanWriter(final Writer out) { @@ -102,12 +102,12 @@ }; } - public static LuanTable textWriter(final Writer out) { - return writer(luanWriter(out)); + public static LuanTable textWriter(LuanState luan,final Writer out) { + return writer(luan,luanWriter(out)); } - private static LuanTable writer(LuanWriter luanWriter) { - LuanTable writer = new LuanTable(); + private static LuanTable writer(LuanState luan,LuanWriter luanWriter) { + LuanTable writer = new LuanTable(luan); writer.rawPut( "java", luanWriter.out() ); try { writer.rawPut( "write", new LuanJavaFunction( @@ -123,8 +123,8 @@ } - public static LuanTable binaryWriter(final OutputStream out) { - LuanTable writer = new LuanTable(); + public static LuanTable binaryWriter(LuanState luan,final OutputStream out) { + LuanTable writer = new LuanTable(luan); writer.rawPut( "java", out ); try { writer.rawPut( "write", new LuanJavaFunction( @@ -202,40 +202,40 @@ public static abstract class LuanIn { - public abstract InputStream inputStream() throws IOException, LuanException; + public abstract InputStream inputStream(LuanState luan) throws IOException, LuanException; public abstract String to_string(); public abstract String to_uri_string(); - public Reader reader() throws IOException, LuanException { - return new InputStreamReader(inputStream()); + public Reader reader(LuanState luan) throws IOException, LuanException { + return new InputStreamReader(inputStream(luan)); } - public String read_text() throws IOException, LuanException { - Reader in = reader(); + public String read_text(LuanState luan) throws IOException, LuanException { + Reader in = reader(luan); String s = Utils.readAll(in); in.close(); return s; } - public byte[] read_binary() throws IOException, LuanException { - InputStream in = inputStream(); + public byte[] read_binary(LuanState luan) throws IOException, LuanException { + InputStream in = inputStream(luan); byte[] a = Utils.readAll(in); in.close(); return a; } - public LuanFunction read_lines() throws IOException, LuanException { - return lines(new BufferedReader(reader())); + public LuanFunction read_lines(LuanState luan) throws IOException, LuanException { + return lines(new BufferedReader(reader(luan))); } - public LuanFunction read_blocks(Integer blockSize) throws IOException, LuanException { + public LuanFunction read_blocks(LuanState luan,Integer blockSize) throws IOException, LuanException { int n = blockSize!=null ? blockSize : Utils.bufSize; - return blocks(inputStream(),n); + return blocks(inputStream(luan),n); } - public boolean exists() throws IOException, LuanException { + public boolean exists(LuanState luan) throws IOException, LuanException { try { - inputStream().close(); + inputStream(luan).close(); return true; } catch(FileNotFoundException e) { return false; @@ -244,9 +244,9 @@ } } - public long checksum() throws IOException, LuanException { + public long checksum(LuanState luan) throws IOException, LuanException { long cs = 0; - InputStream in = new BufferedInputStream(inputStream()); + InputStream in = new BufferedInputStream(inputStream(luan)); int c; while( (c=in.read()) != -1 ) { cs = 31 * cs + c; @@ -255,8 +255,8 @@ return cs; } - public LuanTable table() { - LuanTable tbl = new LuanTable(); + public LuanTable table(LuanState luan) { + LuanTable tbl = new LuanTable(luan); try { tbl.rawPut( "java", this ); tbl.rawPut( "to_string", new LuanJavaFunction( @@ -266,22 +266,22 @@ LuanIn.class.getMethod( "to_uri_string" ), this ) ); tbl.rawPut( "read_text", new LuanJavaFunction( - LuanIn.class.getMethod( "read_text" ), this + LuanIn.class.getMethod( "read_text", LuanState.class ), this ) ); tbl.rawPut( "read_binary", new LuanJavaFunction( - LuanIn.class.getMethod( "read_binary" ), this + LuanIn.class.getMethod( "read_binary", LuanState.class ), this ) ); tbl.rawPut( "read_lines", new LuanJavaFunction( - LuanIn.class.getMethod( "read_lines" ), this + LuanIn.class.getMethod( "read_lines", LuanState.class ), this ) ); tbl.rawPut( "read_blocks", new LuanJavaFunction( - LuanIn.class.getMethod( "read_blocks", Integer.class ), this + LuanIn.class.getMethod( "read_blocks", LuanState.class, Integer.class ), this ) ); tbl.rawPut( "exists", new LuanJavaFunction( - LuanIn.class.getMethod( "exists" ), this + LuanIn.class.getMethod( "exists", LuanState.class ), this ) ); tbl.rawPut( "checksum", new LuanJavaFunction( - LuanIn.class.getMethod( "checksum" ), this + LuanIn.class.getMethod( "checksum", LuanState.class ), this ) ); } catch(NoSuchMethodException e) { throw new RuntimeException(e); @@ -292,7 +292,7 @@ public static final LuanIn defaultStdin = new LuanIn() { - @Override public InputStream inputStream() { + @Override public InputStream inputStream(LuanState luan) { return System.in; } @@ -304,15 +304,15 @@ return "stdin:"; } - @Override public String read_text() throws IOException { + @Override public String read_text(LuanState luan) throws IOException { return Utils.readAll(new InputStreamReader(System.in)); } - @Override public byte[] read_binary() throws IOException { + @Override public byte[] read_binary(LuanState luan) throws IOException { return Utils.readAll(System.in); } - @Override public boolean exists() { + @Override public boolean exists(LuanState luan) { return true; } }; @@ -320,7 +320,7 @@ public static abstract class LuanIO extends LuanIn { abstract OutputStream outputStream() throws IOException; - public void write(Object obj) throws LuanException, IOException { + public void write(LuanState luan,Object obj) throws LuanException, IOException { if( obj instanceof String ) { String s = (String)obj; Writer out = new OutputStreamWriter(outputStream()); @@ -340,7 +340,7 @@ Object java = t.rawGet("java"); if( java instanceof LuanIn ) { LuanIn luanIn = (LuanIn)java; - InputStream in = luanIn.inputStream(); + InputStream in = luanIn.inputStream(luan); OutputStream out = outputStream(); Utils.copyAll(in,out); out.close(); @@ -351,12 +351,12 @@ throw new LuanException( "bad argument #1 to 'write' (string or binary or Io.uri expected)" ); } - public LuanTable text_writer() throws IOException { - return textWriter(new BufferedWriter(new OutputStreamWriter(outputStream()))); + public LuanTable text_writer(LuanState luan) throws IOException { + return textWriter(luan,new BufferedWriter(new OutputStreamWriter(outputStream()))); } - public LuanTable binary_writer() throws IOException { - return binaryWriter(new BufferedOutputStream(outputStream())); + public LuanTable binary_writer(LuanState luan) throws IOException { + return binaryWriter(luan,new BufferedOutputStream(outputStream())); } public void write_text(LuanState luan,Object... args) throws LuanException, IOException { @@ -365,17 +365,17 @@ luanWriter.close(); } - @Override public LuanTable table() { - LuanTable tbl = super.table(); + @Override public LuanTable table(LuanState luan) { + LuanTable tbl = super.table(luan); try { tbl.rawPut( "write", new LuanJavaFunction( - LuanIO.class.getMethod( "write", Object.class ), this + LuanIO.class.getMethod( "write", LuanState.class, Object.class ), this ) ); tbl.rawPut( "text_writer", new LuanJavaFunction( - LuanIO.class.getMethod( "text_writer" ), this + LuanIO.class.getMethod( "text_writer", LuanState.class ), this ) ); tbl.rawPut( "binary_writer", new LuanJavaFunction( - LuanIO.class.getMethod( "binary_writer" ), this + LuanIO.class.getMethod( "binary_writer", LuanState.class ), this ) ); tbl.rawPut( "write_text", new LuanJavaFunction( LuanIO.class.getMethod( "write_text", LuanState.class, new Object[0].getClass() ), this @@ -397,7 +397,7 @@ @Override public void write(int b) {} }; - @Override public InputStream inputStream() { + @Override public InputStream inputStream(LuanState luan) { return in; } @@ -422,7 +422,7 @@ this.s = s; } - @Override public InputStream inputStream() { + @Override public InputStream inputStream(LuanState luan) { throw new UnsupportedOperationException(); } @@ -438,19 +438,19 @@ return "string:" + s; } - @Override public Reader reader() { + @Override public Reader reader(LuanState luan) { return new StringReader(s); } - @Override public String read_text() { + @Override public String read_text(LuanState luan) { return s; } - @Override public boolean exists() { + @Override public boolean exists(LuanState luan) { return true; } - @Override public LuanTable text_writer() throws IOException { + @Override public LuanTable text_writer(LuanState luan) throws IOException { LuanWriter luanWriter = new LuanWriter() { private final Writer out = new StringWriter(); @@ -468,7 +468,7 @@ s = out.toString(); } }; - return writer(luanWriter); + return writer(luan,luanWriter); } } @@ -484,7 +484,7 @@ this.file = file; } - @Override public InputStream inputStream() throws IOException { + @Override public InputStream inputStream(LuanState luan) throws IOException { return new FileInputStream(file); } @@ -501,16 +501,16 @@ } public LuanTable child(LuanState luan,String name) throws LuanException { - return new LuanFile(luan,new File(file,name)).table(); + return new LuanFile(luan,new File(file,name)).table(luan); } public LuanTable children(LuanState luan) throws LuanException { File[] files = file.listFiles(); if( files==null ) return null; - LuanTable list = new LuanTable(); + LuanTable list = new LuanTable(luan); for( File f : files ) { - list.rawPut(list.rawLength()+1,new LuanFile(luan,f).table()); + list.rawPut(list.rawLength()+1,new LuanFile(luan,f).table(luan)); } return list; } @@ -519,10 +519,10 @@ File parent = file.getParentFile(); if( parent==null ) parent = file.getCanonicalFile().getParentFile(); - return new LuanFile(luan,parent).table(); + return new LuanFile(luan,parent).table(luan); } - @Override public boolean exists() { + @Override public boolean exists(LuanState luan) { return file.exists(); } @@ -535,12 +535,12 @@ } public LuanTable canonical(LuanState luan) throws LuanException, IOException { - return new LuanFile(luan,file.getCanonicalFile()).table(); + return new LuanFile(luan,file.getCanonicalFile()).table(luan); } public LuanTable create_temp_file(LuanState luan,String prefix,String suffix) throws LuanException, IOException { File tmp = File.createTempFile(prefix,suffix,file); - return new LuanFile(luan,tmp).table(); + return new LuanFile(luan,tmp).table(luan); } public void delete() throws LuanException { @@ -571,8 +571,8 @@ throw new LuanException("couldn't set_last_modified on "+file); } - @Override public LuanTable table() { - LuanTable tbl = super.table(); + @Override public LuanTable table(LuanState luan) { + LuanTable tbl = super.table(luan); try { tbl.rawPut( "name", new LuanJavaFunction( File.class.getMethod( "getName" ), file @@ -626,18 +626,18 @@ } } - public static LuanTable null_(String ignore) { - return nullIO.table(); + public static LuanTable null_(LuanState luan,String ignore) { + return nullIO.table(luan); } - public static LuanTable string(String s) throws LuanException { + public static LuanTable string(LuanState luan,String s) throws LuanException { Utils.checkNotNull(s); - return new LuanString(s).table(); + return new LuanString(s).table(luan); } public static LuanTable file(LuanState luan,String name) throws LuanException { File file = new File(name); - return new LuanFile(luan,file).table(); + return new LuanFile(luan,file).table(luan); } public static LuanTable classpath(LuanState luan,String name) throws LuanException { @@ -666,13 +666,13 @@ } } if( url != null ) - return new LuanUrl(luan,url,null).table(); + return new LuanUrl(url,null).table(luan); return null; } private static LuanTable url(LuanState luan,String url,LuanTable options) throws IOException, LuanException { - return new LuanUrl(luan,new URL(url),options).table(); + return new LuanUrl(new URL(url),options).table(luan); } public static LuanTable http(LuanState luan,String path,LuanTable options) throws IOException, LuanException { @@ -689,14 +689,14 @@ public static LuanTable stdin(LuanState luan) throws LuanException { LuanTable io = (LuanTable)PackageLuan.require(luan,"luan:Io.luan"); - return (LuanTable)io.get(luan,"stdin"); + return (LuanTable)io.get("stdin"); } - public static LuanTable newSchemes() { - LuanTable schemes = new LuanTable(); + public static LuanTable newSchemes(LuanState luan) { + LuanTable schemes = new LuanTable(luan); try { - schemes.rawPut( "null", new LuanJavaFunction(IoLuan.class.getMethod("null_",String.class),null) ); - add( schemes, "string", String.class ); + schemes.rawPut( "null", new LuanJavaFunction(IoLuan.class.getMethod("null_",LuanState.class,String.class),null) ); + add( schemes, "string", LuanState.class, String.class ); add( schemes, "file", LuanState.class, String.class ); add( schemes, "classpath", LuanState.class, String.class ); // add( schemes, "socket", String.class ); @@ -715,10 +715,10 @@ private static LuanTable schemes(LuanState luan) throws LuanException { LuanTable t = (LuanTable)PackageLuan.loaded(luan).rawGet("luan:Io.luan"); if( t == null ) - return newSchemes(); - t = (LuanTable)t.get(luan,"schemes"); + return newSchemes(luan); + t = (LuanTable)t.get("schemes"); if( t == null ) - return newSchemes(); + return newSchemes(luan); return t; } @@ -729,7 +729,7 @@ String scheme = name.substring(0,i); String location = name.substring(i+1); LuanTable schemes = schemes(luan); - LuanFunction opener = (LuanFunction)schemes.get(luan,scheme); + LuanFunction opener = (LuanFunction)schemes.get(scheme); if( opener == null ) throw new LuanException( "invalid scheme '"+scheme+"' in '"+name+"'" ); return (LuanTable)Luan.first(opener.call(luan,new Object[]{location,options})); @@ -802,11 +802,11 @@ final File dir; Process proc; - private BaseOs(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException { + private BaseOs(String cmd,LuanTable options) throws IOException, LuanException { this.cmd = cmd; File dir = null; if( options != null ) { - Map map = options.asMap(luan); + Map map = options.asMap(); Object obj = map.remove("dir"); dir = objToFile(obj); if( dir==null ) @@ -817,7 +817,7 @@ this.dir = dir; } - @Override public InputStream inputStream() throws IOException { + @Override public InputStream inputStream(LuanState luan) throws IOException { return proc.getInputStream(); } @@ -833,7 +833,7 @@ throw new UnsupportedOperationException(); } - @Override public boolean exists() { + @Override public boolean exists(LuanState luan) { return true; } @@ -854,14 +854,14 @@ } } - @Override public String read_text() throws IOException, LuanException { - String s = super.read_text(); + @Override public String read_text(LuanState luan) throws IOException, LuanException { + String s = super.read_text(luan); wait_for(); return s; } - @Override public LuanTable table() { - LuanTable tbl = super.table(); + @Override public LuanTable table(LuanState luan) { + LuanTable tbl = super.table(luan); try { tbl.rawPut( "wait_for", new LuanJavaFunction( BaseOs.class.getMethod( "wait_for" ), this @@ -875,26 +875,26 @@ public static final class LuanOs extends BaseOs { private LuanOs(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException { - super(luan,cmd,options); + super(cmd,options); check(luan,"os:"+cmd); this.proc = Runtime.getRuntime().exec(cmd,null,dir); } } public static LuanTable os(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException { - return new LuanOs(luan,cmd,options).table(); + return new LuanOs(luan,cmd,options).table(luan); } public static final class LuanBash extends BaseOs { private LuanBash(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException { - super(luan,cmd,options); + super(cmd,options); check(luan,"bash:"+cmd); this.proc = Runtime.getRuntime().exec(new String[]{"bash","-c",cmd},null,dir); } } public static LuanTable bash(LuanState luan,String cmd,LuanTable options) throws IOException, LuanException { - return new LuanBash(luan,cmd,options).table(); + return new LuanBash(luan,cmd,options).table(luan); } @@ -906,7 +906,7 @@ this.in = in; } - @Override public InputStream inputStream() { + @Override public InputStream inputStream(LuanState luan) { return in; } @@ -918,7 +918,7 @@ throw new UnsupportedOperationException(); } - @Override public boolean exists() { + @Override public boolean exists(LuanState luan) { return true; } }; @@ -932,8 +932,8 @@ } } - public static LuanTable my_ips() throws IOException { - LuanTable tbl = new LuanTable(); + public static LuanTable my_ips(LuanState luan) throws IOException { + LuanTable tbl = new LuanTable(luan); for( Enumeration<NetworkInterface> e1 = NetworkInterface.getNetworkInterfaces(); e1.hasMoreElements(); ) { NetworkInterface ni = e1.nextElement(); for( Enumeration<InetAddress> e2 = ni.getInetAddresses(); e2.hasMoreElements(); ) {