Recovered from cvs revision 2007-10-13 05:08:00
This commit is contained in:
		| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: Awk.java,v 1.16 2007/10/10 07:03:56 bacon Exp $ |  * $Id: Awk.java,v 1.18 2007/10/12 16:13:34 bacon Exp $ | ||||||
|  * |  * | ||||||
|  * {License} |  * {License} | ||||||
|  */ |  */ | ||||||
| @ -7,9 +7,14 @@ | |||||||
| package ase.awk; | package ase.awk; | ||||||
|  |  | ||||||
| import java.io.*; | import java.io.*; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.lang.reflect.Method; | ||||||
|  | import java.lang.reflect.InvocationTargetException; | ||||||
|  |  | ||||||
| public abstract class Awk | public abstract class Awk | ||||||
| { | { | ||||||
|  | 	private HashMap functionTable; | ||||||
|  |  | ||||||
| 	// mode for open_source & close_source  | 	// mode for open_source & close_source  | ||||||
| 	public static final int SOURCE_READ = 1; | 	public static final int SOURCE_READ = 1; | ||||||
| 	public static final int SOURCE_WRITE = 2; | 	public static final int SOURCE_WRITE = 2; | ||||||
| @ -53,6 +58,7 @@ public abstract class Awk | |||||||
| 	public Awk () throws Exception | 	public Awk () throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		this.handle = 0; | 		this.handle = 0; | ||||||
|  | 		this.functionTable = new HashMap (); | ||||||
| 		open (); | 		open (); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @ -68,6 +74,7 @@ public abstract class Awk | |||||||
| 	public  native void close (); | 	public  native void close (); | ||||||
| 	public  native void parse () throws Exception; | 	public  native void parse () throws Exception; | ||||||
| 	public  native void run (String main, String[] args) throws Exception; | 	public  native void run (String main, String[] args) throws Exception; | ||||||
|  | 	public  native void stop (); | ||||||
|  |  | ||||||
| 	private native int getmaxdepth (int id); | 	private native int getmaxdepth (int id); | ||||||
| 	private native void setmaxdepth (int id, int depth); | 	private native void setmaxdepth (int id, int depth); | ||||||
| @ -115,15 +122,34 @@ public abstract class Awk | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* == builtin functions == */ | 	/* == builtin functions == */ | ||||||
| 	public void addFunction ( | 	public void addFunction (String name, int min_args, int max_args) throws Exception | ||||||
| 		String name, int min_args, int max_args) throws Exception |  | ||||||
| 	{ | 	{ | ||||||
| 		addfunc (name, min_args, max_args); | 		addFunction (name, min_args, max_args, "bfn_" + name); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public void addFunction (String name, int min_args, int max_args, String method) throws Exception | ||||||
|  | 	{ | ||||||
|  | 		if (functionTable.containsKey (name)) | ||||||
|  | 		{ | ||||||
|  | 			throw new Exception ( | ||||||
|  | 				"cannot add existing function '" + name + "'",  | ||||||
|  | 				Exception.EXIST); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		functionTable.put (name, method); | ||||||
|  | 		try { addfunc (name, min_args, max_args); } | ||||||
|  | 		catch (Exception e) | ||||||
|  | 		{ | ||||||
|  | 			functionTable.remove (name); | ||||||
|  | 			throw e; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public void deleteFunction (String name) throws Exception | 	public void deleteFunction (String name) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		delfunc (name); | 		delfunc (name);  | ||||||
|  | 		functionTable.remove (name); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	protected long builtinFunctionArgumentToLong ( | 	protected long builtinFunctionArgumentToLong ( | ||||||
| @ -276,6 +302,23 @@ public abstract class Awk | |||||||
| 		setword (null, null); | 		setword (null, null); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	/* == intrinsic function handling == */ | ||||||
|  | 	protected Object handleFunction ( | ||||||
|  | 		long run, String name, Object args[]) throws java.lang.Exception | ||||||
|  | 	{ | ||||||
|  | 		String mn = (String)functionTable.get(name); | ||||||
|  | 		// name should always be found in this table. | ||||||
|  | 		// otherwise, there is something wrong with this program.  | ||||||
|  |  | ||||||
|  | 		Class c = this.getClass (); | ||||||
|  | 		Class[] a = { Context.class, String.class, Object[].class }; | ||||||
|  |  | ||||||
|  | 		// TODO: remove new Context .... | ||||||
|  | 		Method m = c.getMethod (mn, a); | ||||||
|  | 		return m.invoke (this,  | ||||||
|  | 			new Object[] { new Context(run), name, args}) ; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	/* == source code management == */ | 	/* == source code management == */ | ||||||
| 	protected abstract int openSource (int mode); | 	protected abstract int openSource (int mode); | ||||||
| 	protected abstract int closeSource (int mode); | 	protected abstract int closeSource (int mode); | ||||||
|  | |||||||
							
								
								
									
										31
									
								
								ase/awk/Context.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								ase/awk/Context.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | /* | ||||||
|  |  * $Id: Context.java,v 1.2 2007/10/12 16:13:34 bacon Exp $ | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | package ase.awk; | ||||||
|  |  | ||||||
|  | public class Context | ||||||
|  | { | ||||||
|  | 	private long run; | ||||||
|  | 	private Object custom; | ||||||
|  |  | ||||||
|  | 	Context (long run) | ||||||
|  | 	{ | ||||||
|  | 		this.run = run; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public long getId () | ||||||
|  | 	{ | ||||||
|  | 		return this.run; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public void setCustom (Object custom) | ||||||
|  | 	{ | ||||||
|  | 		this.custom = custom; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	public Object getCustom () | ||||||
|  | 	{ | ||||||
|  | 		return this.custom; | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: StdAwk.java,v 1.11 2007/08/26 14:33:38 bacon Exp $ |  * $Id: StdAwk.java,v 1.13 2007/10/12 16:13:34 bacon Exp $ | ||||||
|  * |  * | ||||||
|  * {License} |  * {License} | ||||||
|  */ |  */ | ||||||
| @ -20,7 +20,7 @@ public abstract class StdAwk extends Awk | |||||||
| 		seed = System.currentTimeMillis(); | 		seed = System.currentTimeMillis(); | ||||||
| 		random = new java.util.Random (seed); | 		random = new java.util.Random (seed); | ||||||
|  |  | ||||||
| 		addFunction ("sin", 1, 1);  | 		addFunction ("sin", 1, 1, "sin");  | ||||||
| 		addFunction ("cos", 1, 1);  | 		addFunction ("cos", 1, 1);  | ||||||
| 		addFunction ("tan", 1, 1);  | 		addFunction ("tan", 1, 1);  | ||||||
| 		addFunction ("atan", 1, 1);  | 		addFunction ("atan", 1, 1);  | ||||||
| @ -28,7 +28,7 @@ public abstract class StdAwk extends Awk | |||||||
| 		addFunction ("log", 1, 1);  | 		addFunction ("log", 1, 1);  | ||||||
| 		addFunction ("exp", 1, 1);  | 		addFunction ("exp", 1, 1);  | ||||||
| 		addFunction ("sqrt", 1, 1);  | 		addFunction ("sqrt", 1, 1);  | ||||||
| 		addFunction ("int", 1, 1);  | 		addFunction ("int", 1, 1, "bfnint");  | ||||||
|  |  | ||||||
| 		addFunction ("srand", 0, 1);  | 		addFunction ("srand", 0, 1);  | ||||||
| 		addFunction ("rand", 0, 0);  | 		addFunction ("rand", 0, 0);  | ||||||
| @ -330,104 +330,103 @@ public abstract class StdAwk extends Awk | |||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
| 	/* == arithmetic built-in functions */ | 	/* == arithmetic built-in functions */ | ||||||
| 	public Object bfn_sin (long runid, Object[] args)  throws Exception | 	public Object sin (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		double x = builtinFunctionArgumentToDouble (runid, args[0]); | 		double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); | ||||||
| 		return new Double (Math.sin(x)); | 		return new Double (Math.sin(x)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_cos (long runid, Object[] args) throws Exception | 	public Object cos (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		double x = builtinFunctionArgumentToDouble (runid, args[0]); | 		double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); | ||||||
| 		return new Double (Math.cos(x)); | 		return new Double (Math.cos(x)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_tan (long runid, Object[] args) throws Exception | 	public Object tan (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		double x = builtinFunctionArgumentToDouble (runid, args[0]); | 		double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); | ||||||
| 		return new Double (Math.tan(x)); | 		return new Double (Math.tan(x)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_atan (long runid, Object[] args) throws Exception | 	public Object atan (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		double x = builtinFunctionArgumentToDouble (runid, args[0]); | 		double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); | ||||||
| 		return new Double (Math.atan(x)); | 		return new Double (Math.atan(x)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_atan2 (long runid, Object[] args) throws Exception | 	public Object atan2 (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		double y = builtinFunctionArgumentToDouble (runid, args[0]); | 		double y = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); | ||||||
| 		double x = builtinFunctionArgumentToDouble (runid, args[1]); | 		double x = builtinFunctionArgumentToDouble (ctx.getId(), args[1]); | ||||||
| 		return new Double (Math.atan2(y,x)); | 		return new Double (Math.atan2(y,x)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_log (long runid, Object[] args) throws Exception | 	public Object log (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		double x = builtinFunctionArgumentToDouble (runid, args[0]); | 		double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); | ||||||
| 		return new Double (Math.log(x)); | 		return new Double (Math.log(x)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_exp (long runid, Object[] args) throws Exception | 	public Object exp (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		double x = builtinFunctionArgumentToDouble (runid, args[0]); | 		double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); | ||||||
| 		return new Double (Math.exp(x)); | 		return new Double (Math.exp(x)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_sqrt (long runid, Object[] args) throws Exception | 	public Object sqrt (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		double x = builtinFunctionArgumentToDouble (runid, args[0]); | 		double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); | ||||||
| 		return new Double (Math.sqrt(x)); | 		return new Double (Math.sqrt(x)); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_int (long runid, Object[] args) throws Exception | 	public Object bfnint (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		long x = builtinFunctionArgumentToLong (runid, args[0]); | 		long x = builtinFunctionArgumentToLong (ctx.getId(), args[0]); | ||||||
| 		return new Long (x); | 		return new Long (x); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_rand (long runid, Object[] args) | 	public Object rand (Context ctx, String name, Object[] args) | ||||||
| 	{ | 	{ | ||||||
| 		return new Double (random.nextDouble ()); | 		return new Double (random.nextDouble ()); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_srand (long runid, Object[] args) throws Exception | 	public Object srand (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		long prev_seed = seed; | 		long prev_seed = seed; | ||||||
|  |  | ||||||
| 		seed = (args == null || args.length == 0)? | 		seed = (args == null || args.length == 0)? | ||||||
| 			System.currentTimeMillis (): | 			System.currentTimeMillis (): | ||||||
| 			builtinFunctionArgumentToLong (runid, args[0]); | 			builtinFunctionArgumentToLong (ctx.getId(), args[0]); | ||||||
|  |  | ||||||
| 		random.setSeed (seed); | 		random.setSeed (seed); | ||||||
| 		return new Long (prev_seed); | 		return new Long (prev_seed); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_systime (long runid, Object[] args)  | 	public Object systime (Context ctx, String name, Object[] args)  | ||||||
| 	{ | 	{ | ||||||
| 		long msec = System.currentTimeMillis (); | 		long msec = System.currentTimeMillis (); | ||||||
| 		return new Long (msec / 1000); | 		return new Long (msec / 1000); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_strftime (long runid, Object[] args) throws Exception | 	public Object strftime (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		String fmt = (args.length<1)? "%c": builtinFunctionArgumentToString (runid, args[0]); | 		String fmt = (args.length<1)? "%c": builtinFunctionArgumentToString (ctx.getId(), args[0]); | ||||||
| 		long t = (args.length<2)? (System.currentTimeMillis()/1000): builtinFunctionArgumentToLong (runid, args[1]); | 		long t = (args.length<2)? (System.currentTimeMillis()/1000): builtinFunctionArgumentToLong (ctx.getId(), args[1]); | ||||||
| 		return strftime (fmt, t); | 		return strftime (fmt, t); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_strfgmtime (long runid, Object[] args) throws Exception | 	public Object strfgmtime (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		String fmt = (args.length<1)? "%c": builtinFunctionArgumentToString (runid, args[0]); | 		String fmt = (args.length<1)? "%c": builtinFunctionArgumentToString (ctx.getId(), args[0]); | ||||||
| 		long t = (args.length<2)? (System.currentTimeMillis()/1000): builtinFunctionArgumentToLong (runid, args[1]); | 		long t = (args.length<2)? (System.currentTimeMillis()/1000): builtinFunctionArgumentToLong (ctx.getId(), args[1]); | ||||||
| 		return strfgmtime (fmt, t); | 		return strfgmtime (fmt, t); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* miscellaneous built-in functions */ | 	/* miscellaneous built-in functions */ | ||||||
| 	public Object bfn_system (long runid, Object[] args) throws Exception | 	public Object system (Context ctx, String name, Object[] args) throws Exception | ||||||
| 	{ | 	{ | ||||||
| 		String str = builtinFunctionArgumentToString (runid, args[0]); | 		String str = builtinFunctionArgumentToString (ctx.getId(), args[0]); | ||||||
| 		return system (str); | 		return system (str); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: jni.c,v 1.17 2007/10/10 07:03:56 bacon Exp $ |  * $Id: jni.c,v 1.19 2007/10/12 16:13:34 bacon Exp $ | ||||||
|  * |  * | ||||||
|  * {License} |  * {License} | ||||||
|  */ |  */ | ||||||
| @ -25,6 +25,11 @@ | |||||||
| #include <tchar.h> | #include <tchar.h> | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | #if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG) | ||||||
|  | #define _CRTDBG_MAP_ALLOC | ||||||
|  | #include <crtdbg.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #ifndef ASE_CHAR_IS_WCHAR | #ifndef ASE_CHAR_IS_WCHAR | ||||||
| 	#error this module supports ASE_CHAR_IS_WCHAR only | 	#error this module supports ASE_CHAR_IS_WCHAR only | ||||||
| #endif | #endif | ||||||
| @ -49,11 +54,11 @@ enum | |||||||
| 	SOURCE_WRITE = 2 | 	SOURCE_WRITE = 2 | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static ase_ssize_t __read_source ( | static ase_ssize_t read_source ( | ||||||
| 	int cmd, void* arg, ase_char_t* data, ase_size_t count); | 	int cmd, void* arg, ase_char_t* data, ase_size_t count); | ||||||
| static ase_ssize_t __write_source ( | static ase_ssize_t write_source ( | ||||||
| 	int cmd, void* arg, ase_char_t* data, ase_size_t count); | 	int cmd, void* arg, ase_char_t* data, ase_size_t count); | ||||||
| static ase_ssize_t __process_extio ( | static ase_ssize_t process_extio ( | ||||||
| 	int cmd, void* arg, ase_char_t* data, ase_size_t count); | 	int cmd, void* arg, ase_char_t* data, ase_size_t count); | ||||||
|  |  | ||||||
| typedef struct awk_data_t   awk_data_t; | typedef struct awk_data_t   awk_data_t; | ||||||
| @ -320,6 +325,10 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_open (JNIEnv* env, jobject obj) | |||||||
| 	awk_data_t* awk_data; | 	awk_data_t* awk_data; | ||||||
| 	int opt; | 	int opt; | ||||||
| 	 | 	 | ||||||
|  | #if defined(_WIN32) && defined(_DEBUG) && defined(_MSC_VER) | ||||||
|  | 	OutputDebugStringW (L"<<<OPENING AWK>>>\n"); | ||||||
|  | 	_CrtSetDbgFlag (_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF); | ||||||
|  | #endif | ||||||
| 	memset (&prmfns, 0, sizeof(prmfns)); | 	memset (&prmfns, 0, sizeof(prmfns)); | ||||||
|  |  | ||||||
| 	prmfns.mmgr.malloc = awk_malloc; | 	prmfns.mmgr.malloc = awk_malloc; | ||||||
| @ -424,6 +433,12 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_close (JNIEnv* env, jobject obj) | |||||||
| 		(*env)->SetLongField (env, obj, handle, (jlong)0); | 		(*env)->SetLongField (env, obj, handle, (jlong)0); | ||||||
| 		free (tmp); | 		free (tmp); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | #if defined(_WIN32) && defined(_DEBUG) && defined(_MSC_VER) | ||||||
|  | 	OutputDebugStringW (L"<<<CLOSING AWK>>>\n"); | ||||||
|  | 	_CrtDumpMemoryLeaks (); | ||||||
|  | #endif | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| JNIEXPORT void JNICALL Java_ase_awk_Awk_parse (JNIEnv* env, jobject obj) | JNIEXPORT void JNICALL Java_ase_awk_Awk_parse (JNIEnv* env, jobject obj) | ||||||
| @ -451,8 +466,8 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_parse (JNIEnv* env, jobject obj) | |||||||
| 	srcio_data.env = env; | 	srcio_data.env = env; | ||||||
| 	srcio_data.obj = obj; | 	srcio_data.obj = obj; | ||||||
|  |  | ||||||
| 	srcios.in = __read_source; | 	srcios.in = read_source; | ||||||
| 	srcios.out = __write_source; | 	srcios.out = write_source; | ||||||
| 	srcios.custom_data = &srcio_data; | 	srcios.custom_data = &srcio_data; | ||||||
|  |  | ||||||
| 	if (ase_awk_parse (awk, &srcios) == -1) | 	if (ase_awk_parse (awk, &srcios) == -1) | ||||||
| @ -595,10 +610,10 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jstring m | |||||||
| 	runio_data.env = env; | 	runio_data.env = env; | ||||||
| 	runio_data.obj = obj; | 	runio_data.obj = obj; | ||||||
|  |  | ||||||
| 	runios.pipe = __process_extio; | 	runios.pipe = process_extio; | ||||||
| 	runios.coproc = ASE_NULL; | 	runios.coproc = ASE_NULL; | ||||||
| 	runios.file = __process_extio; | 	runios.file = process_extio; | ||||||
| 	runios.console = __process_extio; | 	runios.console = process_extio; | ||||||
| 	runios.custom_data = &runio_data; | 	runios.custom_data = &runio_data; | ||||||
|  |  | ||||||
| 	if (mfn == NULL)  | 	if (mfn == NULL)  | ||||||
| @ -782,6 +797,27 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jstring m | |||||||
| 	DELETE_CLASS_REFS (env, run_data); | 	DELETE_CLASS_REFS (env, run_data); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | JNIEXPORT void JNICALL Java_ase_awk_Awk_stop (JNIEnv* env, jobject obj) | ||||||
|  | { | ||||||
|  | 	jclass class;  | ||||||
|  | 	jfieldID handle; | ||||||
|  | 	ase_awk_t* awk; | ||||||
|  | 	 | ||||||
|  | 	class = (*env)->GetObjectClass(env, obj); | ||||||
|  | 	handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); | ||||||
|  | 	(*env)->DeleteLocalRef (env, class); | ||||||
|  | 	if (handle == NULL)  | ||||||
|  | 	{	 | ||||||
|  | 		/* internal error. no handle field  | ||||||
|  | 		 * NoSuchFieldError, ExceptionInitializerError,  | ||||||
|  | 		 * OutOfMemoryError might occur */ | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	awk = (ase_awk_t*) (*env)->GetLongField (env, obj, handle); | ||||||
|  | 	if (awk != NULL) ase_awk_stopall (awk); | ||||||
|  | } | ||||||
|  |  | ||||||
| static ase_ssize_t __java_open_source (JNIEnv* env, jobject obj, int mode) | static ase_ssize_t __java_open_source (JNIEnv* env, jobject obj, int mode) | ||||||
| { | { | ||||||
| 	jclass class;  | 	jclass class;  | ||||||
| @ -1325,7 +1361,7 @@ static ase_ssize_t __java_next_extio ( | |||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| static ase_ssize_t __read_source ( | static ase_ssize_t read_source ( | ||||||
| 	int cmd, void* arg, ase_char_t* data, ase_size_t count) | 	int cmd, void* arg, ase_char_t* data, ase_size_t count) | ||||||
| { | { | ||||||
| 	srcio_data_t* srcio_data = (srcio_data_t*)arg; | 	srcio_data_t* srcio_data = (srcio_data_t*)arg; | ||||||
| @ -1349,7 +1385,7 @@ static ase_ssize_t __read_source ( | |||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static ase_ssize_t __write_source ( | static ase_ssize_t write_source ( | ||||||
| 	int cmd, void* arg, ase_char_t* data, ase_size_t count) | 	int cmd, void* arg, ase_char_t* data, ase_size_t count) | ||||||
| { | { | ||||||
| 	srcio_data_t* srcio_data = (srcio_data_t*)arg; | 	srcio_data_t* srcio_data = (srcio_data_t*)arg; | ||||||
| @ -1373,13 +1409,12 @@ static ase_ssize_t __write_source ( | |||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static ase_ssize_t __process_extio ( | static ase_ssize_t process_extio ( | ||||||
| 	int cmd, void* arg, ase_char_t* data, ase_size_t size) | 	int cmd, void* arg, ase_char_t* data, ase_size_t size) | ||||||
| { | { | ||||||
| 	ase_awk_extio_t* epa = (ase_awk_extio_t*)arg; | 	ase_awk_extio_t* epa = (ase_awk_extio_t*)arg; | ||||||
| 	runio_data_t* runio_data = (runio_data_t*)epa->custom_data; | 	runio_data_t* runio_data = (runio_data_t*)epa->custom_data; | ||||||
|  |  | ||||||
|  |  | ||||||
| 	switch (cmd) | 	switch (cmd) | ||||||
| 	{ | 	{ | ||||||
|  |  | ||||||
| @ -1419,7 +1454,7 @@ static ase_ssize_t __process_extio ( | |||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int __handle_bfn ( | static int handle_bfn ( | ||||||
| 	ase_awk_run_t* run, const ase_char_t* fnm, ase_size_t fnl) | 	ase_awk_run_t* run, const ase_char_t* fnm, ase_size_t fnl) | ||||||
| { | { | ||||||
| 	jclass class;  | 	jclass class;  | ||||||
| @ -1442,7 +1477,7 @@ static int __handle_bfn ( | |||||||
| 	env = run_data->env; | 	env = run_data->env; | ||||||
| 	obj = run_data->obj; | 	obj = run_data->obj; | ||||||
|  |  | ||||||
| 	/*if (fnl > 0 && ASE_SIZEOF(jchar) != ASE_SIZEOF(ase_char_t))*/ | 	if (fnl > 0 && ASE_SIZEOF(jchar) != ASE_SIZEOF(ase_char_t)) | ||||||
| 	{ | 	{ | ||||||
| 		ase_size_t i; | 		ase_size_t i; | ||||||
| 		jchar* tmp = (jchar*) malloc (ASE_SIZEOF(jchar)*(fnl+4)); | 		jchar* tmp = (jchar*) malloc (ASE_SIZEOF(jchar)*(fnl+4)); | ||||||
| @ -1452,18 +1487,21 @@ static int __handle_bfn ( | |||||||
| 			return -1; | 			return -1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		/* | ||||||
| 		tmp[0] = (jchar)'b'; | 		tmp[0] = (jchar)'b'; | ||||||
| 		tmp[1] = (jchar)'f'; | 		tmp[1] = (jchar)'f'; | ||||||
| 		tmp[2] = (jchar)'n'; | 		tmp[2] = (jchar)'n'; | ||||||
| 		tmp[3] = (jchar)'_'; | 		tmp[3] = (jchar)'_'; | ||||||
| 		for (i = 0; i < fnl; i++) tmp[i+4] = (jchar)fnm[i]; | 		for (i = 0; i < fnl; i++) tmp[i+4] = (jchar)fnm[i]; | ||||||
|  | 		*/ | ||||||
|  | 		for (i = 0; i < fnl; i++) tmp[i] = (jchar)fnm[i]; | ||||||
| 		name = (*env)->NewString (env, tmp, fnl+4); | 		name = (*env)->NewString (env, tmp, fnl+4); | ||||||
| 		free (tmp); | 		free (tmp); | ||||||
| 	} | 	} | ||||||
| 	/*else  | 	else  | ||||||
| 	{ | 	{ | ||||||
| 		name = (*env)->NewString (env, (jchar*)fnm, fnl); | 		name = (*env)->NewString (env, (jchar*)fnm, fnl); | ||||||
| 	}*/ | 	} | ||||||
|  |  | ||||||
| 	if (name == NULL) | 	if (name == NULL) | ||||||
| 	{ | 	{ | ||||||
| @ -1472,6 +1510,8 @@ static int __handle_bfn ( | |||||||
| 		ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); | 		ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	/* | ||||||
| 	name_utf = (*env)->GetStringUTFChars (env, name, JNI_FALSE); | 	name_utf = (*env)->GetStringUTFChars (env, name, JNI_FALSE); | ||||||
| 	if (name_utf == NULL) | 	if (name_utf == NULL) | ||||||
| 	{ | 	{ | ||||||
| @ -1484,13 +1524,21 @@ static int __handle_bfn ( | |||||||
| 	method = (*env)->GetMethodID ( | 	method = (*env)->GetMethodID ( | ||||||
| 		env, class, name_utf,  | 		env, class, name_utf,  | ||||||
| 		"(J[Ljava/lang/Object;)Ljava/lang/Object;"); | 		"(J[Ljava/lang/Object;)Ljava/lang/Object;"); | ||||||
|  | 	*/ | ||||||
|  | 	class = (*env)->GetObjectClass(env, obj); | ||||||
|  | 	method = (*env)->GetMethodID ( | ||||||
|  | 		env, class, "handleFunction",  | ||||||
|  | 		"(JLjava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;"); | ||||||
|  | 		//"(J[Ljava/lang/Object;)Ljava/lang/Object;"); | ||||||
|  |  | ||||||
| 	(*env)->DeleteLocalRef (env, class); | 	(*env)->DeleteLocalRef (env, class); | ||||||
| 	(*env)->ReleaseStringUTFChars (env, name, name_utf); | 	/*(*env)->ReleaseStringUTFChars (env, name, name_utf);*/ | ||||||
| 	(*env)->DeleteLocalRef (env, name); | 	//(*env)->DeleteLocalRef (env, name); | ||||||
| 	if (method == NULL)  | 	if (method == NULL)  | ||||||
| 	{ | 	{ | ||||||
| 		/* if the method is not found, the exception is thrown. | 		/* if the method is not found, the exception is thrown. | ||||||
| 		 * clear it to prevent it from being thrown */ | 		 * clear it to prevent it from being thrown */ | ||||||
|  | 		(*env)->DeleteLocalRef (env, name); | ||||||
| 		if (is_debug(awk)) (*env)->ExceptionDescribe (env); | 		if (is_debug(awk)) (*env)->ExceptionDescribe (env); | ||||||
| 		(*env)->ExceptionClear (env); | 		(*env)->ExceptionClear (env); | ||||||
| 		ase_awk_setrunerrnum (run, ASE_AWK_EBFNUSER); | 		ase_awk_setrunerrnum (run, ASE_AWK_EBFNUSER); | ||||||
| @ -1501,6 +1549,7 @@ static int __handle_bfn ( | |||||||
| 		env, nargs, run_data->object_class, NULL); | 		env, nargs, run_data->object_class, NULL); | ||||||
| 	if (args == NULL) | 	if (args == NULL) | ||||||
| 	{ | 	{ | ||||||
|  | 		(*env)->DeleteLocalRef (env, name); | ||||||
| 		if (is_debug(awk)) (*env)->ExceptionDescribe (env); | 		if (is_debug(awk)) (*env)->ExceptionDescribe (env); | ||||||
| 		(*env)->ExceptionClear (env); | 		(*env)->ExceptionClear (env); | ||||||
| 		ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); | 		ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); | ||||||
| @ -1543,6 +1592,7 @@ static int __handle_bfn ( | |||||||
| 				if (tmp == NULL) | 				if (tmp == NULL) | ||||||
| 				{ | 				{ | ||||||
| 					(*env)->DeleteLocalRef (env, args); | 					(*env)->DeleteLocalRef (env, args); | ||||||
|  | 					(*env)->DeleteLocalRef (env, name); | ||||||
| 					ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); | 					ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); | ||||||
| 					return -1; | 					return -1; | ||||||
| 				} | 				} | ||||||
| @ -1570,6 +1620,7 @@ static int __handle_bfn ( | |||||||
| 				(*env)->ExceptionClear (env); | 				(*env)->ExceptionClear (env); | ||||||
| 			} | 			} | ||||||
| 			(*env)->DeleteLocalRef (env, args); | 			(*env)->DeleteLocalRef (env, args); | ||||||
|  | 			(*env)->DeleteLocalRef (env, name); | ||||||
| 			ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); | 			ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); | ||||||
| 			return -1; | 			return -1; | ||||||
| 		} | 		} | ||||||
| @ -1578,7 +1629,7 @@ static int __handle_bfn ( | |||||||
| 		if (arg != NULL) (*env)->DeleteLocalRef (env, arg); | 		if (arg != NULL) (*env)->DeleteLocalRef (env, arg); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	ret = (*env)->CallObjectMethod (env, obj, method, (jlong)run, args); | 	ret = (*env)->CallObjectMethod (env, obj, method, (jlong)run, name, args); | ||||||
| 	if ((*env)->ExceptionOccurred (env)) | 	if ((*env)->ExceptionOccurred (env)) | ||||||
| 	{ | 	{ | ||||||
| 		if (is_debug(ase_awk_getrunawk(run)))  | 		if (is_debug(ase_awk_getrunawk(run)))  | ||||||
| @ -1586,12 +1637,14 @@ static int __handle_bfn ( | |||||||
|  |  | ||||||
| 		(*env)->ExceptionClear (env); | 		(*env)->ExceptionClear (env); | ||||||
| 		(*env)->DeleteLocalRef (env, args); | 		(*env)->DeleteLocalRef (env, args); | ||||||
|  | 		(*env)->DeleteLocalRef (env, name); | ||||||
|  |  | ||||||
| 		ase_awk_setrunerrnum (run, ASE_AWK_EBFNIMPL); | 		ase_awk_setrunerrnum (run, ASE_AWK_EBFNIMPL); | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	(*env)->DeleteLocalRef (env, args); | 	(*env)->DeleteLocalRef (env, args); | ||||||
|  | 	(*env)->DeleteLocalRef (env, name); | ||||||
|  |  | ||||||
| 	if (ret == NULL) | 	if (ret == NULL) | ||||||
| 	{ | 	{ | ||||||
| @ -1789,13 +1842,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_addfunc ( | |||||||
|  |  | ||||||
| 		for (x =  0; x < len; x++) tmp[x] = (ase_char_t)ptr[x]; | 		for (x =  0; x < len; x++) tmp[x] = (ase_char_t)ptr[x]; | ||||||
| 		n = (ase_awk_addfunc (awk, tmp, len, 0,  | 		n = (ase_awk_addfunc (awk, tmp, len, 0,  | ||||||
| 			min_args, max_args, ASE_NULL, __handle_bfn) == NULL)? -1: 0; | 			min_args, max_args, ASE_NULL, handle_bfn) == NULL)? -1: 0; | ||||||
| 		free (tmp); | 		free (tmp); | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		n = (ase_awk_addfunc (awk, (ase_char_t*)ptr, len, 0,  | 		n = (ase_awk_addfunc (awk, (ase_char_t*)ptr, len, 0,  | ||||||
| 			min_args, max_args, ASE_NULL, __handle_bfn) == NULL)? -1: 0; | 			min_args, max_args, ASE_NULL, handle_bfn) == NULL)? -1: 0; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
|  | |||||||
| @ -5,20 +5,20 @@ EXPORTS | |||||||
| 	Java_ase_awk_Awk_close | 	Java_ase_awk_Awk_close | ||||||
| 	Java_ase_awk_Awk_parse | 	Java_ase_awk_Awk_parse | ||||||
| 	Java_ase_awk_Awk_run | 	Java_ase_awk_Awk_run | ||||||
|  | 	Java_ase_awk_Awk_stop | ||||||
| 	Java_ase_awk_Awk_getmaxdepth | 	Java_ase_awk_Awk_getmaxdepth | ||||||
| 	Java_ase_awk_Awk_setmaxdepth | 	Java_ase_awk_Awk_setmaxdepth | ||||||
|  |  | ||||||
| 	Java_ase_awk_Awk_getoption | 	Java_ase_awk_Awk_getoption | ||||||
| 	Java_ase_awk_Awk_setoption | 	Java_ase_awk_Awk_setoption | ||||||
|  |  | ||||||
| 	Java_ase_awk_Awk_getdebug | 	Java_ase_awk_Awk_getdebug | ||||||
| 	Java_ase_awk_Awk_setdebug | 	Java_ase_awk_Awk_setdebug | ||||||
|  |  | ||||||
| 	Java_ase_awk_Awk_addfunc | 	Java_ase_awk_Awk_addfunc | ||||||
| 	Java_ase_awk_Awk_delfunc | 	Java_ase_awk_Awk_delfunc | ||||||
| 	Java_ase_awk_Awk_setfilename | 	Java_ase_awk_Awk_setfilename | ||||||
| 	Java_ase_awk_Awk_setofilename | 	Java_ase_awk_Awk_setofilename | ||||||
| 	Java_ase_awk_Awk_strtonum | 	Java_ase_awk_Awk_strtonum | ||||||
| 	Java_ase_awk_Awk_valtostr | 	Java_ase_awk_Awk_valtostr | ||||||
|  | 	Java_ase_awk_Awk_strftime | ||||||
|  | 	Java_ase_awk_Awk_strfgmtime | ||||||
|  | 	Java_ase_awk_Awk_system | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: AseAwk.java,v 1.9 2007/06/24 11:14:58 bacon Exp $ |  * $Id: AseAwk.java,v 1.10 2007/10/12 16:13:34 bacon Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| import java.awt.*; | import java.awt.*; | ||||||
| @ -300,8 +300,7 @@ public class AseAwk extends StdAwk | |||||||
| 		addFunction ("sleep", 1, 1); | 		addFunction ("sleep", 1, 1); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	public Object bfn_sleep ( | 	public Object sleep (Context ctx, String name, Object[] args) throws ase.awk.Exception | ||||||
| 		long runid, Object[] args) throws ase.awk.Exception |  | ||||||
| 	{ | 	{ | ||||||
| 		long x = builtinFunctionArgumentToLong (runid, args[0]); | 		long x = builtinFunctionArgumentToLong (runid, args[0]); | ||||||
| 		try { Thread.sleep (x * 1000); } | 		try { Thread.sleep (x * 1000); } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user