diff --git a/ase/awk/Awk.java b/ase/awk/Awk.java index cf72221a..59391c41 100644 --- a/ase/awk/Awk.java +++ b/ase/awk/Awk.java @@ -1,5 +1,5 @@ /* - * $Id: Awk.java,v 1.10 2007/05/26 10:52:48 bacon Exp $ + * $Id: Awk.java,v 1.11 2007/06/24 11:14:58 bacon Exp $ * * {License} */ @@ -75,6 +75,8 @@ public abstract class Awk private native boolean getdebug (); private native void setdebug (boolean debug); + private native void setword (String ow, String nw); + private native void addbfn ( String name, int min_args, int max_args) throws Exception; private native void delbfn (String name) throws Exception; @@ -256,6 +258,11 @@ public abstract class Awk setdebug (debug); } + public void setWord (String ow, String nw) + { + setword (ow, nw); + } + /* == source code management == */ protected abstract int openSource (int mode); protected abstract int closeSource (int mode); diff --git a/ase/awk/jni.c b/ase/awk/jni.c index de2ecc40..78008cba 100644 --- a/ase/awk/jni.c +++ b/ase/awk/jni.c @@ -1,5 +1,5 @@ /* - * $Id: jni.c,v 1.10 2007/05/25 14:41:48 bacon Exp $ + * $Id: jni.c,v 1.11 2007/06/24 11:14:58 bacon Exp $ * * {License} */ @@ -2009,6 +2009,119 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_setdebug ( ((awk_data_t*)ase_awk_getcustomdata(awk))->debug = debug; } +JNIEXPORT void JNICALL Java_ase_awk_Awk_setword ( + JNIEnv* env, jobject obj, jstring ow, jstring nw) +{ + jclass class; + jfieldID handle; + ase_awk_t* awk; + const jchar* op, * np; + jsize ol, nl; + ase_char_t* ox, * nx; + jint r; + + 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); + + ol = (*env)->GetStringLength (env, ow); + op = (*env)->GetStringChars (env, ow, JNI_FALSE); + if (op == NULL) + { + (*env)->ExceptionClear (env); + throw_exception ( + env, + ase_awk_geterrstr(ASE_NULL, ASE_AWK_ENOMEM), + ASE_AWK_ENOMEM, + 0); + return; + } + + nl = (*env)->GetStringLength (env, nw); + np = (*env)->GetStringChars (env, nw, JNI_FALSE); + if (np == NULL) + { + (*env)->ReleaseStringChars (env, ow, op); + (*env)->ExceptionClear (env); + throw_exception ( + env, + ase_awk_geterrstr(ASE_NULL, ASE_AWK_ENOMEM), + ASE_AWK_ENOMEM, + 0); + return; + } + + if (ol > 0 && ASE_SIZEOF(jchar) != ASE_SIZEOF(ase_char_t)) + { + ase_size_t i; + ox = (ase_char_t*)malloc (ASE_SIZEOF(ase_char_t)*ol); + if (ox == ASE_NULL) + { + (*env)->ReleaseStringChars (env, nw, np); + (*env)->ReleaseStringChars (env, ow, op); + + throw_exception ( + env, + ase_awk_geterrstr(ASE_NULL, ASE_AWK_ENOMEM), + ASE_AWK_ENOMEM, + 0); + return; + } + + for (i = 0; i < ol; i++) ox[i] = (ase_char_t)op[i]; + } + else ox = (ase_char_t*)op; + + if (nl > 0 && ASE_SIZEOF(jchar) != ASE_SIZEOF(ase_char_t)) + { + ase_size_t i; + nx = (ase_char_t*) malloc (ASE_SIZEOF(ase_char_t)*nl); + if (nx == ASE_NULL) + { + if (ox != (ase_char_t*)op) free (ox); + + (*env)->ReleaseStringChars (env, nw, np); + (*env)->ReleaseStringChars (env, ow, op); + + throw_exception ( + env, + ase_awk_geterrstr(ASE_NULL, ASE_AWK_ENOMEM), + ASE_AWK_ENOMEM, + 0); + return; + } + + for (i = 0; i < nl; i++) nx[i] = (ase_char_t)np[i]; + } + else nx = (ase_char_t*)np; + + r = ase_awk_setword (awk, ox, ol, nx, nl); + + if (nx != (ase_char_t*)np) free (nx); + if (ox != (ase_char_t*)op) free (ox); + + (*env)->ReleaseStringChars (env, nw, np); + (*env)->ReleaseStringChars (env, ow, op); + + if (r == -1) + { + throw_exception ( + env, + ase_awk_geterrmsg(awk), + ase_awk_geterrnum(awk), + ase_awk_geterrlin(awk)); + } +} + JNIEXPORT void JNICALL Java_ase_awk_Awk_setfilename ( JNIEnv* env, jobject obj, jlong runid, jstring name) { @@ -2506,6 +2619,8 @@ JNIEXPORT jint JNICALL Java_ase_awk_Awk_system ( for (i = 0; i < len; i++) tmp[i] = (ase_char_t)ptr[i]; tmp[i] = ASE_T('\0'); + (*env)->ReleaseStringChars (env, cmd, ptr); + #ifdef _WIN32 ret = _tsystem(tmp); #else diff --git a/ase/awk/jni.h b/ase/awk/jni.h index 495e5b67..de8efdee 100644 --- a/ase/awk/jni.h +++ b/ase/awk/jni.h @@ -1,5 +1,5 @@ /* - * $Id: jni.h,v 1.3 2007/04/30 05:47:33 bacon Exp $ + * $Id: jni.h,v 1.4 2007/06/24 11:14:58 bacon Exp $ * * {License} */ @@ -43,6 +43,9 @@ JNIEXPORT jboolean JNICALL Java_ase_awk_Awk_getdebug ( JNIEXPORT void JNICALL Java_ase_awk_Awk_setdebug ( JNIEnv* env, jobject obj, jboolean debug); +JNIEXPORT void JNICALL Java_ase_awk_Awk_setword ( + JNIEnv* env, jobject obj, jstring ow, jstring nw); + JNIEXPORT void JNICALL Java_ase_awk_Awk_setfilename ( JNIEnv* env, jobject obj, jlong runid, jstring name); JNIEXPORT void JNICALL Java_ase_awk_Awk_setofilename ( @@ -53,6 +56,13 @@ JNIEXPORT jobject JNICALL Java_ase_awk_Awk_strtonum ( JNIEXPORT jstring JNICALL Java_ase_awk_Awk_valtostr ( JNIEnv* env, jobject obj, jlong runid, jobject val); +JNIEXPORT jstring JNICALL Java_ase_awk_Awk_strftime ( + JNIEnv* env, jobject obj, jstring fmt, jlong sec); +JNIEXPORT jstring JNICALL Java_ase_awk_Awk_strfgmtime ( + JNIEnv* env, jobject obj, jstring fmt, jlong sec); +JNIEXPORT jint JNICALL Java_ase_awk_Awk_system ( + JNIEnv* env, jobject obj, jstring cmd); + #ifdef __cplusplus } #endif diff --git a/ase/change.log b/ase/change.log index bf901268..9df28baa 100644 --- a/ase/change.log +++ b/ase/change.log @@ -2,12 +2,15 @@ * added ase_awk_setword to enable customization of keywords and intrinsic function names. -* added setWord method to the awk c++ class. -* added setErrorString method to the awk c++ class. +* added setWord method to the awk c++ class (awk/Awk.cpp) +* added setErrorString method to the awk c++ class (awk/Awk.cpp) +* added setWord method to the awk java class (awk/Awk.java) * changed the wrong macro name WIN32 to _WIN32 in utl/stdio.h * changed test/awk/Awk.cpp to include an option(-w) to utilize the setWord method. +* changed test/awk/AseAwk.java to include an option(-w) to utilize + the setWord method. [0.2.0] diff --git a/ase/test/awk/AseAwk.java b/ase/test/awk/AseAwk.java index e9938da8..9e7d1ece 100644 --- a/ase/test/awk/AseAwk.java +++ b/ase/test/awk/AseAwk.java @@ -1,5 +1,5 @@ /* - * $Id: AseAwk.java,v 1.8 2007/05/28 10:29:57 bacon Exp $ + * $Id: AseAwk.java,v 1.9 2007/06/24 11:14:58 bacon Exp $ */ import java.awt.*; @@ -53,15 +53,18 @@ public class AseAwk extends StdAwk System.out.print ("Usage: "); System.out.print (AseAwk.class.getName()); - System.out.println (" [-m main] [-si file]? [-so file]? [-ci file]* [-co file]* [-a arg]*"); - System.out.println (" -m main Specify the main function name\n"); - System.out.println (" -si file Specify the input source file\n"); - System.out.println (" The source code is read from stdin when it is not specified\n"); - System.out.println (" -so file Specify the output source file\n"); - System.out.println (" The deparsed code is not output when is it not specified\n"); - System.out.println (" -ci file Specify the input console file\n"); - System.out.println (" -co file Specify the output console file\n"); - System.out.println (" -a str Specify an argument\n"); + System.out.println (" [-m main] [-si file]? [-so file]? [-ci file]* [-co file]* [-a arg]* [-w o:n]*"); + System.out.println (" -m main Specify the main function name"); + System.out.println (" -si file Specify the input source file"); + System.out.println (" The source code is read from stdin when it is not specified"); + System.out.println (" -so file Specify the output source file"); + System.out.println (" The deparsed code is not output when is it not specified"); + System.out.println (" -ci file Specify the input console file"); + System.out.println (" -co file Specify the output console file"); + System.out.println (" -a str Specify an argument"); + System.out.println (" -w o:n Specify an old and new word pair"); + System.out.println (" o - an original word"); + System.out.println (" n - the new word to replace the original word"); } private static void print_error (String msg) @@ -143,6 +146,7 @@ public class AseAwk extends StdAwk else if (arg.equals("-co")) mode = 4; else if (arg.equals("-a")) mode = 5; else if (arg.equals("-m")) mode = 6; + else if (arg.equals("-w")) mode = 7; else { print_usage (); @@ -207,6 +211,20 @@ public class AseAwk extends StdAwk mainfn = arg; mode = 0; } + else if (mode == 7) + { + int idx = arg.indexOf(':'); + if (idx == -1) + { + print_usage (); + return; + } + + String ow = arg.substring (0, idx); + String nw = arg.substring (idx+1); + awk.setWord (ow, nw); + mode = 0; + } } }