Recovered from cvs revision 2007-10-16 15:30:00

This commit is contained in:
hyung-hwan 2007-10-17 00:30:00 +00:00
parent 861939a9c2
commit b7f520eb43
13 changed files with 259 additions and 210 deletions

9
ase/awk/Argument.java Normal file
View File

@ -0,0 +1,9 @@
/*
* $Id: Argument.java,v 1.1 2007/10/15 16:10:09 bacon Exp $
*/
package ase.awk;
public class Argument
{
}

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.hpp,v 1.76 2007/10/14 16:34:57 bacon Exp $ * $Id: Awk.hpp,v 1.77 2007/10/15 16:10:09 bacon Exp $
* *
* {License} * {License}
*/ */
@ -565,6 +565,28 @@ public:
}; };
// end of enum Option // end of enum Option
enum Global
{
GBL_ARGC = ASE_AWK_GLOBAL_ARGC,
GBL_ARGV = ASE_AWK_GLOBAL_ARGV,
GBL_CONVFMT = ASE_AWK_GLOBAL_CONVFMT,
GBL_ENVIRON = ASE_AWK_GLOBAL_ENVIRON,
GBL_FILENAME = ASE_AWK_GLOBAL_FILENAME,
GBL_FNR = ASE_AWK_GLOBAL_FNR,
GBL_FS = ASE_AWK_GLOBAL_FS,
GBL_IGNORECASE = ASE_AWK_GLOBAL_IGNORECASE,
GBL_NF = ASE_AWK_GLOBAL_NF,
GBL_NR = ASE_AWK_GLOBAL_NR,
GBL_OFILENAME = ASE_AWK_GLOBAL_OFILENAME,
GBL_OFMT = ASE_AWK_GLOBAL_OFMT,
GBL_OFS = ASE_AWK_GLOBAL_OFS,
GBL_ORS = ASE_AWK_GLOBAL_ORS,
GBL_RLENGTH = ASE_AWK_GLOBAL_RLENGTH,
GBL_RS = ASE_AWK_GLOBAL_RS,
GBL_RSTART = ASE_AWK_GLOBAL_RSTART,
GBL_SUBSEP = ASE_AWK_GLOBAL_SUBSEP
};
/** Represents the execution context */ /** Represents the execution context */
class Run class Run
{ {

View File

@ -1,5 +1,5 @@
/* /*
* $Id: Awk.java,v 1.20 2007/10/14 16:34:57 bacon Exp $ * $Id: Awk.java,v 1.21 2007/10/15 16:10:09 bacon Exp $
* *
* {License} * {License}
*/ */
@ -53,11 +53,11 @@ public abstract class Awk
protected final static Writer stdout = protected final static Writer stdout =
new BufferedWriter (new OutputStreamWriter (System.out)); new BufferedWriter (new OutputStreamWriter (System.out));
private long handle; private long awkid;
public Awk () throws Exception public Awk () throws Exception
{ {
this.handle = 0; this.awkid = 0;
this.functionTable = new HashMap (); this.functionTable = new HashMap ();
open (); open ();
} }
@ -65,8 +65,9 @@ public abstract class Awk
/* == just in case == */ /* == just in case == */
protected void finalize () throws Throwable protected void finalize () throws Throwable
{ {
if (handle != 0) close (); if (this.awkid != 0) close ();
super.finalize (); super.finalize ();
} }
/* == native methods == */ /* == native methods == */
@ -152,7 +153,7 @@ public abstract class Awk
} }
protected Object handleFunction ( protected Object handleFunction (
long run, String name, Object args[]) throws java.lang.Exception Context ctx, String name, Object args[]) throws java.lang.Exception
{ {
String mn = (String)functionTable.get(name); String mn = (String)functionTable.get(name);
// name should always be found in this table. // name should always be found in this table.
@ -161,15 +162,12 @@ public abstract class Awk
Class c = this.getClass (); Class c = this.getClass ();
Class[] a = { Context.class, String.class, Object[].class }; Class[] a = { Context.class, String.class, Object[].class };
// TODO: remove new Context ....
Method m = c.getMethod (mn, a); Method m = c.getMethod (mn, a);
return m.invoke (this, return m.invoke (this, /*new Object[] {*/ ctx, name, args/*}*/) ;
new Object[] { new Context(run), name, args}) ;
} }
protected long builtinFunctionArgumentToLong ( protected long builtinFunctionArgumentToLong (
long runid, Object obj) throws Exception Context ctx, Object obj) throws Exception
{ {
long n; long n;
@ -177,7 +175,7 @@ public abstract class Awk
else else
{ {
if (obj instanceof String) if (obj instanceof String)
obj = strtonum (runid, (String)obj); obj = strtonum (ctx.getId(), (String)obj);
if (obj instanceof Long) if (obj instanceof Long)
{ {
@ -206,7 +204,7 @@ public abstract class Awk
} }
protected double builtinFunctionArgumentToDouble ( protected double builtinFunctionArgumentToDouble (
long runid, Object obj) throws Exception Context ctx, Object obj) throws Exception
{ {
double n; double n;
@ -214,7 +212,7 @@ public abstract class Awk
else else
{ {
if (obj instanceof String) if (obj instanceof String)
obj = strtonum (runid, (String)obj); obj = strtonum (ctx.getId(), (String)obj);
if (obj instanceof Long) if (obj instanceof Long)
{ {
@ -243,33 +241,17 @@ public abstract class Awk
} }
protected String builtinFunctionArgumentToString ( protected String builtinFunctionArgumentToString (
long runid, Object obj) throws Exception Context ctx, Object obj) throws Exception
{ {
String str; String str;
if (obj == null) str = ""; if (obj == null) str = "";
else if (obj instanceof String) str = (String)obj; else if (obj instanceof String) str = (String)obj;
else str = valtostr (runid, obj); else str = valtostr (ctx.getId(), obj);
return str; return str;
} }
/* == console name setters == */
protected void setConsoleInputName (
Extio extio, String name) throws Exception
{
/* TODO: setfilename is not safe. for example, it can
* crash the program if runid is invalid. so this wrapper
* needs to do some sanity check. */
setfilename (extio.getRunId(), name);
}
protected void setConsoleOutputName (
Extio extio, String name) throws Exception
{
setofilename (extio.getRunId(), name);
}
/* == depth limiting == */ /* == depth limiting == */
public int getMaxDepth (int id) public int getMaxDepth (int id)
{ {

View File

@ -1,5 +1,7 @@
/* /*
* $Id: Console.java,v 1.2 2007/05/26 10:52:48 bacon Exp $ * $Id: Console.java,v 1.3 2007/10/15 16:10:09 bacon Exp $
*
* {License}
*/ */
package ase.awk; package ase.awk;

View File

@ -1,22 +1,30 @@
/* /*
* $Id: Context.java,v 1.3 2007/10/14 16:34:57 bacon Exp $ * $Id: Context.java,v 1.4 2007/10/15 16:10:10 bacon Exp $
*/ */
package ase.awk; package ase.awk;
public class Context public class Context
{ {
private long handle; private Awk awk;
private long runid;
private Object custom; private Object custom;
Context (long handle) Context (Awk awk)
{ {
this.handle = handle; this.awk = awk;
this.runid = 0;
this.custom = null;
}
public Awk getAwk ()
{
return awk;
} }
public long getId () public long getId ()
{ {
return this.handle; return this.runid;
} }
public void setCustom (Object custom) public void setCustom (Object custom)
@ -28,4 +36,20 @@ public class Context
{ {
return this.custom; return this.custom;
} }
public void setConsoleInputName (String name) throws Exception
{
awk.setfilename (this.runid, name);
}
public void setConsoleOutputName (String name) throws Exception
{
awk.setofilename (this.runid, name);
}
// TODO:
// setGlobal
// getGlobal
// setError
// getError
} }

9
ase/awk/Return.java Normal file
View File

@ -0,0 +1,9 @@
/*
* $Id: Return.java,v 1.1 2007/10/15 16:10:10 bacon Exp $
*/
package ase.awk;
public class Return
{
}

View File

@ -1,5 +1,5 @@
/* /*
* $Id: StdAwk.java,v 1.14 2007/10/14 05:28:26 bacon Exp $ * $Id: StdAwk.java,v 1.15 2007/10/15 16:10:10 bacon Exp $
* *
* {License} * {License}
*/ */
@ -333,56 +333,56 @@ public abstract class StdAwk extends Awk
/* == arithmetic built-in functions */ /* == arithmetic built-in functions */
public Object sin (Context ctx, String name, Object[] args) throws Exception public Object sin (Context ctx, String name, Object[] args) throws Exception
{ {
double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); double x = builtinFunctionArgumentToDouble (ctx, args[0]);
return new Double (Math.sin(x)); return new Double (Math.sin(x));
} }
public Object cos (Context ctx, String name, Object[] args) throws Exception public Object cos (Context ctx, String name, Object[] args) throws Exception
{ {
double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); double x = builtinFunctionArgumentToDouble (ctx, args[0]);
return new Double (Math.cos(x)); return new Double (Math.cos(x));
} }
public Object tan (Context ctx, String name, Object[] args) throws Exception public Object tan (Context ctx, String name, Object[] args) throws Exception
{ {
double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); double x = builtinFunctionArgumentToDouble (ctx, args[0]);
return new Double (Math.tan(x)); return new Double (Math.tan(x));
} }
public Object atan (Context ctx, String name, Object[] args) throws Exception public Object atan (Context ctx, String name, Object[] args) throws Exception
{ {
double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); double x = builtinFunctionArgumentToDouble (ctx, args[0]);
return new Double (Math.atan(x)); return new Double (Math.atan(x));
} }
public Object atan2 (Context ctx, String name, Object[] args) throws Exception public Object atan2 (Context ctx, String name, Object[] args) throws Exception
{ {
double y = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); double y = builtinFunctionArgumentToDouble (ctx, args[0]);
double x = builtinFunctionArgumentToDouble (ctx.getId(), args[1]); double x = builtinFunctionArgumentToDouble (ctx, args[1]);
return new Double (Math.atan2(y,x)); return new Double (Math.atan2(y,x));
} }
public Object log (Context ctx, String name, Object[] args) throws Exception public Object log (Context ctx, String name, Object[] args) throws Exception
{ {
double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); double x = builtinFunctionArgumentToDouble (ctx, args[0]);
return new Double (Math.log(x)); return new Double (Math.log(x));
} }
public Object exp (Context ctx, String name, Object[] args) throws Exception public Object exp (Context ctx, String name, Object[] args) throws Exception
{ {
double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); double x = builtinFunctionArgumentToDouble (ctx, args[0]);
return new Double (Math.exp(x)); return new Double (Math.exp(x));
} }
public Object sqrt (Context ctx, String name, Object[] args) throws Exception public Object sqrt (Context ctx, String name, Object[] args) throws Exception
{ {
double x = builtinFunctionArgumentToDouble (ctx.getId(), args[0]); double x = builtinFunctionArgumentToDouble (ctx, args[0]);
return new Double (Math.sqrt(x)); return new Double (Math.sqrt(x));
} }
public Object bfnint (Context ctx, String name, Object[] args) throws Exception public Object bfnint (Context ctx, String name, Object[] args) throws Exception
{ {
long x = builtinFunctionArgumentToLong (ctx.getId(), args[0]); long x = builtinFunctionArgumentToLong (ctx, args[0]);
return new Long (x); return new Long (x);
} }
@ -397,7 +397,7 @@ public abstract class StdAwk extends Awk
seed = (args == null || args.length == 0)? seed = (args == null || args.length == 0)?
System.currentTimeMillis (): System.currentTimeMillis ():
builtinFunctionArgumentToLong (ctx.getId(), args[0]); builtinFunctionArgumentToLong (ctx, args[0]);
random.setSeed (seed); random.setSeed (seed);
return new Long (prev_seed); return new Long (prev_seed);
@ -411,22 +411,22 @@ public abstract class StdAwk extends Awk
public Object strftime (Context ctx, String name, Object[] args) throws Exception public Object strftime (Context ctx, String name, Object[] args) throws Exception
{ {
String fmt = (args.length<1)? "%c": builtinFunctionArgumentToString (ctx.getId(), args[0]); String fmt = (args.length<1)? "%c": builtinFunctionArgumentToString (ctx, args[0]);
long t = (args.length<2)? (System.currentTimeMillis()/1000): builtinFunctionArgumentToLong (ctx.getId(), args[1]); long t = (args.length<2)? (System.currentTimeMillis()/1000): builtinFunctionArgumentToLong (ctx, args[1]);
return strftime (fmt, t); return strftime (fmt, t);
} }
public Object strfgmtime (Context ctx, String name, Object[] args) throws Exception public Object strfgmtime (Context ctx, String name, Object[] args) throws Exception
{ {
String fmt = (args.length<1)? "%c": builtinFunctionArgumentToString (ctx.getId(), args[0]); String fmt = (args.length<1)? "%c": builtinFunctionArgumentToString (ctx, args[0]);
long t = (args.length<2)? (System.currentTimeMillis()/1000): builtinFunctionArgumentToLong (ctx.getId(), args[1]); long t = (args.length<2)? (System.currentTimeMillis()/1000): builtinFunctionArgumentToLong (ctx, args[1]);
return strfgmtime (fmt, t); return strfgmtime (fmt, t);
} }
/* miscellaneous built-in functions */ /* miscellaneous built-in functions */
public Object system (Context ctx, String name, Object[] args) throws Exception public Object system (Context ctx, String name, Object[] args) throws Exception
{ {
String str = builtinFunctionArgumentToString (ctx.getId(), args[0]); String str = builtinFunctionArgumentToString (ctx, args[0]);
return system (str); return system (str);
} }

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.h,v 1.19 2007/10/10 13:22:12 bacon Exp $ * $Id: awk.h,v 1.20 2007/10/15 16:10:10 bacon Exp $
* *
* {License} * {License}
*/ */
@ -379,7 +379,7 @@ enum ase_awk_extio_type_t
ASE_AWK_EXTIO_NUM ASE_AWK_EXTIO_NUM
}; };
enum enum ase_awk_extio_mode_t
{ {
ASE_AWK_EXTIO_PIPE_READ = 0, ASE_AWK_EXTIO_PIPE_READ = 0,
ASE_AWK_EXTIO_PIPE_WRITE = 1, ASE_AWK_EXTIO_PIPE_WRITE = 1,
@ -398,6 +398,38 @@ enum
ASE_AWK_EXTIO_CONSOLE_WRITE = 1 ASE_AWK_EXTIO_CONSOLE_WRITE = 1
}; };
enum ase_awk_global_id_t
{
/* this table should match gtab in parse.c.
* in addition, ase_awk_setglobal also counts
* on the order of these values */
ASE_AWK_GLOBAL_ARGC,
ASE_AWK_GLOBAL_ARGV,
ASE_AWK_GLOBAL_CONVFMT,
ASE_AWK_GLOBAL_ENVIRON,
ASE_AWK_GLOBAL_FILENAME,
ASE_AWK_GLOBAL_FNR,
ASE_AWK_GLOBAL_FS,
ASE_AWK_GLOBAL_IGNORECASE,
ASE_AWK_GLOBAL_NF,
ASE_AWK_GLOBAL_NR,
ASE_AWK_GLOBAL_OFILENAME,
ASE_AWK_GLOBAL_OFMT,
ASE_AWK_GLOBAL_OFS,
ASE_AWK_GLOBAL_ORS,
ASE_AWK_GLOBAL_RLENGTH,
ASE_AWK_GLOBAL_RS,
ASE_AWK_GLOBAL_RSTART,
ASE_AWK_GLOBAL_SUBSEP,
/* these are not not the actual IDs and are used internally only
* Make sure you update these values properly if you add more
* ID definitions, however */
ASE_AWK_MIN_GLOBAL_ID = ASE_AWK_GLOBAL_ARGC,
ASE_AWK_MAX_GLOBAL_ID = ASE_AWK_GLOBAL_SUBSEP
};
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif

View File

@ -1,5 +1,5 @@
/* /*
* $Id: jni.c,v 1.24 2007/10/14 16:34:57 bacon Exp $ * $Id: jni.c,v 1.25 2007/10/15 16:10:10 bacon Exp $
* *
* {License} * {License}
*/ */
@ -39,7 +39,8 @@
#define CLASS_EXCEPTION "ase/awk/Exception" #define CLASS_EXCEPTION "ase/awk/Exception"
#define CLASS_EXTIO "ase/awk/Extio" #define CLASS_EXTIO "ase/awk/Extio"
#define CLASS_CONTEXT "ase/awk/Context" #define CLASS_CONTEXT "ase/awk/Context"
#define FIELD_HANDLE "handle" #define FIELD_AWKID "awkid"
#define FIELD_RUNID "runid"
#if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER>=1400) #if defined(_WIN32) && defined(_MSC_VER) && (_MSC_VER>=1400)
#pragma warning(disable:4996) #pragma warning(disable:4996)
@ -100,18 +101,22 @@ struct run_data_t
jclass float_class; jclass float_class;
jclass double_class; jclass double_class;
jclass object_class; jclass object_class;
jclass context_class;
jmethodID integer_init; jmethodID integer_init;
jmethodID long_init; jmethodID long_init;
jmethodID short_init; jmethodID short_init;
jmethodID float_init; jmethodID float_init;
jmethodID double_init; jmethodID double_init;
jmethodID context_init;
jmethodID integer_value; jmethodID integer_value;
jmethodID long_value; jmethodID long_value;
jmethodID short_value; jmethodID short_value;
jmethodID float_value; jmethodID float_value;
jmethodID double_value; jmethodID double_value;
jobject context_object;
}; };
static void* awk_malloc (void* custom, ase_size_t n) static void* awk_malloc (void* custom, ase_size_t n)
@ -449,14 +454,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_open (JNIEnv* env, jobject obj)
} }
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
ase_awk_close (awk); ase_awk_close (awk);
#if defined(_WIN32) && defined(__DMC__) #if defined(_WIN32) && defined(__DMC__)
awk_free (heap, awk_data); awk_free (heap, awk_data);
@ -487,7 +491,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_open (JNIEnv* env, jobject obj)
JNIEXPORT void JNICALL Java_ase_awk_Awk_close (JNIEnv* env, jobject obj) JNIEXPORT void JNICALL Java_ase_awk_Awk_close (JNIEnv* env, jobject obj)
{ {
jclass class; jclass class;
jfieldID handle; jfieldID awkid;
ase_awk_t* awk; ase_awk_t* awk;
#if defined(_WIN32) && defined(_DEBUG) #if defined(_WIN32) && defined(_DEBUG)
@ -495,26 +499,26 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_close (JNIEnv* env, jobject obj)
#endif #endif
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); awkid = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (awkid == NULL)
{ {
/* internal error. no handle field /* internal error. no awkid field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return; return;
} }
awk = (ase_awk_t*) (*env)->GetLongField (env, obj, handle); awk = (ase_awk_t*) (*env)->GetLongField (env, obj, awkid);
if (awk != NULL) if (awk != NULL)
{ {
/* the handle is not NULL. close it */ /* the awkid is not NULL. close it */
awk_data_t* tmp = (awk_data_t*)ase_awk_getcustomdata (awk); awk_data_t* tmp = (awk_data_t*)ase_awk_getcustomdata (awk);
#if defined(_WIN32) && defined(__DMC__) #if defined(_WIN32) && defined(__DMC__)
HANDLE heap = tmp->heap; HANDLE heap = tmp->heap;
#endif #endif
ase_awk_close (awk); ase_awk_close (awk);
(*env)->SetLongField (env, obj, handle, (jlong)0); (*env)->SetLongField (env, obj, awkid, (jlong)0);
#if defined(_WIN32) && defined(__DMC__) #if defined(_WIN32) && defined(__DMC__)
awk_free (heap, tmp); awk_free (heap, tmp);
@ -543,13 +547,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_parse (JNIEnv* env, jobject obj)
srcio_data_t srcio_data; srcio_data_t srcio_data;
class = (*env)->GetObjectClass (env, obj); class = (*env)->GetObjectClass (env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return; return;
} }
@ -582,6 +586,9 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_parse (JNIEnv* env, jobject obj)
(*env)->DeleteLocalRef (env, run_data.double_class); \ (*env)->DeleteLocalRef (env, run_data.double_class); \
(*env)->DeleteLocalRef (env, run_data.string_class); \ (*env)->DeleteLocalRef (env, run_data.string_class); \
(*env)->DeleteLocalRef (env, run_data.object_class); \ (*env)->DeleteLocalRef (env, run_data.object_class); \
(*env)->DeleteLocalRef (env, run_data.context_class); \
if (run_data.context_object != NULL) \
(*env)->DeleteLocalRef (env, run_data.context_object); \
} while (0) } while (0)
static ase_char_t* java_strxdup (ase_awk_t* awk, const jchar* str, jint len) static ase_char_t* java_strxdup (ase_awk_t* awk, const jchar* str, jint len)
@ -611,69 +618,37 @@ static ase_char_t* java_strxdup (ase_awk_t* awk, const jchar* str, jint len)
} }
} }
#if 0
static void xxx (JNIEnv* env, jobject obj, ase_awk_run_t* run)
{
jclass ctx_class;
jmethodID ctx_cons;
jobject ctx_object;
/* look for extio class */
ctx_class = (*env)->FindClass (env, CLASS_CONTEXT);
if (ctx_class == NULL)
{
if (is_debug(awk)) (*env)->ExceptionDescribe (env);
(*env)->ExceptionClear (env);
return -1;
}
/* get the constructor */
ctx_cons = (*env)->GetMethodID (
env, ctx_class, "<init>", "(J)V");
if (ctx_cons == NULL)
{
if (is_debug(awk)) (*env)->ExceptionDescribe (env);
(*env)->ExceptionClear (env);
(*env)->DeleteLocalRef (env, extio_class);
return -1;
}
/* construct the extio object */
ctx_object = (*env)->NewObject (env, ctx_class, ctx_cons, (jlong)run)
(*env)->DeleteLocalRef (env, ctx_class);
if (ctx_object == NULL)
{
if (is_debug(awk)) (*env)->ExceptionDescribe (env);
(*env)->ExceptionClear (env);
return -1;
}
if (ret >= 0)
{
/* ret == -1 failed to open the stream
* ret == 0 opened the stream and reached its end
* ret == 1 opened the stream. */
extio->handle = (*env)->NewGlobalRef (env, extio_object);
/*
if (extio->handle == NULL)
{
// TODO: close the stream ...
if (is_debug(awk)) (*env)->ExceptionDescribe (env);
(*env)->ExceptionClear (env);
ret = -1;
}
*/
}
(*env)->DeleteLocalRef (env, extio_object);
return ret;
}
#endif
static void on_run_start (ase_awk_run_t* run, void* custom) static void on_run_start (ase_awk_run_t* run, void* custom)
{ {
// TODO: run_data_t* run_data;
//custom->context->setHandle (run); JNIEnv* env;
jobject obj;
jfieldID runid;
run_data = (run_data_t*)ase_awk_getruncustomdata (run);
env = run_data->env;
obj = run_data->obj;
runid = (*env)->GetFieldID (env, run_data->context_class, FIELD_RUNID, "J");
(*env)->SetLongField (env, run_data->context_object, runid, (jlong)run);
}
static void on_run_end (ase_awk_run_t* run, int errnum, void* custom)
{
run_data_t* run_data;
JNIEnv* env;
jobject obj;
jfieldID runid;
run_data = (run_data_t*)ase_awk_getruncustomdata (run);
env = run_data->env;
obj = run_data->obj;
/* runid field is not valid any more */
runid = (*env)->GetFieldID (env, run_data->context_class, FIELD_RUNID, "J");
(*env)->SetLongField (env, run_data->context_object, runid, (jlong)0);
} }
JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jstring mfn, jobjectArray args) JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jstring mfn, jobjectArray args)
@ -694,13 +669,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jstring m
ase_awk_runarg_t* runarg = NULL; ase_awk_runarg_t* runarg = NULL;
class = (*env)->GetObjectClass (env, obj); class = (*env)->GetObjectClass (env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == 0) if (handle == 0)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return; return;
} }
@ -717,6 +692,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jstring m
run_data.float_class = (*env)->FindClass (env, "java/lang/Float"); run_data.float_class = (*env)->FindClass (env, "java/lang/Float");
run_data.double_class = (*env)->FindClass (env, "java/lang/Double"); run_data.double_class = (*env)->FindClass (env, "java/lang/Double");
run_data.object_class = (*env)->FindClass (env, "java/lang/Object"); run_data.object_class = (*env)->FindClass (env, "java/lang/Object");
run_data.context_class = (*env)->FindClass (env, CLASS_CONTEXT);
ASE_ASSERT (run_data.string_class != NULL); ASE_ASSERT (run_data.string_class != NULL);
ASE_ASSERT (run_data.integer_class != NULL); ASE_ASSERT (run_data.integer_class != NULL);
@ -725,6 +701,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jstring m
ASE_ASSERT (run_data.float_class != NULL); ASE_ASSERT (run_data.float_class != NULL);
ASE_ASSERT (run_data.double_class != NULL); ASE_ASSERT (run_data.double_class != NULL);
ASE_ASSERT (run_data.object_class != NULL); ASE_ASSERT (run_data.object_class != NULL);
ASE_ASSERT (run_data.context_class != NULL);
run_data.integer_init = (*env)->GetMethodID ( run_data.integer_init = (*env)->GetMethodID (
env, run_data.integer_class, "<init>", "(I)V"); env, run_data.integer_class, "<init>", "(I)V");
@ -736,12 +713,15 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jstring m
env, run_data.float_class, "<init>", "(F)V"); env, run_data.float_class, "<init>", "(F)V");
run_data.double_init = (*env)->GetMethodID ( run_data.double_init = (*env)->GetMethodID (
env, run_data.double_class, "<init>", "(D)V"); env, run_data.double_class, "<init>", "(D)V");
run_data.context_init = (*env)->GetMethodID (
env, run_data.context_class, "<init>", "(Lase/awk/Awk;)V");
ASE_ASSERT (run_data.integer_init != NULL); ASE_ASSERT (run_data.integer_init != NULL);
ASE_ASSERT (run_data.long_init != NULL); ASE_ASSERT (run_data.long_init != NULL);
ASE_ASSERT (run_data.short_init != NULL); ASE_ASSERT (run_data.short_init != NULL);
ASE_ASSERT (run_data.float_init != NULL); ASE_ASSERT (run_data.float_init != NULL);
ASE_ASSERT (run_data.double_init != NULL); ASE_ASSERT (run_data.double_init != NULL);
ASE_ASSERT (run_data.context_init != NULL);
run_data.integer_value = (*env)->GetMethodID ( run_data.integer_value = (*env)->GetMethodID (
env, run_data.integer_class, "intValue", "()I"); env, run_data.integer_class, "intValue", "()I");
@ -765,6 +745,23 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jstring m
ASE_ASSERTX (run_data.double_value != NULL, ASE_ASSERTX (run_data.double_value != NULL,
"The Double class must has the method - double doubleValue()"); "The Double class must has the method - double doubleValue()");
/* No NewGlobalRef are needed on obj and run_data->context_object
* because they are valid while this run method runs */
run_data.context_object = (*env)->NewObject (
env, run_data.context_class, run_data.context_init, obj);
if (run_data.context_object == NULL)
{
if (is_debug(awk)) (*env)->ExceptionDescribe (env);
(*env)->ExceptionClear (env);
DELETE_CLASS_REFS (env, run_data);
throw_exception (
env,
ase_awk_geterrstr(ASE_NULL, ASE_AWK_ENOMEM),
ASE_AWK_ENOMEM,
0);
return;
}
runio_data.env = env; runio_data.env = env;
runio_data.obj = obj; runio_data.obj = obj;
@ -776,6 +773,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jstring m
ase_memset (&runcbs, 0, ASE_SIZEOF(runcbs)); ase_memset (&runcbs, 0, ASE_SIZEOF(runcbs));
runcbs.on_start = on_run_start; runcbs.on_start = on_run_start;
runcbs.on_end = on_run_end;
runcbs.custom_data = NULL; runcbs.custom_data = NULL;
if (mfn == NULL) if (mfn == NULL)
@ -786,7 +784,6 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jstring m
else else
{ {
/* process the main entry point */ /* process the main entry point */
len = (*env)->GetStringLength (env, mfn); len = (*env)->GetStringLength (env, mfn);
if (len > 0) if (len > 0)
@ -965,13 +962,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_stop (JNIEnv* env, jobject obj)
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return; return;
} }
@ -988,7 +985,7 @@ static ase_ssize_t java_open_source (JNIEnv* env, jobject obj, int mode)
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
mid = (*env)->GetMethodID (env, class, "openSource", "(I)I"); mid = (*env)->GetMethodID (env, class, "openSource", "(I)I");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
@ -1025,7 +1022,7 @@ static ase_ssize_t java_close_source (JNIEnv* env, jobject obj, int mode)
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
mid = (*env)->GetMethodID (env, class, "closeSource", "(I)I"); mid = (*env)->GetMethodID (env, class, "closeSource", "(I)I");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
@ -1065,7 +1062,7 @@ static ase_ssize_t java_read_source (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
mid = (*env)->GetMethodID (env, class, "readSource", "([CI)I"); mid = (*env)->GetMethodID (env, class, "readSource", "([CI)I");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
@ -1119,7 +1116,7 @@ static ase_ssize_t java_write_source (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
mid = (*env)->GetMethodID (env, class, "writeSource", "([CI)I"); mid = (*env)->GetMethodID (env, class, "writeSource", "([CI)I");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
@ -1176,7 +1173,7 @@ static ase_ssize_t java_open_extio (
/* get the method - meth */ /* get the method - meth */
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;)I"); mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;)I");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
@ -1299,7 +1296,7 @@ static ase_ssize_t java_close_extio (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;)I"); mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;)I");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
@ -1348,7 +1345,7 @@ static ase_ssize_t java_read_extio (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;[CI)I"); mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;[CI)I");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
@ -1407,7 +1404,7 @@ static ase_ssize_t java_write_extio (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;[CI)I"); mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;[CI)I");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
@ -1459,7 +1456,7 @@ static ase_ssize_t java_flush_extio (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;)I"); mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;)I");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
@ -1496,7 +1493,7 @@ static ase_ssize_t java_next_extio (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;)I"); mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;)I");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
@ -1690,7 +1687,7 @@ static int handle_bfn (
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
method = (*env)->GetMethodID ( method = (*env)->GetMethodID (
env, class, "handleFunction", env, class, "handleFunction",
"(JLjava/lang/String;[Ljava/lang/Object;)Ljava/lang/Object;"); "(Lase/awk/Context;Ljava/lang/String;[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);*/
@ -1790,7 +1787,8 @@ 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, name, args); ret = (*env)->CallObjectMethod (
env, obj, method, run_data->context_object, name, args);
if ((*env)->ExceptionOccurred (env)) if ((*env)->ExceptionOccurred (env))
{ {
if (is_debug(ase_awk_getrunawk(run))) if (is_debug(ase_awk_getrunawk(run)))
@ -1961,13 +1959,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_addfunc (
jsize len; jsize len;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return; return;
} }
@ -2039,13 +2037,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_delfunc (
jsize len; jsize len;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return; return;
} }
@ -2109,7 +2107,7 @@ JNIEXPORT jint JNICALL Java_ase_awk_Awk_getmaxdepth (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) return 0; /* should never happen */ if (handle == NULL) return 0; /* should never happen */
@ -2125,13 +2123,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_setmaxdepth (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return; return;
} }
@ -2147,13 +2145,13 @@ JNIEXPORT jint JNICALL Java_ase_awk_Awk_getoption (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return 0; return 0;
} }
@ -2169,13 +2167,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_setoption (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return; return;
} }
@ -2191,13 +2189,13 @@ JNIEXPORT jboolean JNICALL Java_ase_awk_Awk_getdebug (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return JNI_FALSE; return JNI_FALSE;
} }
@ -2213,13 +2211,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_setdebug (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return; return;
} }
@ -2239,13 +2237,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_setword (
jint r; jint r;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return; return;
} }
@ -2655,7 +2653,6 @@ JNIEXPORT jstring JNICALL Java_ase_awk_Awk_valtostr (
if (str == NULL) if (str == NULL)
{ {
throw_exception ( throw_exception (
env, env,
ase_awk_geterrstr(ASE_NULL, ASE_AWK_ENOMEM), ase_awk_geterrstr(ASE_NULL, ASE_AWK_ENOMEM),
@ -2718,13 +2715,13 @@ static jstring JNICALL call_strftime (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return NULL; return NULL;
} }
awk = (ase_awk_t*) (*env)->GetLongField (env, obj, handle); awk = (ase_awk_t*) (*env)->GetLongField (env, obj, handle);
@ -2843,13 +2840,13 @@ JNIEXPORT jint JNICALL Java_ase_awk_Awk_system (
ase_awk_t* awk; ase_awk_t* awk;
class = (*env)->GetObjectClass(env, obj); class = (*env)->GetObjectClass(env, obj);
handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J"); handle = (*env)->GetFieldID (env, class, FIELD_AWKID, "J");
(*env)->DeleteLocalRef (env, class); (*env)->DeleteLocalRef (env, class);
if (handle == NULL) if (handle == NULL)
{ {
/* internal error. no handle field /* internal error. no handle field
* NoSuchFieldError, ExceptionInitializerError, * NoSuchFieldError, ExceptionInitializerError,
* OutOfMemoryError might occur */ * OutOfMemoryError might have occurred */
return -1; return -1;
} }
awk = (ase_awk_t*) (*env)->GetLongField (env, obj, handle); awk = (ase_awk_t*) (*env)->GetLongField (env, obj, handle);

View File

@ -1,5 +1,5 @@
# #
# $Id: makefile.in,v 1.9 2007/10/13 06:28:17 bacon Exp $ # $Id: makefile.in,v 1.10 2007/10/15 16:15:42 bacon Exp $
# #
NAME = aseawk NAME = aseawk
@ -60,6 +60,7 @@ OBJ_FILES_SO = $(OBJ_FILES_LIB:.o=.lo) $(OBJ_FILES_JNI:.o=.lo)
OBJ_FILES_JAR = \ OBJ_FILES_JAR = \
$(TMP_DIR)/ase/awk/Awk.class \ $(TMP_DIR)/ase/awk/Awk.class \
$(TMP_DIR)/ase/awk/StdAwk.class \ $(TMP_DIR)/ase/awk/StdAwk.class \
$(TMP_DIR)/ase/awk/Context.class \
$(TMP_DIR)/ase/awk/Extio.class \ $(TMP_DIR)/ase/awk/Extio.class \
$(TMP_DIR)/ase/awk/IO.class \ $(TMP_DIR)/ase/awk/IO.class \
$(TMP_DIR)/ase/awk/Console.class \ $(TMP_DIR)/ase/awk/Console.class \
@ -133,6 +134,9 @@ $(TMP_DIR)/ase/awk/Awk.class: Awk.java
$(TMP_DIR)/ase/awk/StdAwk.class: StdAwk.java $(TMP_DIR)/ase/awk/StdAwk.class: StdAwk.java
$(JAVAC) -classpath ../.. -d $(TMP_DIR) StdAwk.java $(JAVAC) -classpath ../.. -d $(TMP_DIR) StdAwk.java
$(TMP_DIR)/ase/awk/Context.class: Context.java
$(JAVAC) -classpath ../.. -d $(TMP_DIR) Context.java
$(TMP_DIR)/ase/awk/Extio.class: Extio.java $(TMP_DIR)/ase/awk/Extio.class: Extio.java
$(JAVAC) -classpath ../.. -d $(TMP_DIR) Extio.java $(JAVAC) -classpath ../.. -d $(TMP_DIR) Extio.java

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.h,v 1.6 2007/09/24 08:21:25 bacon Exp $ * $Id: run.h,v 1.7 2007/10/15 16:10:10 bacon Exp $
* *
* {License} * {License}
*/ */
@ -77,38 +77,6 @@ enum ase_awk_incop_type_t
ASE_AWK_INCOP_MINUS ASE_AWK_INCOP_MINUS
}; };
enum ase_awk_global_id_t
{
/* this table should match gtab in parse.c.
* in addition, ase_awk_setglobal also counts
* on the order of these values */
ASE_AWK_GLOBAL_ARGC,
ASE_AWK_GLOBAL_ARGV,
ASE_AWK_GLOBAL_CONVFMT,
ASE_AWK_GLOBAL_ENVIRON,
ASE_AWK_GLOBAL_FILENAME,
ASE_AWK_GLOBAL_FNR,
ASE_AWK_GLOBAL_FS,
ASE_AWK_GLOBAL_IGNORECASE,
ASE_AWK_GLOBAL_NF,
ASE_AWK_GLOBAL_NR,
ASE_AWK_GLOBAL_OFILENAME,
ASE_AWK_GLOBAL_OFMT,
ASE_AWK_GLOBAL_OFS,
ASE_AWK_GLOBAL_ORS,
ASE_AWK_GLOBAL_RLENGTH,
ASE_AWK_GLOBAL_RS,
ASE_AWK_GLOBAL_RSTART,
ASE_AWK_GLOBAL_SUBSEP,
/* these are not not the actual IDs and are used internally only
* Make sure you update these values properly if you add more
* ID definitions, however */
ASE_AWK_MIN_GLOBAL_ID = ASE_AWK_GLOBAL_ARGC,
ASE_AWK_MAX_GLOBAL_ID = ASE_AWK_GLOBAL_SUBSEP
};
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif

View File

@ -1,5 +1,5 @@
/* /*
* $Id: AseAwk.java,v 1.11 2007/10/13 17:25:30 bacon Exp $ * $Id: AseAwk.java,v 1.12 2007/10/15 16:10:10 bacon Exp $
*/ */
import java.awt.*; import java.awt.*;
@ -303,7 +303,7 @@ public class AseAwk extends StdAwk
public Object sleep (Context ctx, String name, Object[] args) throws ase.awk.Exception public Object sleep (Context ctx, String name, Object[] args) throws ase.awk.Exception
{ {
long x = builtinFunctionArgumentToLong (ctx.getId(), args[0]); long x = builtinFunctionArgumentToLong (ctx, args[0]);
try { Thread.sleep (x * 1000); } try { Thread.sleep (x * 1000); }
catch (InterruptedException e) {} catch (InterruptedException e) {}
return new Long(0); return new Long(0);

View File

@ -1,5 +1,5 @@
/* /*
* $Id: AseAwkPanel.java,v 1.3 2007/10/14 05:28:26 bacon Exp $ * $Id: AseAwkPanel.java,v 1.4 2007/10/15 16:10:10 bacon Exp $
*/ */
import java.awt.*; import java.awt.*;
@ -94,7 +94,7 @@ public class AseAwkPanel extends Panel
public Object sleep (Context ctx, String name, Object[] args) throws ase.awk.Exception public Object sleep (Context ctx, String name, Object[] args) throws ase.awk.Exception
{ {
long x = builtinFunctionArgumentToLong (ctx.getId(), args[0]); long x = builtinFunctionArgumentToLong (ctx, args[0]);
try { Thread.sleep (x * 1000); } try { Thread.sleep (x * 1000); }
catch (InterruptedException e) {} catch (InterruptedException e) {}
return new Long(0); return new Long(0);