diff --git a/ase/awk/awk_i.h b/ase/awk/awk_i.h index c2c65a49..b0ef472f 100644 --- a/ase/awk/awk_i.h +++ b/ase/awk/awk_i.h @@ -1,5 +1,5 @@ /* - * $Id: awk_i.h,v 1.67 2006-10-15 15:45:41 bacon Exp $ + * $Id: awk_i.h,v 1.68 2006-10-17 09:36:08 bacon Exp $ */ #ifndef _XP_AWK_AWKI_H_ @@ -230,6 +230,7 @@ struct xp_awk_run_t void* rs; void* fs; int ignorecase; + xp_size_t fnr; struct { diff --git a/ase/awk/func.c b/ase/awk/func.c index cde95901..0ec2406b 100644 --- a/ase/awk/func.c +++ b/ase/awk/func.c @@ -1,5 +1,5 @@ /* - * $Id: func.c,v 1.63 2006-10-16 08:47:59 bacon Exp $ + * $Id: func.c,v 1.64 2006-10-17 09:36:08 bacon Exp $ */ #include @@ -29,24 +29,25 @@ static int __bfn_system (xp_awk_run_t* run); static xp_awk_bfn_t __sys_bfn[] = { /* io functions */ - { XP_T("close"), 5, XP_AWK_EXTIO, 1, 1, XP_NULL, __bfn_close }, - { XP_T("fflush"), 6, XP_AWK_EXTIO, 0, 1, XP_NULL, __bfn_fflush }, + { XP_T("close"), 5, XP_AWK_EXTIO, 1, 1, XP_NULL, __bfn_close }, + { XP_T("fflush"), 6, XP_AWK_EXTIO, 0, 1, XP_NULL, __bfn_fflush }, /* string functions */ - { XP_T("index"), 5, 0, 2, 2, XP_NULL, __bfn_index }, - { XP_T("length"), 6, 0, 1, 1, XP_NULL, __bfn_length }, - { XP_T("substr"), 6, 0, 2, 3, XP_NULL, __bfn_substr }, + { XP_T("index"), 5, 0, 2, 2, XP_NULL, __bfn_index }, + { XP_T("length"), 6, 0, 1, 1, XP_NULL, __bfn_length }, + { XP_T("substr"), 6, 0, 2, 3, XP_NULL, __bfn_substr }, { XP_T("split"), 5, 0, 2, 3, XP_T("vrv"), __bfn_split }, - { XP_T("tolower"), 7, 0, 1, 1, XP_NULL, __bfn_tolower }, - { XP_T("toupper"), 7, 0, 1, 1, XP_NULL, __bfn_toupper }, + { XP_T("tolower"), 7, 0, 1, 1, XP_NULL, __bfn_tolower }, + { XP_T("toupper"), 7, 0, 1, 1, XP_NULL, __bfn_toupper }, { XP_T("gsub"), 4, 0, 2, 3, XP_T("xvr"), __bfn_gsub }, { XP_T("sub"), 3, 0, 2, 3, XP_T("xvr"), __bfn_sub }, + /*{ XP_T("match"), 5, 0, ... }, */ /* TODO: remove these two functions */ - { XP_T("system"), 6, 0, 1, 1, XP_NULL, __bfn_system }, - /*{ XP_T("sin"), 3, 0, 1, 1, XP_NULL, __bfn_sin },*/ + { XP_T("system"), 6, 0, 1, 1, XP_NULL, __bfn_system }, + /*{ XP_T("sin"), 3, 0, 1, 1, XP_NULL, __bfn_sin },*/ - { XP_NULL, 0, 0, 0, 0, XP_NULL, XP_NULL } + { XP_NULL, 0, 0, 0, 0, XP_NULL, XP_NULL } }; xp_awk_bfn_t* xp_awk_addbfn ( diff --git a/ase/awk/jni.c b/ase/awk/jni.c index aee17f7e..23fe0103 100644 --- a/ase/awk/jni.c +++ b/ase/awk/jni.c @@ -1,5 +1,5 @@ /* - * $Id: jni.c,v 1.8 2006-10-15 15:45:41 bacon Exp $ + * $Id: jni.c,v 1.9 2006-10-17 09:36:08 bacon Exp $ */ #include @@ -211,13 +211,20 @@ JNIEXPORT void JNICALL Java_xpkit_xpj_awk_Awk_run (JNIEnv* env, jobject obj) } } -JNIEXPORT void JNICALL Java_xpkit_xpj_awk_Awk_set_1extio_1handle ( +JNIEXPORT void JNICALL Java_xpkit_xpj_awk_Awk_set_1extio ( JNIEnv* env, jobject obj, jlong extio, jobject handle) { xp_awk_extio_t* epa = (xp_awk_extio_t*)extio; epa->handle = (void*)handle; } +JNIEXPORT jobject JNICALL Java_xpkit_xpj_awk_Awk_get_1extio ( + JNIEnv* env, jobject obj, jlong extio) +{ + xp_awk_extio_t* epa = (xp_awk_extio_t*)extio; + return (jobject)epa->handle; +} + static xp_ssize_t __call_java_open_source (JNIEnv* env, jobject obj, int mode) { jclass class; diff --git a/ase/awk/jni.def b/ase/awk/jni.def index c79cd9ed..e2b72ba1 100644 --- a/ase/awk/jni.def +++ b/ase/awk/jni.def @@ -5,4 +5,6 @@ EXPORTS Java_xpkit_xpj_awk_Awk_close Java_xpkit_xpj_awk_Awk_parse Java_xpkit_xpj_awk_Awk_run + Java_xpkit_xpj_awk_Awk_get_1extio + Java_xpkit_xpj_awk_Awk_set_1extio diff --git a/ase/awk/run.c b/ase/awk/run.c index 0a4a8ba4..511bf46c 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.238 2006-10-16 14:38:43 bacon Exp $ + * $Id: run.c,v 1.239 2006-10-17 09:36:08 bacon Exp $ */ #include @@ -896,6 +896,29 @@ static int __build_runarg (xp_awk_run_t* run, xp_awk_runarg_t* runarg) return 0; } +static int __update_fnr (xp_awk_run_t* run, xp_size_t fnr) +{ + xp_awk_val_t* tmp; + + tmp = xp_awk_makeintval (run, fnr); + if (tmp == XP_NULL) + { + run->errnum = XP_AWK_ENOMEM; + return -1; + } + + xp_awk_refupval (tmp); + if (xp_awk_setglobal (run, XP_AWK_GLOBAL_FNR, tmp) == -1) + { + xp_awk_refdownval (run, tmp); + return -1; + } + + xp_awk_refdownval (run, tmp); + run->global.fnr = fnr; + return 0; +} + static int __set_globals_to_default (xp_awk_run_t* run) { struct __gtab_t @@ -1015,7 +1038,8 @@ static int __run_main (xp_awk_run_t* run, xp_awk_runarg_t* runarg) run->exit_level = EXIT_NONE; - n = __set_globals_to_default (run); + n = __update_fnr (run, 0); + if (n == 0) n = __set_globals_to_default (run); if (n == 0 && (run->awk->option & XP_AWK_RUNMAIN)) { /* TODO: should the main function be user-specifiable? */ @@ -1189,6 +1213,8 @@ static int __run_pattern_blocks (xp_awk_run_t* run) need_to_close = xp_true; if (x == 0) break; /* end of input */ + __update_fnr (run, run->global.fnr + 1); + if (__run_pattern_block_chain (run, run->awk->tree.chain) == -1) { int saved = run->errnum; @@ -1878,15 +1904,16 @@ static int __run_nextfile (xp_awk_run_t* run, xp_awk_nde_nextfile_t* nde) if (run->active_block == (xp_awk_nde_blk_t*)run->awk->tree.begin || run->active_block == (xp_awk_nde_blk_t*)run->awk->tree.end) { - PANIC_I (run, XP_AWK_ENEXTFILECALL); + run->errnum = XP_AWK_ENEXTFILECALL; + return -1; } n = xp_awk_nextextio_read (run, XP_AWK_IN_CONSOLE, XP_T("")); if (n == -1) { if (run->errnum == XP_AWK_EIOHANDLER) - PANIC_I (run, XP_AWK_ECONINNEXT); - else return -1; + run->errnum = XP_AWK_ECONINNEXT; + return -1; } if (n == 0) @@ -1896,9 +1923,9 @@ static int __run_nextfile (xp_awk_run_t* run, xp_awk_nde_nextfile_t* nde) return 0; } -/* TODO: update FILENAME, ARGIND. reset FNR to 1. - * some significant changes will be required to do this */ -/* Consider using FILENAME_IN and FILENAME_OUT to accomplish nextfile in/out */ + if (__update_fnr (run, 0) == -1) return -1; + +/* TODO: Consider using FILENAME_IN and FILENAME_OUT to accomplish nextfile in/out */ run->exit_level = EXIT_NEXT; return 0; } @@ -2561,20 +2588,13 @@ static xp_awk_val_t* __do_assignment_map ( } else if (var->type == XP_AWK_NDE_GLOBALIDX) { - /* decrease the reference count of the previous value. - * in fact, this is not necessary as map is always - * xp_awk_val_nil here. */ - /* - xp_awk_refdownval (run, (xp_awk_val_t*)map); - STACK_GLOBAL(run,var->id.idxa) = tmp; xp_awk_refupval (tmp); - */ if (xp_awk_setglobal (run, var->id.idxa, tmp) == -1) { - xp_awk_refupval (tmp); xp_awk_refdownval (run, tmp); return XP_NULL; } + xp_awk_refdownval (run, tmp); } else if (var->type == XP_AWK_NDE_LOCALIDX) { diff --git a/ase/test/awk/t18.awk b/ase/test/awk/t18.awk index c37d2f0a..1e012fff 100644 --- a/ase/test/awk/t18.awk +++ b/ase/test/awk/t18.awk @@ -1,13 +1,17 @@ +BEGIN { + print "0. FILENAME=", FILENAME, "FNR=", FNR; +} + /hello/ { - print FILENAME; - print "**1**" $0; + print "1. FILENAME=", FILENAME, "FNR=", FNR; + print "[" $0 "]"; #nextfile; print "----------------"; } /hello/ { - print FILENAME; - print "**2**" $0; + print "2. FILENAME=", FILENAME, "FNR=", FNR; + print "[" $0 "]"; nextfile; print "----------------"; }