qse/ase/awk/Awk.java

347 lines
8.8 KiB
Java
Raw Normal View History

2006-10-24 04:57:29 +00:00
/*
2007-04-16 03:57:04 +00:00
* $Id: Awk.java,v 1.27 2007-04-16 03:57:04 bacon Exp $
2007-02-03 10:47:41 +00:00
*
* {License}
2006-10-24 04:57:29 +00:00
*/
package ase.awk;
public abstract class Awk
{
// mode for open_source & close_source
public static final int SOURCE_READ = 1;
public static final int SOURCE_WRITE = 2;
2007-01-23 14:23:18 +00:00
// depth id
public static final int DEPTH_BLOCK_PARSE = (1 << 0);
public static final int DEPTH_BLOCK_RUN = (1 << 1);
public static final int DEPTH_EXPR_PARSE = (1 << 2);
public static final int DEPTH_EXPR_RUN = (1 << 3);
public static final int DEPTH_REX_BUILD = (1 << 4);
public static final int DEPTH_REX_MATCH = (1 << 5);
2007-01-25 14:14:56 +00:00
// options
public static final int OPTION_IMPLICIT = (1 << 0);
public static final int OPTION_EXPLICIT = (1 << 1);
public static final int OPTION_UNIQUEFN = (1 << 2);
public static final int OPTION_SHADING = (1 << 3);
public static final int OPTION_SHIFT = (1 << 4);
public static final int OPTION_IDIV = (1 << 5);
public static final int OPTION_STRCONCAT = (1 << 6);
public static final int OPTION_EXTIO = (1 << 7);
public static final int OPTION_COPROC = (1 << 8);
public static final int OPTION_BLOCKLESS = (1 << 9);
public static final int OPTION_STRBASEONE = (1 << 10);
public static final int OPTION_STRIPSPACES = (1 << 11);
public static final int OPTION_NEXTOFILE = (1 << 12);
public static final int OPTION_CRLF = (1 << 13);
2007-04-16 03:57:04 +00:00
public static final int OPTION_ARGSTOMAIN = (1 << 14);
2007-01-25 14:14:56 +00:00
2006-11-26 15:55:44 +00:00
private long handle;
2006-10-24 04:57:29 +00:00
2006-10-24 06:06:16 +00:00
public Awk () throws Exception
2006-10-24 04:57:29 +00:00
{
2007-01-25 14:14:56 +00:00
this.handle = 0;
2006-10-24 04:57:29 +00:00
open ();
}
2006-11-26 15:55:44 +00:00
/* == just in case == */
2007-01-24 14:21:30 +00:00
protected void finalize () throws Throwable
2006-11-26 15:55:44 +00:00
{
2007-01-24 14:21:30 +00:00
super.finalize ();
2006-11-26 15:55:44 +00:00
if (handle != 0) close ();
}
2006-11-27 15:11:14 +00:00
/* == native methods == */
2006-10-24 06:06:16 +00:00
private native void open () throws Exception;
2006-11-27 15:11:14 +00:00
public native void close ();
public native void parse () throws Exception;
2007-02-01 07:24:00 +00:00
public native void run (String main, String[] args) throws Exception;
2006-11-27 15:11:14 +00:00
2007-01-23 14:23:18 +00:00
private native int getmaxdepth (int id);
2007-01-24 14:21:30 +00:00
private native void setmaxdepth (int id, int depth);
2007-01-23 14:23:18 +00:00
2007-01-25 14:14:56 +00:00
private native int getoption ();
private native void setoption (int opt);
private native boolean getdebug ();
private native void setdebug (boolean debug);
2007-01-24 11:54:16 +00:00
private native void addbfn (
String name, int min_args, int max_args) throws Exception;
2007-01-23 14:23:18 +00:00
private native void delbfn (String name) throws Exception;
2006-11-27 15:11:14 +00:00
2007-01-24 11:54:16 +00:00
private native void setfilename (
long runid, String name) throws Exception;
private native void setofilename (
long runid, String name) throws Exception;
2006-12-02 16:26:29 +00:00
2007-01-24 14:21:30 +00:00
private native Object strtonum (
long runid, String str) throws Exception;
2007-01-25 14:14:56 +00:00
private native String valtostr (
long runid, Object obj) throws Exception;
2006-11-22 15:12:04 +00:00
2007-02-01 07:24:00 +00:00
/* == simpler run methods == */
public void run (String main) throws Exception
{
run (main, null);
}
public void run (String[] args) throws Exception
{
run (null, args);
}
2007-01-31 09:31:29 +00:00
public void run () throws Exception
{
2007-02-01 07:24:00 +00:00
run (null, null);
2007-01-31 09:31:29 +00:00
}
2006-11-27 15:11:14 +00:00
/* == builtin functions == */
public void addBuiltinFunction (
String name, int min_args, int max_args) throws Exception
{
2007-01-23 14:23:18 +00:00
addbfn (name, min_args, max_args);
2006-11-29 14:52:36 +00:00
}
public void deleteBuiltinFunction (String name) throws Exception
{
2007-01-23 14:23:18 +00:00
delbfn (name);
2006-11-27 15:11:14 +00:00
}
2007-01-24 14:21:30 +00:00
protected long builtinFunctionArgumentToLong (
long runid, Object obj) throws Exception
2006-12-02 16:26:29 +00:00
{
long n;
if (obj == null) n = 0;
else
{
if (obj instanceof String)
obj = strtonum (runid, (String)obj);
if (obj instanceof Long)
{
n = ((Long)obj).longValue ();
}
else if (obj instanceof Double)
{
n = ((Double)obj).longValue ();
}
else if (obj instanceof Integer)
{
n = ((Integer)obj).longValue ();
}
else if (obj instanceof Short)
{
n = ((Short)obj).longValue ();
}
else if (obj instanceof Float)
{
n = ((Float)obj).longValue ();
}
else n = 0;
}
return n;
}
2007-01-24 14:21:30 +00:00
protected double builtinFunctionArgumentToDouble (
long runid, Object obj) throws Exception
2006-12-02 16:26:29 +00:00
{
double n;
if (obj == null) n = 0.0;
else
{
if (obj instanceof String)
obj = strtonum (runid, (String)obj);
if (obj instanceof Long)
{
n = ((Long)obj).doubleValue ();
}
else if (obj instanceof Double)
{
n = ((Double)obj).doubleValue ();
}
else if (obj instanceof Integer)
{
n = ((Integer)obj).doubleValue ();
}
else if (obj instanceof Short)
{
n = ((Short)obj).doubleValue ();
}
else if (obj instanceof Float)
{
n = ((Float)obj).doubleValue ();
}
else n = 0.0;
}
return n;
}
2007-01-24 14:21:30 +00:00
protected String builtinFunctionArgumentToString (
long runid, Object obj) throws Exception
2006-12-02 16:26:29 +00:00
{
String str;
if (obj == null) str = "";
else if (obj instanceof String) str = (String)obj;
else str = valtostr (runid, obj);
return str;
}
2006-11-26 15:55:44 +00:00
/* == console name setters == */
2007-01-24 14:21:30 +00:00
protected void setConsoleInputName (
Extio extio, String name) throws Exception
2006-11-22 15:12:04 +00:00
{
2007-01-23 14:23:18 +00:00
/* TODO: setfilename is not safe. for example, it can
2006-12-02 16:26:29 +00:00
* crash the program if runid is invalid. so this wrapper
2006-11-22 15:12:04 +00:00
* needs to do some sanity check. */
2007-01-24 11:54:16 +00:00
setfilename (extio.getRunId(), name);
2006-11-23 03:31:58 +00:00
}
2007-01-24 14:21:30 +00:00
protected void setConsoleOutputName (
Extio extio, String name) throws Exception
2006-11-23 03:31:58 +00:00
{
2007-01-24 11:54:16 +00:00
setofilename (extio.getRunId(), name);
2006-11-22 15:12:04 +00:00
}
2006-10-24 04:57:29 +00:00
2007-01-23 14:23:18 +00:00
/* == depth limiting == */
public int getMaxDepth (int id)
2006-11-26 15:55:44 +00:00
{
2007-01-23 14:23:18 +00:00
return getmaxdepth (id);
2006-11-26 15:55:44 +00:00
}
2007-01-23 14:23:18 +00:00
public void setMaxDepth (int ids, int depth)
2006-11-26 15:55:44 +00:00
{
2007-01-23 14:23:18 +00:00
setmaxdepth (ids, depth);
2006-11-26 15:55:44 +00:00
}
2007-01-25 14:14:56 +00:00
/* == option == */
public int getOption ()
{
return getoption ();
}
public void setOption (int opt)
{
setoption (opt);
}
/* == debug == */
public boolean getDebug ()
{
return getdebug ();
}
public void setDebug (boolean debug)
{
setdebug (debug);
}
2006-11-26 15:55:44 +00:00
/* == source code management == */
protected abstract int openSource (int mode);
protected abstract int closeSource (int mode);
protected abstract int readSource (char[] buf, int len);
protected abstract int writeSource (char[] buf, int len);
2006-10-24 04:57:29 +00:00
2006-11-26 15:55:44 +00:00
/* == external io interface == */
protected int openExtio (Extio extio)
2006-11-21 15:06:51 +00:00
{
int type = extio.getType ();
2006-11-26 15:55:44 +00:00
if (type == Extio.TYPE_CONSOLE) return openConsole (extio);
if (type == Extio.TYPE_FILE) return openFile (extio);
if (type == Extio.TYPE_PIPE) return openPipe (extio);
//if (type == Extio.TYPE_COPROC) return openCoproc (extio);
2006-11-21 15:06:51 +00:00
return -1;
}
2006-11-26 15:55:44 +00:00
protected int closeExtio (Extio extio)
2006-11-21 15:06:51 +00:00
{
int type = extio.getType ();
2006-11-26 15:55:44 +00:00
if (type == Extio.TYPE_CONSOLE) return closeConsole (extio);
if (type == Extio.TYPE_FILE) return closeFile (extio);
if (type == Extio.TYPE_PIPE) return closePipe (extio);
//if (type == Extio.TYPE_COPROC) return closeCoproc (extio);
2006-11-21 15:06:51 +00:00
return -1;
}
2006-11-26 15:55:44 +00:00
protected int readExtio (Extio extio, char[] buf, int len)
2006-11-21 15:06:51 +00:00
{
2006-11-23 03:31:58 +00:00
// this check is needed because 0 is used to indicate
// the end of the stream. java streams can return 0
// if the data given is 0 bytes and it didn't reach
// the end of the stream.
if (len <= 0) return -1;
2006-11-21 15:06:51 +00:00
int type = extio.getType ();
if (type == Extio.TYPE_CONSOLE)
2006-11-26 15:55:44 +00:00
return readConsole (extio, buf, len);
2006-11-21 15:06:51 +00:00
if (type == Extio.TYPE_FILE)
2006-11-26 15:55:44 +00:00
return readFile (extio, buf, len);
2006-11-24 15:07:18 +00:00
if (type == Extio.TYPE_PIPE)
2006-11-26 15:55:44 +00:00
return readPipe (extio, buf, len);
2006-11-24 15:07:18 +00:00
//if (type == Extio.TYPE_COPROC)
2006-11-26 15:55:44 +00:00
// return readCoproc (extio, buf, len);
2006-11-21 15:06:51 +00:00
return -1;
}
2006-11-26 15:55:44 +00:00
protected int writeExtio (Extio extio, char[] buf, int len)
2006-11-21 15:06:51 +00:00
{
2006-11-23 03:31:58 +00:00
if (len <= 0) return -1;
2006-11-21 15:06:51 +00:00
int type = extio.getType ();
if (type == Extio.TYPE_CONSOLE)
2006-11-26 15:55:44 +00:00
return writeConsole (extio, buf, len);
2006-11-21 15:06:51 +00:00
if (type == Extio.TYPE_FILE)
2006-11-26 15:55:44 +00:00
return writeFile (extio, buf, len);
2006-11-24 15:07:18 +00:00
if (type == Extio.TYPE_PIPE)
2006-11-26 15:55:44 +00:00
return writePipe (extio, buf, len);
2006-11-24 15:07:18 +00:00
//if (type == Extio.TYPE_COPROC)
2006-11-26 15:55:44 +00:00
// return writeCoproc (extio, buf, len);
2006-11-24 15:07:18 +00:00
return -1;
}
2006-11-26 15:55:44 +00:00
protected int flushExtio (Extio extio)
2006-11-24 15:07:18 +00:00
{
int type = extio.getType ();
2006-11-26 15:55:44 +00:00
if (type == Extio.TYPE_CONSOLE) return flushConsole (extio);
if (type == Extio.TYPE_FILE) return flushFile (extio);
if (type == Extio.TYPE_PIPE) return flushPipe (extio);
//if (type == Extio.TYPE_COPROC) return flushCoproc (extio);
2006-11-21 15:06:51 +00:00
return -1;
}
2006-11-26 15:55:44 +00:00
protected int nextExtio (Extio extio)
2006-11-22 05:58:26 +00:00
{
int type = extio.getType ();
2006-11-26 15:55:44 +00:00
if (type == Extio.TYPE_CONSOLE) return nextConsole (extio);
2006-11-22 05:58:26 +00:00
return -1;
}
2006-11-26 15:55:44 +00:00
protected abstract int openConsole (Extio extio);
protected abstract int closeConsole (Extio extio);
protected abstract int readConsole (Extio extio, char[] buf, int len);
protected abstract int writeConsole (Extio extio, char[] buf, int len);
protected abstract int flushConsole (Extio extio);
protected abstract int nextConsole (Extio extio);
protected abstract int openFile (Extio extio);
protected abstract int closeFile (Extio extio);
protected abstract int readFile (Extio extio, char[] buf, int len);
protected abstract int writeFile (Extio extio, char[] buf, int len);
protected abstract int flushFile (Extio extio);
protected abstract int openPipe (Extio extio);
protected abstract int closePipe (Extio extio);
protected abstract int readPipe (Extio extio, char[] buf, int len);
protected abstract int writePipe (Extio extio, char[] buf, int len);
protected abstract int flushPipe (Extio extio);
2006-10-24 04:57:29 +00:00
}