diff --git a/ase/awk/Return.java b/ase/awk/Return.java index f47a1007..69b112c7 100644 --- a/ase/awk/Return.java +++ b/ase/awk/Return.java @@ -1,5 +1,5 @@ /* - * $Id: Return.java,v 1.3 2007/10/24 04:58:35 bacon Exp $ + * $Id: Return.java,v 1.4 2007/10/24 14:17:32 bacon Exp $ */ package ase.awk; @@ -20,6 +20,11 @@ public class Return this.valid = valid; } + public boolean isIndexed () + { + return isindexed (this.runid, this.valid); + } + public void setIntValue (long v) { setintval (this.runid, this.valid, v); @@ -90,11 +95,49 @@ public class Return setindexedstrval (this.runid, this.valid, index, v); } + public void setIndexedIntValue (long index, long v) + { + setindexedintval (this.runid, this.valid, Long.toString(index), v); + } + + public void setIndexedIntValue (long index, int v) + { + setindexedintval (this.runid, this.valid, Long.toString(index), (long)v); + } + + public void setIndexedIntValue (long index, short v) + { + setindexedintval (this.runid, this.valid, Long.toString(index), (long)v); + } + + public void setIndexedIntValue (long index, byte v) + { + setindexedintval (this.runid, this.valid, Long.toString(index), (long)v); + } + + public void setIndexedRealValue (long index, double v) + { + setindexedrealval (this.runid, this.valid, Long.toString(index), v); + } + + public void setIndexedRealValue (long index, float v) + { + setindexedrealval (this.runid, this.valid, Long.toString(index), (double)v); + } + + public void setIndexedStringValue (long index, String v) + { + setindexedstrval (this.runid, this.valid, Long.toString(index), v); + } + + public void clear () { clearval (this.runid, this.valid); } + protected native boolean isindexed (long runid, long valid); + protected native void setintval (long runid, long valid, long v); protected native void setrealval (long runid, long valid, double v); protected native void setstrval (long runid, long valid, String v); diff --git a/ase/awk/awk.c b/ase/awk/awk.c index 4d17fce7..95cad6cc 100644 --- a/ase/awk/awk.c +++ b/ase/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.11 2007/10/10 13:22:12 bacon Exp $ + * $Id: awk.c,v 1.13 2007/10/24 14:17:32 bacon Exp $ * * {License} */ @@ -13,6 +13,7 @@ static void free_kw (void* awk, void* ptr); static void free_afn (void* awk, void* afn); +static void free_bfn (void* awk, void* afn); ase_awk_t* ase_awk_open (const ase_awk_prmfns_t* prmfns, void* custom_data) { @@ -136,7 +137,19 @@ ase_awk_t* ase_awk_open (const ase_awk_prmfns_t* prmfns, void* custom_data) awk->src.shared.buf_len = 0; awk->bfn.sys = ASE_NULL; - awk->bfn.user = ASE_NULL; + /*awk->bfn.user = ASE_NULL;*/ + awk->bfn.user = ase_awk_map_open (awk, 512, 70, free_bfn, awk); + if (awk->bfn.user == ASE_NULL) + { + ase_awk_tab_close (&awk->parse.params); + ase_awk_tab_close (&awk->parse.locals); + ase_awk_tab_close (&awk->parse.globals); + ase_awk_map_close (awk->tree.afns); + ase_awk_map_close (awk->kwtab); + ase_str_close (&awk->token.name); + ASE_AWK_FREE (awk, awk); + return ASE_NULL; + } awk->parse.depth.cur.block = 0; awk->parse.depth.cur.loop = 0; @@ -153,6 +166,7 @@ ase_awk_t* ase_awk_open (const ase_awk_prmfns_t* prmfns, void* custom_data) if (ase_awk_initglobals (awk) == -1) { + ase_awk_map_close (awk->bfn.user); ase_awk_tab_close (&awk->parse.params); ase_awk_tab_close (&awk->parse.locals); ase_awk_tab_close (&awk->parse.globals); @@ -182,12 +196,19 @@ static void free_afn (void* owner, void* afn) ASE_AWK_FREE ((ase_awk_t*)owner, f); } +static void free_bfn (void* owner, void* bfn) +{ + ase_awk_bfn_t* f = (ase_awk_bfn_t*)bfn; + ASE_AWK_FREE ((ase_awk_t*)owner, f); +} + int ase_awk_close (ase_awk_t* awk) { ase_size_t i; if (ase_awk_clear (awk) == -1) return -1; - ase_awk_clrbfn (awk); + /*ase_awk_clrbfn (awk);*/ + ase_awk_map_close (awk->bfn.user); ase_awk_tab_close (&awk->parse.params); ase_awk_tab_close (&awk->parse.locals); diff --git a/ase/awk/awk.h b/ase/awk/awk.h index a735786d..878c94ba 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h,v 1.21 2007/10/21 07:59:35 bacon Exp $ + * $Id: awk.h,v 1.22 2007/10/24 09:57:45 bacon Exp $ * * {License} */ @@ -466,6 +466,9 @@ void ase_awk_setoption (ase_awk_t* awk, int opt); ase_size_t ase_awk_getmaxdepth (ase_awk_t* awk, int type); void ase_awk_setmaxdepth (ase_awk_t* awk, int types, ase_size_t depth); +/* + * Enables replacement of a name of a keyword. + */ int ase_awk_setword (ase_awk_t* awk, const ase_char_t* okw, ase_size_t olen, const ase_char_t* nkw, ase_size_t nlen); diff --git a/ase/awk/awk_i.h b/ase/awk/awk_i.h index 7efcc4bb..87546961 100644 --- a/ase/awk/awk_i.h +++ b/ase/awk/awk_i.h @@ -1,5 +1,5 @@ /* - * $Id: awk_i.h,v 1.8 2007/10/10 13:22:12 bacon Exp $ + * $Id: awk_i.h,v 1.9 2007/10/24 09:57:45 bacon Exp $ * * {License} */ @@ -160,7 +160,8 @@ struct ase_awk_t struct { ase_awk_bfn_t* sys; - ase_awk_bfn_t* user; + /*ase_awk_bfn_t* user;*/ + ase_awk_map_t* user; } bfn; struct diff --git a/ase/awk/err.c b/ase/awk/err.c index 60c00947..02eb12c9 100644 --- a/ase/awk/err.c +++ b/ase/awk/err.c @@ -1,5 +1,5 @@ /* - * $Id: err.c,v 1.10 2007/10/21 07:59:35 bacon Exp $ + * $Id: err.c,v 1.11 2007/10/24 09:57:45 bacon Exp $ * * {License} */ @@ -55,7 +55,7 @@ static const ase_char_t* __geterrstr (int errnum) ASE_T("a comment not closed properly"), ASE_T("a string not closed with a quote"), ASE_T("unexpected end of a regular expression"), - ASE_T("a left brace expected n place of '%.*s'"), + ASE_T("a left brace expected in place of '%.*s'"), ASE_T("a left parenthesis expected in place of '%.*s'"), ASE_T("a right parenthesis expected in place of '%.*s'"), ASE_T("a right bracket expected in place of '%.*s'"), diff --git a/ase/awk/func.c b/ase/awk/func.c index be5cf635..5834e6ec 100644 --- a/ase/awk/func.c +++ b/ase/awk/func.c @@ -1,5 +1,5 @@ /* - * $Id: func.c,v 1.11 2007/10/21 13:58:47 bacon Exp $ + * $Id: func.c,v 1.12 2007/10/24 09:57:45 bacon Exp $ * * {License} */ @@ -22,7 +22,7 @@ static int bfn_sprintf (ase_awk_run_t*, const ase_char_t*, ase_size_t); #undef MAX #define MAX ASE_TYPE_UNSIGNED_MAX(ase_size_t) -static ase_awk_bfn_t __sys_bfn[] = +static ase_awk_bfn_t sys_bfn[] = { /* io functions */ { {ASE_T("close"), 5}, ASE_AWK_EXTIO, {1, 1, ASE_NULL}, bfn_close}, @@ -49,9 +49,8 @@ void* ase_awk_addfunc ( const ase_char_t* arg_spec, int (*handler)(ase_awk_run_t*,const ase_char_t*,ase_size_t)) { - ase_awk_bfn_t* p; - - /* TODO: make function table hash-accessable */ + ase_awk_bfn_t* bfn; + ase_size_t spec_len; if (name_len <= 0) { @@ -70,144 +69,108 @@ void* ase_awk_addfunc ( return ASE_NULL; } - p = (ase_awk_bfn_t*) ASE_AWK_MALLOC (awk, ASE_SIZEOF(ase_awk_bfn_t)); - if (p == ASE_NULL) + spec_len = (arg_spec == ASE_NULL)? 0: ase_strlen(arg_spec); + + bfn = (ase_awk_bfn_t*) ASE_AWK_MALLOC (awk, + ASE_SIZEOF(ase_awk_bfn_t) + + (name_len+1) * ASE_SIZEOF(ase_char_t) + + (spec_len+1) * ASE_SIZEOF(ase_char_t)); + if (bfn == ASE_NULL) { - ase_awk_seterror (awk, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); + ase_awk_seterrnum (awk, ASE_AWK_ENOMEM); return ASE_NULL; } - p->name.ptr = ase_strxdup (name, name_len, &awk->prmfns.mmgr); - if (p->name.ptr == ASE_NULL) - { - ASE_AWK_FREE (awk, p); - ase_awk_seterror (awk, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); - return ASE_NULL; - } + bfn->name.ptr = (ase_char_t*)(bfn + 1); + bfn->name.len = name_len; + ase_strxncpy (bfn->name.ptr, name_len+1, name, name_len); - p->name.len = name_len; - p->valid = when_valid; - p->arg.min = min_args; - p->arg.max = max_args; - if (arg_spec == ASE_NULL) p->arg.spec = ASE_NULL; + bfn->valid = when_valid; + bfn->arg.min = min_args; + bfn->arg.max = max_args; + + if (arg_spec == ASE_NULL) bfn->arg.spec = ASE_NULL; else { - p->arg.spec = ase_strdup (arg_spec, &awk->prmfns.mmgr); - if (p->arg.spec == ASE_NULL) - { - ASE_AWK_FREE (awk, p->name.ptr); - ASE_AWK_FREE (awk, p); - ase_awk_seterror (awk, ASE_AWK_ENOMEM, 0, ASE_NULL, 0); - return ASE_NULL; - } + bfn->arg.spec = bfn->name.ptr + bfn->name.len + 1; + ase_strxcpy (bfn->arg.spec, spec_len+1, arg_spec); } - p->handler = handler; - p->next = awk->bfn.user; - awk->bfn.user = p; + bfn->handler = handler; - return p; + if (ase_awk_map_put (awk->bfn.user, name, name_len, bfn) == ASE_NULL) + { + ASE_AWK_FREE (awk, bfn); + ase_awk_seterrnum (awk, ASE_AWK_ENOMEM); + return ASE_NULL; + } + + return bfn; } int ase_awk_delfunc ( ase_awk_t* awk, const ase_char_t* name, ase_size_t name_len) { - ase_awk_bfn_t* p, * pp = ASE_NULL; - ase_cstr_t errarg; - - for (p = awk->bfn.user; p != ASE_NULL; p = p->next) + if (ase_awk_map_remove (awk->bfn.user, name, name_len) == -1) { - if (ase_strxncmp ( - p->name.ptr, p->name.len, name, name_len) == 0) - { - if (pp == ASE_NULL) - awk->bfn.user = p->next; - else pp->next = p->next; + ase_cstr_t errarg; - if (p->arg.spec != ASE_NULL) - ASE_AWK_FREE (awk, p->arg.spec); - ASE_AWK_FREE (awk, p->name.ptr); - ASE_AWK_FREE (awk, p); - return 0; - } + errarg.ptr = name; + errarg.len = name_len; - pp = p; + ase_awk_seterror (awk, ASE_AWK_ENOENT, 0, &errarg, 1); + return -1; } - errarg.ptr = name; - errarg.len = name_len; - - ase_awk_seterror (awk, ASE_AWK_ENOENT, 0, &errarg, 1); - return -1; + return 0; } void ase_awk_clrbfn (ase_awk_t* awk) { - ase_awk_bfn_t* p, * np; - - p = awk->bfn.user; - while (p != ASE_NULL) - { - np = p->next; - if (p->arg.spec != ASE_NULL) - ASE_AWK_FREE (awk, p->arg.spec); - ASE_AWK_FREE (awk, p->name.ptr); - ASE_AWK_FREE (awk, p); - p = np; - } - - awk->bfn.user = ASE_NULL; + ase_awk_map_clear (awk->bfn.user); } ase_awk_bfn_t* ase_awk_getbfn ( ase_awk_t* awk, const ase_char_t* name, ase_size_t len) { - ase_awk_bfn_t* p; + ase_awk_bfn_t* bfn; ase_awk_pair_t* pair; const ase_char_t* k; ase_size_t l; - for (p = __sys_bfn; p->name.ptr != ASE_NULL; p++) + /* search the system function table */ + for (bfn = sys_bfn; bfn->name.ptr != ASE_NULL; bfn++) { - if (p->valid != 0 && - (awk->option & p->valid) == 0) continue; + if (bfn->valid != 0 && + (awk->option & bfn->valid) == 0) continue; - pair = ase_awk_map_get (awk->kwtab, p->name.ptr, p->name.len); + pair = ase_awk_map_get ( + awk->kwtab, bfn->name.ptr, bfn->name.len); if (pair != ASE_NULL) { + /* found in the customized word table */ k = ((ase_cstr_t*)(pair->val))->ptr; l = ((ase_cstr_t*)(pair->val))->len; } else { - k = p->name.ptr; - l = p->name.len; + k = bfn->name.ptr; + l = bfn->name.len; } - if (ase_strxncmp (k, l, name, len) == 0) return p; + if (ase_strxncmp (k, l, name, len) == 0) return bfn; } - for (p = awk->bfn.user; p != ASE_NULL; p = p->next) - { - if (p->valid != 0 && - (awk->option & p->valid) == 0) continue; + /* no setword related operation for user-defined instrinc function + * as the name can be decided by the user upon addition. */ - pair = ase_awk_map_get (awk->kwtab, p->name.ptr, p->name.len); - if (pair != ASE_NULL) - { - k = ((ase_cstr_t*)(pair->val))->ptr; - l = ((ase_cstr_t*)(pair->val))->len; - } - else - { - k = p->name.ptr; - l = p->name.len; - } + pair = ase_awk_map_get (awk->bfn.user, name, len); + if (pair == ASE_NULL) return ASE_NULL; - if (ase_strxncmp (k, l, name, len) == 0) return p; - } + bfn = (ase_awk_bfn_t*)pair->val; + if (bfn->valid != 0 && (awk->option & bfn->valid) == 0) return ASE_NULL; - return ASE_NULL; + return bfn; } static int bfn_close ( diff --git a/ase/awk/func.h b/ase/awk/func.h index edefa60a..7183cc63 100644 --- a/ase/awk/func.h +++ b/ase/awk/func.h @@ -1,5 +1,5 @@ /* - * $Id: func.h,v 1.3 2007/04/30 05:47:33 bacon Exp $ + * $Id: func.h,v 1.4 2007/10/24 09:57:45 bacon Exp $ * * {License} */ @@ -32,7 +32,7 @@ struct ase_awk_bfn_t int (*handler) (ase_awk_run_t*, const ase_char_t*, ase_size_t); - ase_awk_bfn_t* next; + /*ase_awk_bfn_t* next;*/ }; #ifdef __cplusplus diff --git a/ase/awk/jni-dmc.def b/ase/awk/jni-dmc.def index 38ff25af..ea74a8c9 100644 --- a/ase/awk/jni-dmc.def +++ b/ase/awk/jni-dmc.def @@ -27,7 +27,11 @@ EXPORTS Java_ase_awk_Argument_getstrval Java_ase_awk_Argument_isindexed Java_ase_awk_Argument_getindexed + Java_ase_awk_Return_isindexed Java_ase_awk_Return_setintval Java_ase_awk_Return_setrealval Java_ase_awk_Return_setstrval + Java_ase_awk_Return_setindexedintval + Java_ase_awk_Return_setindexedrealval + Java_ase_awk_Return_setindexedstrval Java_ase_awk_Return_clearval diff --git a/ase/awk/jni.c b/ase/awk/jni.c index f7d11cad..3e864777 100644 --- a/ase/awk/jni.c +++ b/ase/awk/jni.c @@ -1,5 +1,5 @@ /* - * $Id: jni.c,v 1.38 2007/10/24 04:58:35 bacon Exp $ + * $Id: jni.c,v 1.40 2007/10/24 14:17:32 bacon Exp $ * * {License} */ @@ -360,7 +360,7 @@ static void throw_exception ( } #define THROW_STATIC_EXCEPTION(env,errnum) \ - throw_exception (env, ase_awk_geterrstr(ASE_ASE_NULL, errnum), errnum, 0) + throw_exception (env, ase_awk_geterrstr(ASE_NULL, errnum), errnum, 0) #define EXCEPTION_ON_ASE_NULL_AWK(env,awk) \ if (awk == ASE_NULL) \ @@ -605,7 +605,7 @@ static ase_char_t* java_strxdup (ase_awk_t* awk, const jchar* str, jint len) ase_size_t i; tmp = (ase_char_t*) ase_awk_malloc (awk, (len+1) * ASE_SIZEOF(ase_char_t)); - if (tmp == ASE_ASE_NULL) return ASE_ASE_NULL; + if (tmp == ASE_NULL) return ASE_NULL; for (i = 0; i < (ase_size_t)len; i++) tmp[i] = (ase_char_t)str[i]; tmp[i] = ASE_T('\0'); @@ -617,7 +617,7 @@ static ase_char_t* java_strxdup (ase_awk_t* awk, const jchar* str, jint len) ase_char_t* tmp; tmp = (ase_char_t*) ase_awk_malloc (awk, (len+1) * ASE_SIZEOF(ase_char_t)); - if (tmp == ASE_ASE_NULL) return ASE_ASE_NULL; + if (tmp == ASE_NULL) return ASE_NULL; ase_strncpy (tmp, (ase_char_t*)str, (ase_size_t)len); return tmp; @@ -758,7 +758,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jlong awk runio_data.obj = obj; runios.pipe = process_extio; - runios.coproc = ASE_ASE_NULL; + runios.coproc = ASE_NULL; runios.file = process_extio; runios.console = process_extio; runios.custom_data = &runio_data; @@ -792,7 +792,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_run (JNIEnv* env, jobject obj, jlong awk } mmm = (ase_char_t*) ase_awk_malloc (awk, ASE_SIZEOF(ase_char_t)*(len+1)); - if (mmm == ASE_ASE_NULL) + if (mmm == ASE_NULL) { (*env)->ReleaseStringChars (env, mfn, ptr); DELETE_CLASS_REFS (env, run_data); @@ -1764,7 +1764,7 @@ static int handle_bfn ( { jsize x; rptr = (ase_char_t*) ase_awk_malloc (awk, ASE_SIZEOF(ase_char_t)*len); - if (rptr == ASE_ASE_NULL) + if (rptr == ASE_NULL) { /* ran out of memory in exception handling. * it is freaking studid. */ @@ -1837,7 +1837,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_addfunc ( jsize x; ase_char_t* tmp = (ase_char_t*) ase_awk_malloc (awk, ASE_SIZEOF(ase_char_t)*len); - if (tmp == ASE_ASE_NULL) + if (tmp == ASE_NULL) { (*env)->ReleaseStringChars (env, name, ptr); THROW_NOMEM_EXCEPTION (env); @@ -1846,13 +1846,13 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_addfunc ( for (x = 0; x < len; x++) tmp[x] = (ase_char_t)ptr[x]; n = (ase_awk_addfunc (awk, tmp, len, 0, - min_args, max_args, ASE_ASE_NULL, handle_bfn) == ASE_NULL)? -1: 0; + min_args, max_args, ASE_NULL, handle_bfn) == ASE_NULL)? -1: 0; ase_awk_free (awk, tmp); } else { n = (ase_awk_addfunc (awk, (ase_char_t*)ptr, len, 0, - min_args, max_args, ASE_ASE_NULL, handle_bfn) == ASE_NULL)? -1: 0; + min_args, max_args, ASE_NULL, handle_bfn) == ASE_NULL)? -1: 0; } @@ -1898,7 +1898,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_delfunc ( jsize x; ase_char_t* tmp = (ase_char_t*) ase_awk_malloc (awk, ASE_SIZEOF(ase_char_t)*len); - if (tmp == ASE_ASE_NULL) + if (tmp == ASE_NULL) { (*env)->ReleaseStringChars (env, name, ptr); THROW_NOMEM_EXCEPTION (env); @@ -2003,7 +2003,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_setword ( { jsize x; ox = (ase_char_t*)ase_awk_malloc (awk, ASE_SIZEOF(ase_char_t)*ol); - if (ox == ASE_ASE_NULL) + if (ox == ASE_NULL) { if (nw != ASE_NULL) (*env)->ReleaseStringChars (env, nw, np); if (ow != ASE_NULL) (*env)->ReleaseStringChars (env, ow, op); @@ -2020,7 +2020,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_setword ( { jsize x; nx = (ase_char_t*) ase_awk_malloc (awk, ASE_SIZEOF(ase_char_t)*nl); - if (nx == ASE_ASE_NULL) + if (nx == ASE_NULL) { if (ox != (ase_char_t*)op) ase_awk_free (awk, ox); @@ -2070,7 +2070,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_setfilename ( jsize x; ase_char_t* tmp = (ase_char_t*) ase_awk_malloc (awk, ASE_SIZEOF(ase_char_t)*len); - if (tmp == ASE_ASE_NULL) + if (tmp == ASE_NULL) { (*env)->ReleaseStringChars (env, name, ptr); THROW_NOMEM_EXCEPTION (env); @@ -2115,7 +2115,7 @@ JNIEXPORT void JNICALL Java_ase_awk_Awk_setofilename ( jsize x; ase_char_t* tmp = (ase_char_t*) ase_awk_malloc (awk, ASE_SIZEOF(ase_char_t)*len); - if (tmp == ASE_ASE_NULL) + if (tmp == ASE_NULL) { (*env)->ReleaseStringChars (env, name, ptr); THROW_NOMEM_EXCEPTION (env); @@ -2296,7 +2296,7 @@ JNIEXPORT jint JNICALL Java_ase_awk_Awk_system ( ret = _tsystem(tmp); #else char* mbs = (char*)ase_awk_malloc (awk, len*5+1); - if (mbs == ASE_ASE_NULL) + if (mbs == ASE_NULL) { ase_awk_free (awk, tmp); return -1; @@ -2363,8 +2363,8 @@ JNIEXPORT jstring JNICALL Java_ase_awk_Argument_getstrval (JNIEnv* env, jobject jstring ret = ASE_NULL; str = ase_awk_valtostr ( - run, val, ASE_AWK_VALTOSTR_CLEAR, ASE_ASE_NULL, &len); - if (str == ASE_ASE_NULL) + run, val, ASE_AWK_VALTOSTR_CLEAR, ASE_NULL, &len); + if (str == ASE_NULL) { THROW_RUN_EXCEPTION (env, run); return ret; @@ -2426,7 +2426,7 @@ JNIEXPORT jobject JNICALL Java_ase_awk_Argument_getindexed (JNIEnv* env, jobject ase_char_t* rptr; ase_size_t len; - if (ASE_AWK_VAL_TYPE(val) != ASE_AWK_VAL_MAP) return ASE_ASE_NULL; + if (ASE_AWK_VAL_TYPE(val) != ASE_AWK_VAL_MAP) return ASE_NULL; len = (*env)->GetStringLength (env, index); ptr = (*env)->GetStringChars (env, index, JNI_FALSE); @@ -2436,7 +2436,7 @@ JNIEXPORT jobject JNICALL Java_ase_awk_Argument_getindexed (JNIEnv* env, jobject { ase_size_t x; rptr = (ase_char_t*) ase_awk_malloc (awk, ASE_SIZEOF(ase_char_t)*len); - if (rptr == ASE_ASE_NULL) + if (rptr == ASE_NULL) { (*env)->ReleaseStringChars (env, index, ptr); goto nomem; @@ -2450,7 +2450,7 @@ JNIEXPORT jobject JNICALL Java_ase_awk_Argument_getindexed (JNIEnv* env, jobject (*env)->ReleaseStringChars (env, index, ptr); /* the key is not found. it is not an error. val is just nil */ - if (pair == ASE_ASE_NULL) return ASE_ASE_NULL;; + if (pair == ASE_NULL) return ASE_NULL;; arg = (*env)->NewObject (env, run_data->argument_class, @@ -2467,7 +2467,15 @@ nomem: } THROW_NOMEM_EXCEPTION (env); - return ASE_ASE_NULL; + return ASE_NULL; +} + +JNIEXPORT jboolean JNICALL Java_ase_awk_Return_isindexed (JNIEnv* env, jobject obj, jlong runid, jlong valid) +{ + ase_awk_run_t* run = (ase_awk_run_t*)runid; + ase_awk_val_t* val = (ase_awk_val_t*)valid; + + return (val != ASE_NULL && ASE_AWK_VAL_TYPE(val) == ASE_AWK_VAL_MAP)? JNI_TRUE: JNI_FALSE; } JNIEXPORT void JNICALL Java_ase_awk_Return_setintval (JNIEnv* env, jobject obj, jlong runid, jlong valid, jlong newval) @@ -2554,43 +2562,321 @@ JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedintval (JNIEnv* env, jobjec { ase_awk_run_t* run = (ase_awk_run_t*)runid; ase_awk_val_t* val = (ase_awk_val_t*)valid; - ase_awk_val_t* nv; ase_awk_t* awk; run_data_t* run_data; + int opt; + const jchar* jptr; + ase_char_t* aptr; + jsize len; + awk = ase_awk_getrunawk (run); run_data = (run_data_t*)ase_awk_getruncustomdata (run); - nv = ase_awk_makeintval (run, newval); - if (nv == ASE_NULL) + opt = ase_awk_getoption (awk); + if ((opt & ASE_AWK_MAPTOVAR) != ASE_AWK_MAPTOVAR) { + /* refer to run_return in run.c */ + ase_awk_setrunerrnum (run, ASE_AWK_EMAPNOTALLOWED); THROW_RUN_EXCEPTION (env, run); return; } - if (val != ASE_NULL) + if (val == ASE_NULL || ASE_AWK_VAL_TYPE(val) != ASE_AWK_VAL_MAP) { - if (ASE_AWK_VAL_TYPE(val) != ASE_AWK_VAL_MAP) + ase_awk_val_t* x; + ase_awk_val_t* x2; + ase_awk_pair_t* pair; + + x = ase_awk_makemapval (run); + if (x == ASE_NULL) { - map = ase_awk_makemapval (run); - if (map == ASE_NULL) - { - ase_awk_refupval (run, nv); - ase_awk_refdownval (run, nv); - THROW_RUN_EXCEPTION (env, run); - return; - } + THROW_RUN_EXCEPTION (env, run); + return; + } + + ase_awk_refupval (run, x); + + x2 = ase_awk_makeintval (run, newval); + if (x2 == ASE_NULL) + { + ase_awk_refdownval (run, x); + THROW_RUN_EXCEPTION (env, run); + return; + } + + ase_awk_refupval (run, x2); + + if (get_str(env,awk,index,&jptr,&aptr,&len) == -1) + { + ase_awk_refdownval (run, x2); + ase_awk_refdownval (run, x); + THROW_NOMEM_EXCEPTION (env); + return; + } + + pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)x)->map, aptr, len, x2); + free_str (env, awk, index, jptr, aptr); + if (pair == ASE_NULL) + { + ase_awk_refdownval (run, x2); + ase_awk_refdownval (run, x); + THROW_RUN_EXCEPTION (env, run); + return; + } + + if (val != ASE_NULL) ase_awk_refdownval (run, val); + (*env)->SetLongField (env, obj, run_data->return_valid, (jlong)x); + } + else + { + ase_awk_val_t* x2; + ase_awk_pair_t* pair; + + x2 = ase_awk_makeintval (run, newval); + if (x2 == ASE_NULL) + { + THROW_RUN_EXCEPTION (env, run); + return; + } + + ase_awk_refupval (run, x2); + + if (get_str(env,awk,index,&jptr,&aptr,&len) == -1) + { + ase_awk_refdownval (run, x2); + THROW_NOMEM_EXCEPTION (env); + return; + } + pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)val)->map, aptr, len, x2); + free_str (env, awk, index, jptr, aptr); + if (pair == ASE_NULL) + { + ase_awk_refdownval (run, x2); + THROW_NOMEM_EXCEPTION (env); + return; } } } -JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedintval (JNIEnv* env, jobject obj, jlong runid, jlong valid, jstring index, jdouble newval) +JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedrealval (JNIEnv* env, jobject obj, jlong runid, jlong valid, jstring index, jdouble newval) { + ase_awk_run_t* run = (ase_awk_run_t*)runid; + ase_awk_val_t* val = (ase_awk_val_t*)valid; + ase_awk_t* awk; + run_data_t* run_data; + int opt; + const jchar* jptr; + ase_char_t* aptr; + jsize len; + + awk = ase_awk_getrunawk (run); + run_data = (run_data_t*)ase_awk_getruncustomdata (run); + + opt = ase_awk_getoption (awk); + if ((opt & ASE_AWK_MAPTOVAR) != ASE_AWK_MAPTOVAR) + { + /* refer to run_return in run.c */ + ase_awk_setrunerrnum (run, ASE_AWK_EMAPNOTALLOWED); + THROW_RUN_EXCEPTION (env, run); + return; + } + + if (val == ASE_NULL || ASE_AWK_VAL_TYPE(val) != ASE_AWK_VAL_MAP) + { + ase_awk_val_t* x; + ase_awk_val_t* x2; + ase_awk_pair_t* pair; + + x = ase_awk_makemapval (run); + if (x == ASE_NULL) + { + THROW_RUN_EXCEPTION (env, run); + return; + } + + ase_awk_refupval (run, x); + + x2 = ase_awk_makerealval (run, newval); + if (x2 == ASE_NULL) + { + ase_awk_refdownval (run, x); + THROW_RUN_EXCEPTION (env, run); + return; + } + + ase_awk_refupval (run, x2); + + if (get_str(env,awk,index,&jptr,&aptr,&len) == -1) + { + ase_awk_refdownval (run, x2); + ase_awk_refdownval (run, x); + THROW_NOMEM_EXCEPTION (env); + return; + } + + pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)x)->map, aptr, len, x2); + free_str (env, awk, index, jptr, aptr); + if (pair == ASE_NULL) + { + ase_awk_refdownval (run, x2); + ase_awk_refdownval (run, x); + THROW_RUN_EXCEPTION (env, run); + return; + } + + if (val != ASE_NULL) ase_awk_refdownval (run, val); + (*env)->SetLongField (env, obj, run_data->return_valid, (jlong)x); + } + else + { + ase_awk_val_t* x2; + ase_awk_pair_t* pair; + + x2 = ase_awk_makerealval (run, newval); + if (x2 == ASE_NULL) + { + THROW_RUN_EXCEPTION (env, run); + return; + } + + ase_awk_refupval (run, x2); + + if (get_str(env,awk,index,&jptr,&aptr,&len) == -1) + { + ase_awk_refdownval (run, x2); + THROW_NOMEM_EXCEPTION (env); + return; + } + pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)val)->map, aptr, len, x2); + free_str (env, awk, index, jptr, aptr); + if (pair == ASE_NULL) + { + ase_awk_refdownval (run, x2); + THROW_NOMEM_EXCEPTION (env); + return; + } + } } -JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedintval (JNIEnv* env, jobject obj, jlong runid, jlong valid, jstring index, jstring newval) +JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedstrval (JNIEnv* env, jobject obj, jlong runid, jlong valid, jstring index, jstring newval) { + ase_awk_run_t* run = (ase_awk_run_t*)runid; + ase_awk_val_t* val = (ase_awk_val_t*)valid; + ase_awk_t* awk; + run_data_t* run_data; + + int opt; + const jchar* jptr; + ase_char_t* aptr; + jsize len; + + awk = ase_awk_getrunawk (run); + run_data = (run_data_t*)ase_awk_getruncustomdata (run); + + opt = ase_awk_getoption (awk); + if ((opt & ASE_AWK_MAPTOVAR) != ASE_AWK_MAPTOVAR) + { + /* refer to run_return in run.c */ + ase_awk_setrunerrnum (run, ASE_AWK_EMAPNOTALLOWED); + THROW_RUN_EXCEPTION (env, run); + return; + } + + if (val == ASE_NULL || ASE_AWK_VAL_TYPE(val) != ASE_AWK_VAL_MAP) + { + ase_awk_val_t* x; + ase_awk_val_t* x2; + ase_awk_pair_t* pair; + + x = ase_awk_makemapval (run); + if (x == ASE_NULL) + { + THROW_RUN_EXCEPTION (env, run); + return; + } + + ase_awk_refupval (run, x); + + if (get_str(env,awk,newval,&jptr,&aptr,&len) == -1) + { + ase_awk_refdownval (run, x); + THROW_NOMEM_EXCEPTION (env); + return; + } + x2 = ase_awk_makestrval (run, aptr, len); + free_str (env, awk, index, jptr, aptr); + if (x2 == ASE_NULL) + { + ase_awk_refdownval (run, x); + THROW_RUN_EXCEPTION (env, run); + return; + } + + ase_awk_refupval (run, x2); + + if (get_str(env,awk,index,&jptr,&aptr,&len) == -1) + { + ase_awk_refdownval (run, x2); + ase_awk_refdownval (run, x); + THROW_NOMEM_EXCEPTION (env); + return; + } + pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)x)->map, aptr, len, x2); + free_str (env, awk, index, jptr, aptr); + if (pair == ASE_NULL) + { + ase_awk_refdownval (run, x2); + ase_awk_refdownval (run, x); + THROW_RUN_EXCEPTION (env, run); + return; + } + + if (val != ASE_NULL) ase_awk_refdownval (run, val); + (*env)->SetLongField (env, obj, run_data->return_valid, (jlong)x); + } + else + { + ase_awk_val_t* x2; + ase_awk_pair_t* pair; + + if (get_str(env,awk,newval,&jptr,&aptr,&len) == -1) + { + THROW_NOMEM_EXCEPTION (env); + return; + } + x2 = ase_awk_makestrval (run, aptr, len); + free_str (env, awk, index, jptr, aptr); + if (x2 == ASE_NULL) + { + THROW_RUN_EXCEPTION (env, run); + return; + } + + ase_awk_refupval (run, x2); + + if (get_str(env,awk,index,&jptr,&aptr,&len) == -1) + { + ase_awk_refdownval (run, x2); + THROW_NOMEM_EXCEPTION (env); + return; + } + pair = ase_awk_map_put ( + ((ase_awk_val_map_t*)val)->map, aptr, len, x2); + free_str (env, awk, index, jptr, aptr); + if (pair == ASE_NULL) + { + ase_awk_refdownval (run, x2); + THROW_NOMEM_EXCEPTION (env); + return; + } + } } diff --git a/ase/awk/jni.def b/ase/awk/jni.def index dbdde0c6..474a2aab 100644 --- a/ase/awk/jni.def +++ b/ase/awk/jni.def @@ -26,7 +26,11 @@ EXPORTS Java_ase_awk_Argument_getstrval Java_ase_awk_Argument_isindexed Java_ase_awk_Argument_getindexed + Java_ase_awk_Return_isindexed Java_ase_awk_Return_setintval Java_ase_awk_Return_setrealval Java_ase_awk_Return_setstrval + Java_ase_awk_Return_setindexedintval + Java_ase_awk_Return_setindexedrealval + Java_ase_awk_Return_setindexedstrval Java_ase_awk_Return_clearval diff --git a/ase/awk/jni.h b/ase/awk/jni.h index 84bd1be8..8c8a5e1f 100644 --- a/ase/awk/jni.h +++ b/ase/awk/jni.h @@ -1,5 +1,5 @@ /* - * $Id: jni.h,v 1.14 2007/10/24 04:58:35 bacon Exp $ + * $Id: jni.h,v 1.15 2007/10/24 14:17:32 bacon Exp $ * * {License} */ @@ -67,9 +67,13 @@ JNIEXPORT jstring JNICALL Java_ase_awk_Argument_getstrval (JNIEnv* env, jobject 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); +JNIEXPORT jboolean JNICALL Java_ase_awk_Return_isindexed (JNIEnv* env, jobject obj, jlong runid, jlong valid); JNIEXPORT void JNICALL Java_ase_awk_Return_setintval (JNIEnv* env, jobject obj, jlong runid, jlong valid, jlong newval); JNIEXPORT void JNICALL Java_ase_awk_Return_setrealval (JNIEnv* env, jobject obj, jlong runid, jlong valid, jdouble newval); JNIEXPORT void JNICALL Java_ase_awk_Return_setstrval (JNIEnv* env, jobject obj, jlong runid, jlong valid, jstring newval); +JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedintval (JNIEnv* env, jobject obj, jlong runid, jlong valid, jstring index, jlong newval); +JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedrealval (JNIEnv* env, jobject obj, jlong runid, jlong valid, jstring index, jdouble newval); +JNIEXPORT void JNICALL Java_ase_awk_Return_setindexedstrval (JNIEnv* env, jobject obj, jlong runid, jlong valid, jstring index, jstring newval); JNIEXPORT void JNICALL Java_ase_awk_Return_clearval (JNIEnv* env, jobject obj, jlong runid, jlong valid); #ifdef __cplusplus diff --git a/ase/awk/parse.c b/ase/awk/parse.c index b3904b06..5b051bbf 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.20 2007/10/10 07:03:56 bacon Exp $ + * $Id: parse.c,v 1.22 2007/10/24 14:17:32 bacon Exp $ * * {License} */ @@ -3027,6 +3027,26 @@ static ase_awk_nde_t* parse_primary_ident (ase_awk_t* awk, ase_size_t line) } /* search the global variable list */ +// TODO soemthing for setword + //ase_awk_pair_t* pair; + //const ase_char_t* k; + //ase_size_t l; + //check if name_dup and name_len is part of gtab.... + //if it is so... + + //pair = ase_awk_map_get (awk->kwtab, name_dup, name_len); + //if (pair != ASE_NULL) + //{ + /* found in the customized word table */ + // k = ((ase_cstr_t*)(pair->val))->ptr; + // l = ((ase_cstr_t*)(pair->val))->len; + //} + //else + //{ + // k = name_dup; + // l = name_len; + //} + idxa = ase_awk_tab_rrfind ( &awk->parse.globals, 0, name_dup, name_len); if (idxa != (ase_size_t)-1) @@ -3163,6 +3183,7 @@ static ase_awk_nde_t* parse_hashidx ( /* search the global variable list */ idxa = ase_awk_tab_rrfind(&awk->parse.globals, 0, name, name_len); +// TODO soemthing for setword if (idxa != (ase_size_t)-1) { nde->type = ASE_AWK_NDE_GLOBALIDX; diff --git a/ase/test/awk/AseAwkPanel.java b/ase/test/awk/AseAwkPanel.java index 7b5bceb4..37ff30a3 100644 --- a/ase/test/awk/AseAwkPanel.java +++ b/ase/test/awk/AseAwkPanel.java @@ -1,5 +1,5 @@ /* - * $Id: AseAwkPanel.java,v 1.8 2007/10/24 03:46:51 bacon Exp $ + * $Id: AseAwkPanel.java,v 1.10 2007/10/24 14:17:32 bacon Exp $ */ import java.awt.*; @@ -92,13 +92,24 @@ public class AseAwkPanel extends Panel this.awkPanel = awkPanel; addFunction ("sleep", 1, 1); + setWord ("sin", "cain"); + setWord ("length", "len"); + setWord ("OFMT", "ofmt"); + + setOption (getOption() | StdAwk.OPTION_MAPTOVAR); } public void sleep (Context ctx, String name, Return ret, Argument[] args) { try { Thread.sleep (args[0].getIntValue() * 1000); } catch (InterruptedException e) {} - ret.setIntValue (0); + //ret.setIntValue (0); + // + ret.setIndexedRealValue (1, 111.23); + ret.setIndexedStringValue (2, "kdk2kd"); + ret.setIndexedStringValue (3, "3dk3kd"); + ret.setIndexedIntValue (4, 444); + ret.setIndexedIntValue (5, 55555); } protected int openSource (int mode)