qse/ase/awk/jni.c

984 lines
21 KiB
C
Raw Normal View History

2006-08-02 15:03:49 +00:00
/*
2006-11-27 15:11:14 +00:00
* $Id: jni.c,v 1.28 2006-11-27 15:10:34 bacon Exp $
2006-08-02 15:03:49 +00:00
*/
2006-10-24 04:10:12 +00:00
#include <ase/awk/jni.h>
#include <ase/awk/awk.h>
2006-10-12 14:36:25 +00:00
#include <stdlib.h>
#include <string.h>
#include <wctype.h>
#include <wchar.h>
#include <stdio.h>
2006-11-19 15:33:40 +00:00
#include <stdarg.h>
2006-11-21 15:06:51 +00:00
#include <math.h>
2006-11-19 15:33:40 +00:00
#ifdef _WIN32
#include <windows.h>
#include <tchar.h>
#endif
2006-08-02 15:03:49 +00:00
2006-11-21 15:06:51 +00:00
#ifndef ASE_CHAR_IS_WCHAR
#error this module supports ASE_CHAR_IS_WCHAR only
#endif
2006-11-27 04:33:22 +00:00
#define CLASS_EXCEPTION "ase/awk/Exception"
#define CLASS_EXTIO "ase/awk/Extio"
#define FIELD_HANDLE "handle"
2006-08-06 08:16:03 +00:00
2006-10-13 10:18:39 +00:00
enum
{
SOURCE_READ = 1,
SOURCE_WRITE = 2
};
2006-10-24 04:10:12 +00:00
static ase_ssize_t __read_source (
int cmd, void* arg, ase_char_t* data, ase_size_t count);
static ase_ssize_t __write_source (
int cmd, void* arg, ase_char_t* data, ase_size_t count);
2006-11-21 15:06:51 +00:00
static ase_ssize_t __process_extio (
2006-10-24 04:10:12 +00:00
int cmd, void* arg, ase_char_t* data, ase_size_t count);
2006-08-06 08:16:03 +00:00
typedef struct srcio_data_t srcio_data_t;
2006-10-13 10:18:39 +00:00
typedef struct runio_data_t runio_data_t;
2006-08-06 08:16:03 +00:00
struct srcio_data_t
{
JNIEnv* env;
jobject obj;
};
2006-10-13 10:18:39 +00:00
struct runio_data_t
{
JNIEnv* env;
jobject obj;
};
2006-10-24 04:10:12 +00:00
static void* __awk_malloc (ase_size_t n, void* custom_data)
2006-10-12 14:36:25 +00:00
{
return malloc (n);
}
2006-10-24 04:10:12 +00:00
static void* __awk_realloc (void* ptr, ase_size_t n, void* custom_data)
2006-10-12 14:36:25 +00:00
{
return realloc (ptr, n);
}
static void __awk_free (void* ptr, void* custom_data)
{
free (ptr);
}
2006-08-06 08:16:03 +00:00
2006-11-21 15:06:51 +00:00
static ase_real_t __awk_pow (ase_real_t x, ase_real_t y)
{
return pow (x, y);
}
2006-11-19 15:33:40 +00:00
static int __awk_sprintf (
ase_char_t* buf, ase_size_t len, const ase_char_t* fmt, ...)
{
int n;
va_list ap;
va_start (ap, fmt);
#if defined(_WIN32)
n = _vsntprintf (buf, len, fmt, ap);
if (n < 0 || (ase_size_t)n >= len)
{
if (len > 0) buf[len-1] = ASE_T('\0');
n = -1;
}
#elif defined(__MSDOS__)
/* TODO: check buffer overflow */
n = vsprintf (buf, fmt, ap);
#else
n = xp_vsprintf (buf, len, fmt, ap);
#endif
va_end (ap);
return n;
}
static void __awk_aprintf (const ase_char_t* fmt, ...)
{
va_list ap;
#ifdef _WIN32
int n;
ase_char_t buf[1024];
#endif
va_start (ap, fmt);
#if defined(_WIN32)
n = _vsntprintf (buf, ase_countof(buf), fmt, ap);
if (n < 0) buf[ase_countof(buf)-1] = ASE_T('\0');
#if defined(_MSC_VER) && (_MSC_VER<1400)
MessageBox (NULL, buf,
ASE_T("Assertion Failure"), MB_OK|MB_ICONERROR);
#else
MessageBox (NULL, buf,
ASE_T("\uB2DD\uAE30\uB9AC \uC870\uB610"), MB_OK|MB_ICONERROR);
#endif
#elif defined(__MSDOS__)
vprintf (fmt, ap);
#else
xp_vprintf (fmt, ap);
#endif
va_end (ap);
}
static void __awk_dprintf (const ase_char_t* fmt, ...)
{
va_list ap;
va_start (ap, fmt);
#if defined(_WIN32)
_vftprintf (stderr, fmt, ap);
#elif defined(__MSDOS__)
vfprintf (stderr, fmt, ap);
#else
xp_vfprintf (stderr, fmt, ap);
#endif
va_end (ap);
}
2006-10-24 04:10:12 +00:00
JNIEXPORT void JNICALL Java_ase_awk_Awk_open (JNIEnv* env, jobject obj)
2006-08-06 08:16:03 +00:00
{
jclass class;
2006-11-27 04:33:22 +00:00
jfieldID fid_handle;
2006-08-06 08:16:03 +00:00
jthrowable except;
2006-10-24 04:10:12 +00:00
ase_awk_t* awk;
ase_awk_syscas_t syscas;
2006-08-06 08:16:03 +00:00
int opt;
class = (*env)->GetObjectClass(env, obj);
2006-10-12 14:36:25 +00:00
memset (&syscas, 0, sizeof(syscas));
syscas.malloc = __awk_malloc;
syscas.realloc = __awk_realloc;
syscas.free = __awk_free;
syscas.is_upper = iswupper;
syscas.is_lower = iswlower;
syscas.is_alpha = iswalpha;
syscas.is_digit = iswdigit;
syscas.is_xdigit = iswxdigit;
syscas.is_alnum = iswalnum;
syscas.is_space = iswspace;
syscas.is_print = iswprint;
syscas.is_graph = iswgraph;
syscas.is_cntrl = iswcntrl;
syscas.is_punct = iswpunct;
syscas.to_upper = towupper;
syscas.to_lower = towlower;
syscas.memcpy = memcpy;
syscas.memset = memset;
2006-11-21 15:06:51 +00:00
syscas.pow = __awk_pow;
2006-11-19 15:33:40 +00:00
syscas.sprintf = __awk_sprintf;
syscas.aprintf = __awk_aprintf;
syscas.dprintf = __awk_dprintf;
2006-10-12 14:36:25 +00:00
syscas.abort = abort;
2006-10-24 04:10:12 +00:00
awk = ase_awk_open (&syscas);
2006-08-06 08:16:03 +00:00
if (awk == NULL)
{
2006-11-27 04:33:22 +00:00
(*env)->DeleteLocalRef (env, class);
except = (*env)->FindClass (env, CLASS_EXCEPTION);
if (except == NULL) return;
2006-08-06 08:16:03 +00:00
(*env)->ThrowNew (env, except, "cannot create awk");
2006-11-27 04:33:22 +00:00
(*env)->DeleteLocalRef (env, except);
2006-08-06 08:16:03 +00:00
return;
}
2006-11-27 04:33:22 +00:00
fid_handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J");
if (fid_handle == 0)
{
/* something wrong. should not happen */
(*env)->DeleteLocalRef (env, class);
return;
}
2006-08-06 08:16:03 +00:00
2006-11-27 04:33:22 +00:00
(*env)->SetLongField (env, obj, fid_handle, (jlong)awk);
2006-08-06 08:16:03 +00:00
2006-11-27 04:33:22 +00:00
opt = ASE_AWK_EXPLICIT | ASE_AWK_UNIQUEAFN | ASE_AWK_DBLSLASHES |
2006-10-24 04:10:12 +00:00
ASE_AWK_SHADING | ASE_AWK_IMPLICIT | ASE_AWK_SHIFT |
2006-11-23 03:31:58 +00:00
ASE_AWK_EXTIO | ASE_AWK_BLOCKLESS | ASE_AWK_HASHSIGN |
2006-11-23 14:27:52 +00:00
ASE_AWK_NEXTOFILE;
2006-10-24 04:10:12 +00:00
ase_awk_setopt (awk, opt);
2006-08-06 08:16:03 +00:00
2006-11-27 04:33:22 +00:00
(*env)->DeleteLocalRef (env, class);
2006-10-12 14:36:25 +00:00
printf ("__awk(native) done => %u, 0x%X\n", awk, awk);
2006-08-06 08:16:03 +00:00
}
2006-10-24 04:10:12 +00:00
JNIEXPORT void JNICALL Java_ase_awk_Awk_close (JNIEnv* env, jobject obj)
2006-08-02 15:03:49 +00:00
{
2006-08-06 08:16:03 +00:00
jclass class;
2006-11-27 04:33:22 +00:00
jfieldID fid_handle;
2006-08-06 08:16:03 +00:00
class = (*env)->GetObjectClass(env, obj);
2006-11-27 04:33:22 +00:00
fid_handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J");
if (fid_handle == NULL)
{
/* something wrong. should not happen */
(*env)->DeleteLocalRef (env, class);
return;
}
2006-08-06 08:16:03 +00:00
2006-11-27 04:33:22 +00:00
ase_awk_close ((ase_awk_t*)(*env)->GetLongField (env, obj, fid_handle));
(*env)->SetLongField (env, obj, fid_handle, (jlong)0);
2006-08-06 08:16:03 +00:00
2006-11-27 04:33:22 +00:00
(*env)->DeleteLocalRef (env, class);
2006-10-12 14:36:25 +00:00
printf ("close (native) done\n");
2006-08-02 15:03:49 +00:00
}
2006-11-26 15:55:44 +00:00
static jint __java_get_max_depth (JNIEnv* env, jobject obj, const char* name)
{
jclass class;
jmethodID mid;
jthrowable thrown;
jint ret;
class = (*env)->GetObjectClass(env, obj);
mid = (*env)->GetMethodID (env, class, name, "()I");
if (mid == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
ret = (*env)->CallIntMethod (env, obj, mid);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionClear (env);
ret = -1;
}
(*env)->DeleteLocalRef (env, class);
return ret;
}
2006-10-24 04:10:12 +00:00
JNIEXPORT void JNICALL Java_ase_awk_Awk_parse (JNIEnv* env, jobject obj)
2006-08-02 15:03:49 +00:00
{
2006-08-06 08:16:03 +00:00
jclass class;
jfieldID fid;
jthrowable except;
2006-11-26 15:55:44 +00:00
jint depth;
2006-08-06 08:16:03 +00:00
2006-10-24 04:10:12 +00:00
ase_awk_t* awk;
ase_awk_srcios_t srcios;
2006-08-06 08:16:03 +00:00
srcio_data_t srcio_data;
class = (*env)->GetObjectClass (env, obj);
2006-11-26 15:55:44 +00:00
fid = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J");
2006-08-06 08:16:03 +00:00
if (fid == 0) return;
2006-10-24 04:10:12 +00:00
awk = (ase_awk_t*) (*env)->GetLongField (env, obj, fid);
2006-08-06 08:16:03 +00:00
srcio_data.env = env;
srcio_data.obj = obj;
srcios.in = __read_source;
2006-08-06 15:03:42 +00:00
srcios.out = __write_source;
2006-08-06 08:16:03 +00:00
srcios.custom_data = &srcio_data;
2006-11-26 15:55:44 +00:00
depth = __java_get_max_depth (env, obj, "getMaxParseDepth");
if (depth < 0) depth = 0;
ase_awk_setmaxparsedepth (awk,
ASE_AWK_DEPTH_BLOCK | ASE_AWK_DEPTH_EXPR, depth);
2006-10-24 04:10:12 +00:00
if (ase_awk_parse (awk, &srcios) == -1)
2006-08-06 08:16:03 +00:00
{
2006-11-26 15:55:44 +00:00
char msg[256];
int n;
2006-11-27 04:33:22 +00:00
except = (*env)->FindClass (env, CLASS_EXCEPTION);
if (except == NULL) return;
2006-11-26 15:55:44 +00:00
snprintf (msg, sizeof(msg), "parse error at line %d: %S",
ase_awk_getsrcline(awk),
ase_awk_geterrstr(ase_awk_geterrnum(awk)));
if (n < 0 || n >= sizeof(msg)) msg[sizeof(msg)-1] = '\0';
(*env)->ThrowNew (env, except, msg);
2006-11-27 04:33:22 +00:00
(*env)->DeleteLocalRef (env, except);
2006-08-06 08:16:03 +00:00
return;
}
}
2006-10-24 04:10:12 +00:00
JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj)
2006-08-06 08:16:03 +00:00
{
2006-10-13 10:18:39 +00:00
jclass class;
2006-11-27 04:33:22 +00:00
jfieldID fid_handle;
2006-10-13 10:18:39 +00:00
jthrowable except;
2006-10-24 04:10:12 +00:00
ase_awk_t* awk;
ase_awk_runios_t runios;
2006-10-13 10:18:39 +00:00
runio_data_t runio_data;
class = (*env)->GetObjectClass (env, obj);
2006-11-27 04:33:22 +00:00
fid_handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J");
if (fid_handle == 0)
{
(*env)->DeleteLocalRef (env, class);
return;
}
2006-10-13 10:18:39 +00:00
2006-11-27 04:33:22 +00:00
awk = (ase_awk_t*) (*env)->GetLongField (env, obj, fid_handle);
2006-10-13 10:18:39 +00:00
runio_data.env = env;
runio_data.obj = obj;
2006-11-24 15:07:18 +00:00
runios.pipe = __process_extio;
2006-10-24 04:10:12 +00:00
runios.coproc = ASE_NULL;
2006-11-21 15:06:51 +00:00
runios.file = __process_extio;
runios.console = __process_extio;
2006-10-13 10:18:39 +00:00
runios.custom_data = &runio_data;
2006-11-26 15:55:44 +00:00
//depth = __java_get_max_depth (env, obj, "getMaxRunDepth");
2006-11-19 15:33:40 +00:00
if (ase_awk_run (awk, ASE_NULL, &runios, ASE_NULL, ASE_NULL) == -1)
2006-10-13 10:18:39 +00:00
{
2006-11-21 15:06:51 +00:00
char msg[256];
int n;
2006-11-27 04:33:22 +00:00
(*env)->DeleteLocalRef (env, class);
except = (*env)->FindClass (env, CLASS_EXCEPTION);
if (except == NULL) return; /* exception thrown */
2006-11-21 15:06:51 +00:00
snprintf (msg, sizeof(msg), "%S",
ase_awk_geterrstr(ase_awk_geterrnum(awk)));
if (n < 0 || n >= sizeof(msg)) msg[sizeof(msg)-1] = '\0';
(*env)->ThrowNew (env, except, msg);
2006-11-27 04:33:22 +00:00
(*env)->DeleteLocalRef (env, except);
2006-10-13 10:18:39 +00:00
return;
}
2006-11-27 04:33:22 +00:00
(*env)->DeleteLocalRef (env, class);
2006-08-06 08:16:03 +00:00
}
2006-11-26 15:55:44 +00:00
static ase_ssize_t __java_open_source (JNIEnv* env, jobject obj, int mode)
2006-08-06 08:16:03 +00:00
{
2006-10-13 10:18:39 +00:00
jclass class;
jmethodID mid;
jthrowable thrown;
jint ret;
class = (*env)->GetObjectClass(env, obj);
2006-08-06 08:16:03 +00:00
2006-11-26 15:55:44 +00:00
mid = (*env)->GetMethodID (env, class, "openSource", "(I)I");
2006-11-21 15:06:51 +00:00
if (mid == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-10-12 14:36:25 +00:00
2006-10-13 10:18:39 +00:00
ret = (*env)->CallIntMethod (env, obj, mid, mode);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
2006-08-06 08:16:03 +00:00
{
2006-10-13 10:18:39 +00:00
(*env)->ExceptionClear (env);
ret = -1;
2006-08-06 08:16:03 +00:00
}
2006-08-06 15:03:42 +00:00
2006-11-21 15:06:51 +00:00
(*env)->DeleteLocalRef (env, class);
2006-10-13 10:18:39 +00:00
return ret;
2006-08-06 15:03:42 +00:00
}
2006-11-26 15:55:44 +00:00
static ase_ssize_t __java_close_source (JNIEnv* env, jobject obj, int mode)
2006-08-06 15:03:42 +00:00
{
2006-10-13 10:18:39 +00:00
jclass class;
jmethodID mid;
jthrowable thrown;
jint ret;
class = (*env)->GetObjectClass(env, obj);
2006-08-06 15:03:42 +00:00
2006-11-26 15:55:44 +00:00
mid = (*env)->GetMethodID (env, class, "closeSource", "(I)I");
2006-11-21 15:06:51 +00:00
if (mid == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-08-06 15:03:42 +00:00
2006-10-13 10:18:39 +00:00
ret = (*env)->CallIntMethod (env, obj, mid, mode);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
2006-08-06 08:16:03 +00:00
{
2006-10-13 10:18:39 +00:00
(*env)->ExceptionClear (env);
ret = -1;
2006-08-06 08:16:03 +00:00
}
2006-08-06 15:03:42 +00:00
2006-11-21 15:06:51 +00:00
(*env)->DeleteLocalRef (env, class);
2006-10-13 10:18:39 +00:00
return ret;
2006-08-06 08:16:03 +00:00
}
2006-11-26 15:55:44 +00:00
static ase_ssize_t __java_read_source (
2006-10-24 04:10:12 +00:00
JNIEnv* env, jobject obj, ase_char_t* buf, ase_size_t size)
2006-08-06 08:16:03 +00:00
{
jclass class;
jmethodID mid;
jcharArray array;
jchar* tmp;
2006-10-13 10:18:39 +00:00
jint ret, i;
jthrowable thrown;
2006-08-06 08:16:03 +00:00
class = (*env)->GetObjectClass(env, obj);
2006-11-26 15:55:44 +00:00
mid = (*env)->GetMethodID (env, class, "readSource", "([CI)I");
2006-11-21 15:06:51 +00:00
if (mid == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-08-06 08:16:03 +00:00
2006-10-13 10:18:39 +00:00
array = (*env)->NewCharArray (env, size);
2006-11-21 15:06:51 +00:00
if (array == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-08-06 08:16:03 +00:00
2006-10-13 10:18:39 +00:00
ret = (*env)->CallIntMethod (env, obj, mid, array, size);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionClear (env);
ret = -1;
}
2006-08-06 08:16:03 +00:00
tmp = (*env)->GetCharArrayElements (env, array, 0);
2006-10-24 04:10:12 +00:00
for (i = 0; i < ret; i++) buf[i] = (ase_char_t)tmp[i];
2006-08-06 08:16:03 +00:00
(*env)->ReleaseCharArrayElements (env, array, tmp, 0);
2006-10-22 07:05:34 +00:00
(*env)->DeleteLocalRef (env, array);
2006-11-21 15:06:51 +00:00
(*env)->DeleteLocalRef (env, class);
2006-08-06 08:16:03 +00:00
return i;
2006-08-02 15:03:49 +00:00
}
2006-08-06 15:03:42 +00:00
2006-11-26 15:55:44 +00:00
static ase_ssize_t __java_write_source (
2006-10-24 04:10:12 +00:00
JNIEnv* env, jobject obj, ase_char_t* buf, ase_size_t size)
2006-08-06 15:03:42 +00:00
{
jclass class;
jmethodID mid;
jcharArray array;
jchar* tmp;
2006-10-13 10:18:39 +00:00
jint ret, i;
jthrowable thrown;
2006-08-06 15:03:42 +00:00
class = (*env)->GetObjectClass(env, obj);
2006-11-26 15:55:44 +00:00
mid = (*env)->GetMethodID (env, class, "writeSource", "([CI)I");
2006-11-21 15:06:51 +00:00
if (mid == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-08-06 15:03:42 +00:00
array = (*env)->NewCharArray (env, size);
2006-11-21 15:06:51 +00:00
if (array == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-08-06 15:03:42 +00:00
tmp = (*env)->GetCharArrayElements (env, array, 0);
for (i = 0; i < size; i++) tmp[i] = (jchar)buf[i];
(*env)->ReleaseCharArrayElements (env, array, tmp, 0);
2006-10-13 10:18:39 +00:00
ret = (*env)->CallIntMethod (env, obj, mid, array, size);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
2006-11-25 15:51:57 +00:00
(*env)->ExceptionDescribe (env);
2006-10-13 10:18:39 +00:00
(*env)->ExceptionClear (env);
ret = -1;
}
2006-10-22 07:05:34 +00:00
(*env)->DeleteLocalRef (env, array);
2006-11-21 15:06:51 +00:00
(*env)->DeleteLocalRef (env, class);
2006-10-13 10:18:39 +00:00
return ret;
}
2006-11-26 15:55:44 +00:00
static ase_ssize_t __java_open_extio (
2006-10-24 04:10:12 +00:00
JNIEnv* env, jobject obj, char* meth, ase_awk_extio_t* extio)
2006-10-13 10:18:39 +00:00
{
jclass class;
jmethodID mid;
jthrowable thrown;
2006-11-21 15:06:51 +00:00
jclass extio_class;
jmethodID extio_cons;
jobject extio_object;
jstring extio_name;
2006-10-13 10:18:39 +00:00
jint ret;
class = (*env)->GetObjectClass(env, obj);
2006-11-27 04:33:22 +00:00
extio_class = (*env)->FindClass (env, CLASS_EXTIO);
2006-11-21 15:06:51 +00:00
if (extio_class == NULL)
2006-10-13 14:05:24 +00:00
{
2006-11-21 15:06:51 +00:00
(*env)->DeleteLocalRef (env, class);
return -1;
2006-10-13 14:05:24 +00:00
}
2006-11-21 15:06:51 +00:00
/* get the constructor */
extio_cons = (*env)->GetMethodID (
2006-11-22 15:12:04 +00:00
env, extio_class, "<init>", "(Ljava/lang/String;IIJ)V");
2006-11-21 15:06:51 +00:00
if (extio_cons == NULL)
{
(*env)->DeleteLocalRef (env, extio_class);
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-10-22 07:05:34 +00:00
2006-11-21 15:06:51 +00:00
/* get the method - meth */
mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;)I");
if (mid == NULL)
{
(*env)->DeleteLocalRef (env, extio_class);
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-10-22 07:05:34 +00:00
2006-11-21 15:06:51 +00:00
/* construct the name */
extio_name = (*env)->NewString (
env, extio->name, ase_awk_strlen(extio->name));
if (extio_name == NULL)
{
(*env)->DeleteLocalRef (env, extio_class);
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-10-22 07:05:34 +00:00
2006-11-21 15:06:51 +00:00
/* construct the extio object */
extio_object = (*env)->NewObject (
env, extio_class, extio_cons,
2006-11-22 15:12:04 +00:00
extio_name, extio->type & 0xFF, extio->mode, extio->run);
2006-11-21 15:06:51 +00:00
if (extio_object == NULL)
{
(*env)->DeleteLocalRef (env, extio_name);
(*env)->DeleteLocalRef (env, extio_class);
(*env)->DeleteLocalRef (env, class);
return -1;
2006-10-13 14:05:24 +00:00
}
2006-10-13 10:18:39 +00:00
2006-11-21 15:06:51 +00:00
/* execute the method */
ret = (*env)->CallIntMethod (env, obj, mid, extio_object);
2006-10-13 10:18:39 +00:00
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
2006-11-21 15:06:51 +00:00
(*env)->ExceptionDescribe (env);
2006-10-13 10:18:39 +00:00
(*env)->ExceptionClear (env);
2006-11-21 15:06:51 +00:00
return -1;
}
if (ret != -1)
{
/* 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);
2006-10-13 10:18:39 +00:00
}
2006-11-21 15:06:51 +00:00
(*env)->DeleteLocalRef (env, extio_object);
(*env)->DeleteLocalRef (env, extio_name);
(*env)->DeleteLocalRef (env, extio_class);
(*env)->DeleteLocalRef (env, class);
2006-10-13 10:18:39 +00:00
return ret;
}
2006-11-26 15:55:44 +00:00
static ase_ssize_t __java_close_extio (
2006-10-24 04:10:12 +00:00
JNIEnv* env, jobject obj, char* meth, ase_awk_extio_t* extio)
2006-10-13 10:18:39 +00:00
{
jclass class;
jmethodID mid;
jthrowable thrown;
jint ret;
class = (*env)->GetObjectClass(env, obj);
2006-11-21 15:06:51 +00:00
mid = (*env)->GetMethodID (
env, class, meth, "(Lase/awk/Extio;)I");
if (mid == NULL)
2006-10-13 14:05:24 +00:00
{
2006-11-21 15:06:51 +00:00
(*env)->DeleteLocalRef (env, class);
return -1;
2006-10-13 14:05:24 +00:00
}
2006-10-13 10:18:39 +00:00
2006-11-21 15:06:51 +00:00
ret = (*env)->CallIntMethod (env, obj, mid, extio->handle);
2006-10-13 10:18:39 +00:00
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
2006-11-21 15:06:51 +00:00
(*env)->ExceptionDescribe (env);
2006-10-13 10:18:39 +00:00
(*env)->ExceptionClear (env);
ret = -1;
}
2006-11-21 15:06:51 +00:00
if (ret != -1)
{
/* ret == -1 failed to close the stream
* ret == 0 closed the stream */
(*env)->DeleteGlobalRef (env, extio->handle);
extio->handle = NULL;
}
(*env)->DeleteLocalRef (env, class);
2006-10-13 10:18:39 +00:00
return ret;
}
2006-11-26 15:55:44 +00:00
static ase_ssize_t __java_read_extio (
2006-11-21 15:06:51 +00:00
JNIEnv* env, jobject obj, char* meth,
ase_awk_extio_t* extio, ase_char_t* buf, ase_size_t size)
2006-10-13 10:18:39 +00:00
{
jclass class;
jmethodID mid;
jcharArray array;
jchar* tmp;
jint ret, i;
jthrowable thrown;
class = (*env)->GetObjectClass(env, obj);
2006-11-21 15:06:51 +00:00
mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;[CI)I");
if (mid == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-10-13 10:18:39 +00:00
array = (*env)->NewCharArray (env, size);
2006-11-21 15:06:51 +00:00
if (array == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-10-13 10:18:39 +00:00
2006-11-21 15:06:51 +00:00
ret = (*env)->CallIntMethod (env, obj, mid, extio->handle, array, size);
2006-10-13 10:18:39 +00:00
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionClear (env);
ret = -1;
}
2006-11-21 15:06:51 +00:00
if (ret > 0)
{
tmp = (*env)->GetCharArrayElements (env, array, 0);
for (i = 0; i < ret; i++) buf[i] = (ase_char_t)tmp[i];
(*env)->ReleaseCharArrayElements (env, array, tmp, 0);
}
2006-10-13 10:18:39 +00:00
2006-10-22 07:05:34 +00:00
(*env)->DeleteLocalRef (env, array);
2006-11-21 15:06:51 +00:00
(*env)->DeleteLocalRef (env, class);
2006-10-13 10:18:39 +00:00
return ret;
}
2006-11-26 15:55:44 +00:00
static ase_ssize_t __java_write_extio (
2006-11-21 15:06:51 +00:00
JNIEnv* env, jobject obj, char* meth,
ase_awk_extio_t* extio, ase_char_t* data, ase_size_t size)
2006-10-13 10:18:39 +00:00
{
jclass class;
jmethodID mid;
jcharArray array;
2006-10-24 04:10:12 +00:00
ase_ssize_t i;
2006-10-13 10:18:39 +00:00
jchar* tmp;
jint ret;
jthrowable thrown;
class = (*env)->GetObjectClass(env, obj);
2006-11-21 15:06:51 +00:00
mid = (*env)->GetMethodID (env, class, meth, "(Lase/awk/Extio;[CI)I");
if (mid == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-10-13 10:18:39 +00:00
array = (*env)->NewCharArray (env, size);
2006-11-21 15:06:51 +00:00
if (array == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
2006-10-13 10:18:39 +00:00
tmp = (*env)->GetCharArrayElements (env, array, 0);
for (i = 0; i < size; i++) tmp[i] = (jchar)data[i];
(*env)->ReleaseCharArrayElements (env, array, tmp, 0);
2006-11-21 15:06:51 +00:00
ret = (*env)->CallIntMethod (env, obj, mid, extio->handle, array, size);
2006-10-13 10:18:39 +00:00
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionClear (env);
ret = -1;
}
2006-10-22 07:05:34 +00:00
(*env)->DeleteLocalRef (env, array);
2006-11-21 15:06:51 +00:00
(*env)->DeleteLocalRef (env, class);
2006-10-13 10:18:39 +00:00
return ret;
}
2006-11-24 15:07:18 +00:00
2006-11-26 15:55:44 +00:00
static ase_ssize_t __java_flush_extio (
2006-11-24 15:07:18 +00:00
JNIEnv* env, jobject obj, char* meth, ase_awk_extio_t* extio)
{
jclass class;
jmethodID mid;
jthrowable thrown;
jint ret;
class = (*env)->GetObjectClass(env, obj);
mid = (*env)->GetMethodID (
env, class, meth, "(Lase/awk/Extio;)I");
if (mid == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
ret = (*env)->CallIntMethod (env, obj, mid, extio->handle);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionDescribe (env);
(*env)->ExceptionClear (env);
ret = -1;
}
(*env)->DeleteLocalRef (env, class);
return ret;
}
2006-11-26 15:55:44 +00:00
static ase_ssize_t __java_next_extio (
2006-11-22 15:12:04 +00:00
JNIEnv* env, jobject obj, char* meth, ase_awk_extio_t* extio)
{
jclass class;
jmethodID mid;
jthrowable thrown;
jint ret;
class = (*env)->GetObjectClass(env, obj);
mid = (*env)->GetMethodID (
env, class, meth, "(Lase/awk/Extio;)I");
if (mid == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
ret = (*env)->CallIntMethod (env, obj, mid, extio->handle);
thrown = (*env)->ExceptionOccurred (env);
if (thrown)
{
(*env)->ExceptionDescribe (env);
(*env)->ExceptionClear (env);
ret = -1;
}
(*env)->DeleteLocalRef (env, class);
return ret;
}
2006-10-24 04:10:12 +00:00
static ase_ssize_t __read_source (
int cmd, void* arg, ase_char_t* data, ase_size_t count)
2006-10-13 10:18:39 +00:00
{
srcio_data_t* srcio_data = (srcio_data_t*)arg;
2006-10-24 04:10:12 +00:00
if (cmd == ASE_AWK_IO_OPEN)
2006-10-13 10:18:39 +00:00
{
2006-11-26 15:55:44 +00:00
return __java_open_source (
2006-10-13 10:18:39 +00:00
srcio_data->env, srcio_data->obj, SOURCE_READ);
}
2006-10-24 04:10:12 +00:00
else if (cmd == ASE_AWK_IO_CLOSE)
2006-10-13 10:18:39 +00:00
{
2006-11-26 15:55:44 +00:00
return __java_close_source (
2006-10-13 10:18:39 +00:00
srcio_data->env, srcio_data->obj, SOURCE_READ);
}
2006-10-24 04:10:12 +00:00
else if (cmd == ASE_AWK_IO_READ)
2006-10-13 10:18:39 +00:00
{
2006-11-26 15:55:44 +00:00
return __java_read_source (
2006-10-13 10:18:39 +00:00
srcio_data->env, srcio_data->obj, data, count);
}
return -1;
}
2006-10-24 04:10:12 +00:00
static ase_ssize_t __write_source (
int cmd, void* arg, ase_char_t* data, ase_size_t count)
2006-10-13 10:18:39 +00:00
{
srcio_data_t* srcio_data = (srcio_data_t*)arg;
2006-10-24 04:10:12 +00:00
if (cmd == ASE_AWK_IO_OPEN)
2006-10-13 10:18:39 +00:00
{
2006-11-26 15:55:44 +00:00
return __java_open_source (
2006-10-13 10:18:39 +00:00
srcio_data->env, srcio_data->obj, SOURCE_WRITE);
}
2006-10-24 04:10:12 +00:00
else if (cmd == ASE_AWK_IO_CLOSE)
2006-10-13 10:18:39 +00:00
{
2006-11-26 15:55:44 +00:00
return __java_close_source (
2006-10-13 10:18:39 +00:00
srcio_data->env, srcio_data->obj, SOURCE_WRITE);
}
2006-10-24 04:10:12 +00:00
else if (cmd == ASE_AWK_IO_WRITE)
2006-10-13 10:18:39 +00:00
{
2006-11-26 15:55:44 +00:00
return __java_write_source (
2006-10-13 10:18:39 +00:00
srcio_data->env, srcio_data->obj, data, count);
}
return -1;
}
2006-11-21 15:06:51 +00:00
static ase_ssize_t __process_extio (
2006-10-24 04:10:12 +00:00
int cmd, void* arg, ase_char_t* data, ase_size_t size)
2006-10-13 10:18:39 +00:00
{
2006-10-24 04:10:12 +00:00
ase_awk_extio_t* epa = (ase_awk_extio_t*)arg;
2006-10-13 10:18:39 +00:00
runio_data_t* runio_data = (runio_data_t*)epa->custom_data;
2006-10-24 04:10:12 +00:00
if (cmd == ASE_AWK_IO_OPEN)
2006-10-13 10:18:39 +00:00
{
2006-11-26 15:55:44 +00:00
return __java_open_extio (
2006-10-13 14:05:24 +00:00
runio_data->env, runio_data->obj,
2006-11-26 15:55:44 +00:00
"openExtio", epa);
2006-10-13 10:18:39 +00:00
}
2006-10-24 04:10:12 +00:00
else if (cmd == ASE_AWK_IO_CLOSE)
2006-10-13 10:18:39 +00:00
{
2006-11-26 15:55:44 +00:00
return __java_close_extio (
2006-10-13 14:05:24 +00:00
runio_data->env, runio_data->obj,
2006-11-26 15:55:44 +00:00
"closeExtio", epa);
2006-10-13 10:18:39 +00:00
}
2006-10-24 04:10:12 +00:00
else if (cmd == ASE_AWK_IO_READ)
2006-10-13 10:18:39 +00:00
{
2006-11-26 15:55:44 +00:00
return __java_read_extio (
2006-11-21 15:06:51 +00:00
runio_data->env, runio_data->obj,
2006-11-26 15:55:44 +00:00
"readExtio", epa, data, size);
2006-10-13 10:18:39 +00:00
}
2006-10-24 04:10:12 +00:00
else if (cmd == ASE_AWK_IO_WRITE)
2006-10-13 10:18:39 +00:00
{
2006-11-26 15:55:44 +00:00
return __java_write_extio (
2006-11-21 15:06:51 +00:00
runio_data->env, runio_data->obj,
2006-11-26 15:55:44 +00:00
"writeExtio", epa, data, size);
2006-10-13 10:18:39 +00:00
}
2006-11-24 15:07:18 +00:00
else if (cmd == ASE_AWK_IO_FLUSH)
{
2006-11-26 15:55:44 +00:00
return __java_flush_extio (
2006-11-24 15:07:18 +00:00
runio_data->env, runio_data->obj,
2006-11-26 15:55:44 +00:00
"flushExtio", epa);
2006-11-24 15:07:18 +00:00
}
2006-11-22 15:12:04 +00:00
else if (cmd == ASE_AWK_IO_NEXT)
{
2006-11-26 15:55:44 +00:00
return __java_next_extio (
2006-11-22 15:12:04 +00:00
runio_data->env, runio_data->obj,
2006-11-26 15:55:44 +00:00
"nextExtio", epa);
2006-11-22 15:12:04 +00:00
}
2006-10-13 14:05:24 +00:00
return -1;
}
2006-11-22 15:12:04 +00:00
2006-11-27 15:11:14 +00:00
JNIEXPORT jint JNICALL Java_ase_awk_Awk_setfilename (
JNIEnv* env, jobject obj, jlong run_id, jstring name)
2006-11-22 15:12:04 +00:00
{
ase_awk_run_t* run = (ase_awk_run_t*)run_id;
const jchar* str;
2006-11-27 04:33:22 +00:00
jint len, n;
2006-11-22 15:12:04 +00:00
str = (*env)->GetStringChars (env, name, JNI_FALSE);
len = (*env)->GetStringLength (env, name);
2006-11-24 13:25:12 +00:00
n = ase_awk_setfilename (run, str, len);
2006-11-22 15:12:04 +00:00
(*env)->ReleaseStringChars (env, name, str);
return n;
}
2006-11-27 15:11:14 +00:00
JNIEXPORT jint JNICALL Java_ase_awk_Awk_setofilename (
JNIEnv* env, jobject obj, jlong run_id, jstring name)
2006-11-24 13:25:12 +00:00
{
ase_awk_run_t* run = (ase_awk_run_t*)run_id;
const jchar* str;
2006-11-27 04:33:22 +00:00
jint len, n;
2006-11-24 13:25:12 +00:00
str = (*env)->GetStringChars (env, name, JNI_FALSE);
len = (*env)->GetStringLength (env, name);
n = ase_awk_setofilename (run, str, len);
(*env)->ReleaseStringChars (env, name, str);
return n;
}
2006-11-27 04:33:22 +00:00
static int __handle_bfn (ase_awk_run_t* run)
{
jclass class;
jmethodID mid;
2006-11-27 15:11:14 +00:00
printf ("BFN CALLED.....\n");
2006-11-27 04:33:22 +00:00
/*
class = (*env)->GetObjectClass(env, obj);
mid = (*env)->GetMethodID (env, class, funtion_name...., "(I)I");
if (mid == NULL)
{
(*env)->DeleteLocalRef (env, class);
return -1;
}
*/
/*
CreateObjectArray...
Call the method with this array.
Delete the array...
*/
/*
(*env)->DeleteLocalRef (env, class);
*/
return 0;
}
JNIEXPORT void JNICALL Java_ase_awk_Awk_addbfn (
JNIEnv* env, jobject obj, jstring name, jint min_args, jint max_args)
{
jclass class;
jfieldID fid_handle;
jthrowable except;
ase_awk_t* awk;
const jchar* str;
jint len;
class = (*env)->GetObjectClass(env, obj);
fid_handle = (*env)->GetFieldID (env, class, FIELD_HANDLE, "J");
if (fid_handle == NULL)
{
(*env)->DeleteLocalRef (env, class);
return;
}
awk = (ase_awk_t*) (*env)->GetLongField (env, obj, fid_handle);
str = (*env)->GetStringChars (env, name, JNI_FALSE);
len = (*env)->GetStringLength (env, name);
if (ase_awk_addbfn (awk, str, len, 0,
min_args, max_args, ASE_NULL, __handle_bfn) == ASE_NULL)
{
(*env)->ReleaseStringChars (env, name, str);
(*env)->DeleteLocalRef (env, class);
except = (*env)->FindClass (env, CLASS_EXCEPTION);
if (except == NULL) return;
(*env)->ThrowNew (env, except, "cannot add the function");
(*env)->DeleteLocalRef (env, except);
return;
}
(*env)->ReleaseStringChars (env, name, str);
(*env)->DeleteLocalRef (env, class);
}