Recovered from cvs revision 2007-10-20 15:06:00
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: Argument.java,v 1.4 2007/10/19 03:50:32 bacon Exp $ | ||||
|  * $Id: Argument.java,v 1.5 2007/10/19 15:02:33 bacon Exp $ | ||||
|  */ | ||||
|  | ||||
| package ase.awk; | ||||
| @ -30,13 +30,17 @@ public class Argument | ||||
| 		return getstrval (this.runid, this.valid); | ||||
| 	} | ||||
|  | ||||
| 	public Argument getIndexed (String idx) | ||||
| 	public boolean isIndexed () | ||||
| 	{ | ||||
| 		// TODO:.. | ||||
| 		return null; | ||||
| 		return isindexed (this.runid, this.valid); | ||||
| 	} | ||||
|  | ||||
| 	public Argument getIndexed (long idx) | ||||
| 	public Argument getIndexed (String idx) throws Exception | ||||
| 	{ | ||||
| 		return getindexed (this.runid, this.valid, idx); | ||||
| 	} | ||||
|  | ||||
| 	public Argument getIndexed (long idx) throws Exception | ||||
| 	{ | ||||
| 		return getIndexed (Long.toString(idx)); | ||||
| 	} | ||||
| @ -44,4 +48,6 @@ public class Argument | ||||
| 	protected native long getintval (long runid, long valid); | ||||
| 	protected native double getrealval (long runid, long valid); | ||||
| 	protected native String getstrval (long runid, long valid) throws Exception; | ||||
| 	protected native boolean isindexed (long runid, long valid); | ||||
| 	protected native Argument getindexed (long runid, long valid, String idx) throws Exception; | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: Awk.cpp,v 1.77 2007/10/14 16:34:57 bacon Exp $ | ||||
|  * $Id: Awk.cpp,v 1.78 2007/10/19 15:02:33 bacon Exp $ | ||||
|  * | ||||
|  * {License} | ||||
|  */ | ||||
| @ -274,16 +274,17 @@ int Awk::Argument::init (val_t* v) | ||||
| 		if (n == 0)  | ||||
| 		{ | ||||
| 			this->rnum = (ase_real_t)this->inum; | ||||
| 			this->str.ptr = ((ase_awk_val_str_t*)this->val)->buf; | ||||
| 			this->str.len = ((ase_awk_val_str_t*)this->val)->len; | ||||
| 			return 0; | ||||
| 		} | ||||
| 		else if (n == 1)  | ||||
| 		{ | ||||
| 			this->inum = (ase_long_t)this->rnum; | ||||
| 			this->str.ptr = ((ase_awk_val_str_t*)this->val)->buf; | ||||
| 			this->str.len = ((ase_awk_val_str_t*)this->val)->len; | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		this->str.ptr = ((ase_awk_val_str_t*)this->val)->buf; | ||||
| 		this->str.len = ((ase_awk_val_str_t*)this->val)->len; | ||||
| 	} | ||||
| 	else if (v->type == ASE_AWK_VAL_INT) | ||||
| 	{ | ||||
|  | ||||
| @ -24,3 +24,5 @@ EXPORTS | ||||
| 	Java_ase_awk_Argument_getintval | ||||
| 	Java_ase_awk_Argument_getrealval | ||||
| 	Java_ase_awk_Argument_getstrval | ||||
| 	Java_ase_awk_Argument_isindexed | ||||
| 	Java_ase_awk_Argument_getindexed | ||||
|  | ||||
							
								
								
									
										224
									
								
								ase/awk/jni.c
									
									
									
									
									
								
							
							
						
						
									
										224
									
								
								ase/awk/jni.c
									
									
									
									
									
								
							| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: jni.c,v 1.30 2007/10/19 03:50:32 bacon Exp $ | ||||
|  * $Id: jni.c,v 1.31 2007/10/19 15:02:33 bacon Exp $ | ||||
|  * | ||||
|  * {License} | ||||
|  */ | ||||
| @ -95,6 +95,10 @@ struct run_data_t | ||||
| 	JNIEnv* env; | ||||
| 	jobject obj; | ||||
|  | ||||
| 	ase_size_t errlin; | ||||
| 	int errnum; | ||||
| 	ase_char_t errmsg[256]; | ||||
|  | ||||
| 	jclass string_class; | ||||
| 	jclass integer_class; | ||||
| 	jclass long_class; | ||||
| @ -639,16 +643,32 @@ 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; | ||||
| 	jfieldID runid_field; | ||||
| 	jlong runid; | ||||
|  | ||||
| 	run_data = (run_data_t*)ase_awk_getruncustomdata (run); | ||||
|  | ||||
| 	env = run_data->env; | ||||
| 	obj = run_data->obj; | ||||
|  | ||||
| 	runid_field = (*env)->GetFieldID (env, run_data->context_class, FIELD_RUNID, "J"); | ||||
| 	runid = (*env)->GetLongField (env, run_data->context_object, runid_field); | ||||
|  | ||||
| 	if (errnum != ASE_AWK_ENOERR) | ||||
| 	{ | ||||
| 		ase_char_t* tmp; | ||||
|  | ||||
| 		ase_awk_getrunerror ( | ||||
| 			(ase_awk_run_t*)runid, &run_data->errnum, | ||||
| 			&run_data->errlin, &tmp); | ||||
| 		ase_strxcpy (run_data->errmsg,  | ||||
| 			ASE_COUNTOF(run_data->errmsg), tmp); | ||||
| 	} | ||||
|  | ||||
| 	/* 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); | ||||
| 	(*env)->SetLongField (env, run_data->context_object, runid_field, (jlong)0); | ||||
|  | ||||
|  | ||||
| } | ||||
|  | ||||
| JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jlong awkid, jstring mfn, jobjectArray args) | ||||
| @ -667,9 +687,14 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jlong awk | ||||
| 	awk = (ase_awk_t*) awkid; | ||||
| 	EXCEPTION_ON_NULL_AWK (awk); | ||||
|  | ||||
| 	memset (&run_data, 0, sizeof(run_data)); | ||||
|  | ||||
| 	run_data.env = env; | ||||
| 	run_data.obj = obj; | ||||
|  | ||||
| 	run_data.errnum = ASE_AWK_ENOERR; | ||||
| 	run_data.errlin = 0; | ||||
|  | ||||
| 	/* would global reference be necessary? */ | ||||
| 	run_data.string_class = (*env)->FindClass (env, "java/lang/String"); | ||||
| 	run_data.integer_class = (*env)->FindClass (env, "java/lang/Integer"); | ||||
| @ -807,7 +832,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jlong awk | ||||
| 				return; | ||||
| 			} | ||||
|  | ||||
| 			for (i =  0; i < len; i++)  | ||||
| 			for (i = 0; i < len; i++)  | ||||
| 			{ | ||||
| 				mmm[i] = (ase_char_t)ptr[i]; | ||||
| 				if (mmm[i] == ASE_T('\0')) | ||||
| @ -915,7 +940,8 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jlong awk | ||||
| 		runarg[i].len = 0; | ||||
| 	} | ||||
|  | ||||
| 	if (ase_awk_run (awk, mmm, &runios, &runcbs, runarg, &run_data) == -1) | ||||
| 	if (ase_awk_run (awk, mmm, &runios, &runcbs, runarg, &run_data) == -1 || | ||||
| 	    run_data.errnum != ASE_AWK_ENOERR) | ||||
| 	{ | ||||
| 		if (runarg != NULL) | ||||
| 		{ | ||||
| @ -927,11 +953,22 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jlong awk | ||||
| 		if (ptr != NULL) (*env)->ReleaseStringChars (env, mfn, ptr); | ||||
| 		DELETE_CLASS_REFS (env, run_data); | ||||
|  | ||||
| 		throw_exception ( | ||||
| 			env,  | ||||
| 			ase_awk_geterrmsg(awk),  | ||||
| 			ase_awk_geterrnum(awk),  | ||||
| 			ase_awk_geterrlin(awk)); | ||||
| 		if (run_data.errnum != ASE_AWK_ENOERR) | ||||
| 		{ | ||||
| 			throw_exception ( | ||||
| 				env,  | ||||
| 				run_data.errmsg, | ||||
| 				run_data.errnum, | ||||
| 				run_data.errlin); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			throw_exception ( | ||||
| 				env,  | ||||
| 				ase_awk_geterrmsg(awk),  | ||||
| 				ase_awk_geterrnum(awk),  | ||||
| 				ase_awk_geterrlin(awk)); | ||||
| 		} | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| @ -1699,60 +1736,7 @@ static int handle_bfn ( | ||||
| 			run_data->argument_class,  | ||||
| 			run_data->argument_init, (jlong)run, (jlong)v); | ||||
|  | ||||
| #if 0 | ||||
| 		arg = NULL; | ||||
|  | ||||
| 		if (v->type == ASE_AWK_VAL_INT) | ||||
| 		{ | ||||
| 			jlong jv; | ||||
|  | ||||
| 			jv = ((ase_awk_val_int_t*)v)->val; | ||||
| 			arg = (*env)->NewObject (env,  | ||||
| 				run_data->long_class,  | ||||
| 				run_data->long_init, jv); | ||||
| 		} | ||||
| 		else if (v->type == ASE_AWK_VAL_REAL) | ||||
| 		{ | ||||
| 			jdouble jv; | ||||
|  | ||||
| 			jv = ((ase_awk_val_real_t*)v)->val; | ||||
| 			arg = (*env)->NewObject (env,  | ||||
| 				run_data->double_class,  | ||||
| 				run_data->double_init, jv); | ||||
| 		} | ||||
| 		else if (v->type == ASE_AWK_VAL_STR) | ||||
| 		{ | ||||
| 			ase_size_t len = ((ase_awk_val_str_t*)v)->len; | ||||
|  | ||||
| 			if (ASE_SIZEOF(jchar) != ASE_SIZEOF(ase_char_t)) | ||||
| 			{ | ||||
| 				ase_size_t i; | ||||
| 			 | ||||
| 				jchar* tmp = (jchar*) ase_awk_malloc (awk, ASE_SIZEOF(jchar)*len); | ||||
| 				if (tmp == NULL) | ||||
| 				{ | ||||
| 					(*env)->DeleteLocalRef (env, args); | ||||
| 					(*env)->DeleteLocalRef (env, name); | ||||
| 					ase_awk_setrunerrnum (run, ASE_AWK_ENOMEM); | ||||
| 					return -1; | ||||
| 				} | ||||
|  | ||||
| 				for (i = 0; i < len; i++) | ||||
| 					tmp[i] = (jchar)((ase_awk_val_str_t*)v)->buf[i]; | ||||
|  | ||||
| 				arg = (*env)->NewString (env, tmp, len); | ||||
| 				 | ||||
| 				ase_awk_free (awk, tmp); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				arg = (*env)->NewString ( | ||||
| 					env, (jchar*)((ase_awk_val_str_t*)v)->buf, len); | ||||
| 			} | ||||
| 		} | ||||
| #endif | ||||
|  | ||||
| 		if (/*v->type != ASE_AWK_VAL_NIL && */arg == NULL) | ||||
| 		if (arg == NULL) | ||||
| 		{ | ||||
| 			if ((*env)->ExceptionOccurred (env)) | ||||
| 			{ | ||||
| @ -2570,13 +2554,21 @@ JNIEXPORT void JNICALL Java_ase_awk_Context_stop (JNIEnv* env, jobject obj, jlon | ||||
|  | ||||
| JNIEXPORT jlong JNICALL Java_ase_awk_Argument_getintval (JNIEnv* env, jobject obj, jlong runid, jlong valid) | ||||
| { | ||||
| 	ase_awk_run_t* run = (ase_awk_run_t*)runid; | ||||
| 	int n; | ||||
| 	ase_long_t lv; | ||||
| 	ase_real_t rv; | ||||
|  | ||||
|  | ||||
| 	n = ase_awk_valtonum ( | ||||
| 		(ase_awk_run_t*)runid, (ase_awk_val_t*)valid, &lv, &rv); | ||||
| 	if (n == -1)  | ||||
| 	{ | ||||
| 		throw_exception ( | ||||
| 			env,  | ||||
| 			ase_awk_getrunerrmsg(run), | ||||
| 			ase_awk_getrunerrnum(run), | ||||
| 			ase_awk_getrunerrlin(run)); | ||||
| 	} | ||||
| 	if (n == 1) lv = (ase_long_t)rv; | ||||
|  | ||||
| 	return (jlong)lv;  | ||||
| @ -2584,12 +2576,21 @@ JNIEXPORT jlong JNICALL Java_ase_awk_Argument_getintval (JNIEnv* env, jobject ob | ||||
|  | ||||
| JNIEXPORT jdouble JNICALL Java_ase_awk_Argument_getrealval (JNIEnv* env, jobject obj, jlong runid, jlong valid) | ||||
| { | ||||
| 	ase_awk_run_t* run = (ase_awk_run_t*)runid; | ||||
| 	int n; | ||||
| 	ase_long_t lv; | ||||
| 	ase_real_t rv; | ||||
|  | ||||
| 	n = ase_awk_valtonum ( | ||||
| 		(ase_awk_run_t*)runid, (ase_awk_val_t*)valid, &lv, &rv); | ||||
| 	if (n == -1)  | ||||
| 	{ | ||||
| 		throw_exception ( | ||||
| 			env,  | ||||
| 			ase_awk_getrunerrmsg(run), | ||||
| 			ase_awk_getrunerrnum(run), | ||||
| 			ase_awk_getrunerrlin(run)); | ||||
| 	} | ||||
| 	if (n == 0) rv = (ase_real_t)lv; | ||||
|  | ||||
| 	return (jdouble)rv;  | ||||
| @ -2607,7 +2608,15 @@ JNIEXPORT jstring JNICALL Java_ase_awk_Argument_getstrval (JNIEnv* env, jobject | ||||
|  | ||||
| 	str = ase_awk_valtostr ( | ||||
| 		run, val, ASE_AWK_VALTOSTR_CLEAR, ASE_NULL, &len); | ||||
| 	if (str == ASE_NULL) goto no_mem; | ||||
| 	if (str == ASE_NULL)  | ||||
| 	{ | ||||
| 		throw_exception ( | ||||
| 			env,  | ||||
| 			ase_awk_getrunerrmsg(run), | ||||
| 			ase_awk_getrunerrnum(run), | ||||
| 			ase_awk_getrunerrlin(run)); | ||||
| 		return ret; | ||||
| 	} | ||||
|  | ||||
| 	if (len > 0 && ASE_SIZEOF(jchar) != ASE_SIZEOF(ase_char_t)) | ||||
| 	{ | ||||
| @ -2618,7 +2627,7 @@ JNIEXPORT jstring JNICALL Java_ase_awk_Argument_getstrval (JNIEnv* env, jobject | ||||
| 		if (tmp == NULL) | ||||
| 		{ | ||||
| 			ase_awk_free (awk, str); | ||||
| 			goto no_mem; | ||||
| 			goto nomem; | ||||
| 		} | ||||
| 		for (i = 0; i < len; i++) tmp[i] = (jchar)str[i]; | ||||
| 		ret = (*env)->NewString (env, tmp, len); | ||||
| @ -2633,9 +2642,13 @@ JNIEXPORT jstring JNICALL Java_ase_awk_Argument_getstrval (JNIEnv* env, jobject | ||||
|  | ||||
| 	if (ret == NULL) | ||||
| 	{ | ||||
| 		if (is_debug(awk)) (*env)->ExceptionDescribe (env); | ||||
| 		(*env)->ExceptionClear (env); | ||||
| no_mem: | ||||
| nomem: | ||||
| 		if ((*env)->ExceptionOccurred(env)) | ||||
| 		{ | ||||
| 			if (is_debug(awk)) (*env)->ExceptionDescribe (env); | ||||
| 			(*env)->ExceptionClear (env); | ||||
| 		} | ||||
|  | ||||
| 		throw_exception ( | ||||
| 			env,  | ||||
| 			ase_awk_geterrstr(ASE_NULL, ASE_AWK_ENOMEM), | ||||
| @ -2645,3 +2658,72 @@ no_mem: | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| JNIEXPORT jboolean JNICALL Java_ase_awk_Argument_isindexed (JNIEnv* env, jobject obj, jlong runid, jlong valid) | ||||
| { | ||||
| 	ase_awk_val_t* val = (ase_awk_val_t*)valid; | ||||
| 	return (val->type == ASE_AWK_VAL_MAP)? JNI_TRUE: JNI_FALSE; | ||||
| } | ||||
|  | ||||
| JNIEXPORT jobject JNICALL Java_ase_awk_Argument_getindexed (JNIEnv* env, jobject obj, jlong runid, jlong valid, jstring index) | ||||
| { | ||||
| 	ase_awk_run_t* run = (ase_awk_run_t*)runid; | ||||
| 	ase_awk_val_t* val = (ase_awk_val_t*)valid; | ||||
| 	ase_awk_t* awk = ase_awk_getrunawk (run); | ||||
| 	run_data_t* run_data = (run_data_t*)ase_awk_getruncustomdata (run); | ||||
| 	ase_awk_pair_t* pair; | ||||
| 	jobject arg; | ||||
|  | ||||
| 	const jchar* ptr; | ||||
| 	ase_char_t* rptr; | ||||
| 	ase_size_t len; | ||||
|  | ||||
| 	if (val->type != ASE_AWK_VAL_MAP) return ASE_NULL; | ||||
|  | ||||
| 	len = (*env)->GetStringLength (env, index); | ||||
| 	ptr = (*env)->GetStringChars (env, index, JNI_FALSE); | ||||
| 	if (ptr == NULL) goto nomem; | ||||
|  | ||||
| 	if (len > 0 && ASE_SIZEOF(jchar) != ASE_SIZEOF(ase_char_t)) | ||||
| 	{ | ||||
| 		ase_size_t x; | ||||
| 		rptr = (ase_char_t*) ase_awk_malloc (awk, ASE_SIZEOF(ase_char_t)*len); | ||||
| 		if (rptr == ASE_NULL) | ||||
| 		{ | ||||
| 			(*env)->ReleaseStringChars (env, index, ptr); | ||||
| 			goto nomem; | ||||
| 		} | ||||
| 		for (x = 0; x < len; x++) rptr[x] = (ase_char_t)ptr[x]; | ||||
| 	} | ||||
| 	else rptr = (ase_char_t*)ptr; | ||||
|  | ||||
| 	pair = ase_awk_map_get (((ase_awk_val_map_t*)val)->map, rptr, len); | ||||
| 	if (ptr != rptr) ase_awk_free (awk, rptr); | ||||
| 	(*env)->ReleaseStringChars (env, index, ptr); | ||||
|  | ||||
| 	/* the key is not found. it is not an error. val is just nil */ | ||||
| 	if (pair == ASE_NULL) return ASE_NULL;;  | ||||
|  | ||||
| 	arg = (*env)->NewObject (env,  | ||||
| 		run_data->argument_class,  | ||||
| 		run_data->argument_init, (jlong)run, (jlong)pair->val); | ||||
| 	if (arg == NULL) goto nomem; | ||||
|  | ||||
| 	return arg; | ||||
|  | ||||
| nomem: | ||||
| 	if ((*env)->ExceptionOccurred (env)) | ||||
| 	{ | ||||
| 		if (is_debug(awk)) (*env)->ExceptionDescribe (env); | ||||
| 		(*env)->ExceptionClear (env); | ||||
| 	} | ||||
|  | ||||
| 	throw_exception ( | ||||
| 		env, | ||||
| 		ase_awk_geterrstr(ASE_NULL, ASE_AWK_ENOMEM),  | ||||
| 		ASE_AWK_ENOMEM,  | ||||
| 		0); | ||||
|  | ||||
| 	return ASE_NULL; | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -23,3 +23,5 @@ EXPORTS | ||||
| 	Java_ase_awk_Argument_getintval | ||||
| 	Java_ase_awk_Argument_getrealval | ||||
| 	Java_ase_awk_Argument_getstrval | ||||
| 	Java_ase_awk_Argument_isindexed | ||||
| 	Java_ase_awk_Argument_getindexed | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: jni.h,v 1.9 2007/10/19 03:50:33 bacon Exp $ | ||||
|  * $Id: jni.h,v 1.10 2007/10/19 15:02:33 bacon Exp $ | ||||
|  * | ||||
|  * {License} | ||||
|  */ | ||||
| @ -64,6 +64,8 @@ JNIEXPORT void JNICALL Java_ase_awk_Context_stop (JNIEnv* env, jobject obj, jlon | ||||
| JNIEXPORT jlong JNICALL Java_ase_awk_Argument_getintval (JNIEnv* env, jobject obj, jlong runid, jlong valid); | ||||
| JNIEXPORT jdouble JNICALL Java_ase_awk_Argument_getrealval (JNIEnv* env, jobject obj, jlong runid, jlong valid); | ||||
| JNIEXPORT jstring JNICALL Java_ase_awk_Argument_getstrval (JNIEnv* env, jobject obj, jlong runid, jlong valid); | ||||
| JNIEXPORT jboolean JNICALL Java_ase_awk_Argument_isindexed (JNIEnv* env, jobject obj, jlong runid, jlong valid); | ||||
| JNIEXPORT jobject JNICALL Java_ase_awk_Argument_getindexed (JNIEnv* env, jobject obj, jlong runid, jlong valid, jstring index); | ||||
|  | ||||
| #ifdef __cplusplus | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user