From 241470730d4dd03dd960d9823a7d6fa887b14e45 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Tue, 12 Sep 2006 15:20:18 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/awk.h | 3 +- ase/awk/func.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++-- ase/awk/run.c | 46 ++++++++++------ 3 files changed, 168 insertions(+), 22 deletions(-) diff --git a/ase/awk/awk.h b/ase/awk/awk.h index 9529a315..911744f6 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h,v 1.114 2006-09-10 15:50:34 bacon Exp $ + * $Id: awk.h,v 1.115 2006-09-12 15:20:18 bacon Exp $ */ #ifndef _XP_AWK_AWK_H_ @@ -344,6 +344,7 @@ xp_awk_val_t* xp_awk_getglobal (void* run, xp_size_t idx); int xp_awk_setglobal (void* run, xp_size_t idx, xp_awk_val_t* val); void xp_awk_seterrnum (void* run, int errnum); void xp_awk_setretval (void* run, xp_awk_val_t* val); +int xp_awk_setrecord (void* run, const xp_char_t* str, xp_size_t len); /* utility functions exported by awk.h */ xp_long_t xp_awk_strtolong ( diff --git a/ase/awk/func.c b/ase/awk/func.c index 75903a2d..d7f5bd4f 100644 --- a/ase/awk/func.c +++ b/ase/awk/func.c @@ -1,5 +1,5 @@ /* - * $Id: func.c,v 1.48 2006-09-11 14:29:22 bacon Exp $ + * $Id: func.c,v 1.49 2006-09-12 15:20:18 bacon Exp $ */ #include @@ -801,10 +801,16 @@ static int __bfn_gsub (xp_awk_t* awk, void* run) { xp_size_t nargs; xp_awk_val_t* a0, * a1, * a2; - xp_char_t* a0_ptr, * a1_ptr; - xp_size_t a0_len, a1_len; + xp_char_t* a0_ptr, * a1_ptr, * a2_ptr; + xp_size_t a0_len, a1_len, a2_len; xp_char_t* a0_ptr_free = XP_NULL; xp_char_t* a1_ptr_free = XP_NULL; + xp_char_t* a2_ptr_free = XP_NULL; + void* rex; + int opt, n; + const xp_char_t* cur_ptr, * match_ptr; + xp_size_t cur_len, match_len; + xp_awk_str_t new; nargs = xp_awk_getnargs (run); xp_assert (nargs >= 2 && nargs <= 3); @@ -844,17 +850,142 @@ static int __bfn_gsub (xp_awk_t* awk, void* run) a1_ptr_free = a1_ptr; } -/* TODO: */ if (a2 == XP_NULL) { - /* operation is on $0 */ + /* TODO; is this correct??? need to use inrec.d0?? */ + a2_ptr = XP_AWK_STR_BUF(&((xp_awk_run_t*)run)->inrec.line); + a2_len = XP_AWK_STR_LEN(&((xp_awk_run_t*)run)->inrec.line); } else { /* operation is on a2 */ + /* + a2ref = (xp_awk_val_t**)((xp_awk_val_ref_t*)a2)->adr; + if ((*a2ref)->type != XP_AWK_VAL_NIL && + (*a2ref)->type != XP_AWK_VAL_MAP) + { + } + */ } + rex = xp_awk_buildrex (awk, + a0_ptr, a0_len, &((xp_awk_run_t*)run)->errnum); + if (rex == XP_NULL) + { + if (a2_ptr_free != XP_NULL) XP_AWK_FREE (awk, a2_ptr_free); + if (a1_ptr_free != XP_NULL) XP_AWK_FREE (awk, a1_ptr_free); + if (a0_ptr_free != XP_NULL) XP_AWK_FREE (awk, a0_ptr_free); + return -1; + } + opt = (((xp_awk_run_t*)run)->rex.ignorecase)? XP_AWK_REX_IGNORECASE: 0; + cur_ptr = a2_ptr; + cur_len = a2_len; + + if (xp_awk_str_open (&new, a2_len, awk) == XP_NULL) + { + xp_awk_freerex (awk, rex); + if (a2_ptr_free != XP_NULL) XP_AWK_FREE (awk, a2_ptr_free); + if (a1_ptr_free != XP_NULL) XP_AWK_FREE (awk, a1_ptr_free); + if (a0_ptr_free != XP_NULL) XP_AWK_FREE (awk, a0_ptr_free); + xp_awk_seterrnum (run, XP_AWK_ENOMEM); + return -1; + } + + while (1) + { + n = xp_awk_matchrex ( + awk, rex, opt, cur_ptr, cur_len, + &match_ptr, &match_len, &((xp_awk_run_t*)run)->errnum); + if (n == -1) + { + xp_awk_str_close (&new); + xp_awk_freerex (awk, rex); + if (a2_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a2_ptr_free); + if (a1_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a1_ptr_free); + if (a0_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a0_ptr_free); + return -1; + } + + if (n == 0) + { + /* no more match found */ + if (xp_awk_str_ncat ( + &new, cur_ptr, cur_len) == (xp_size_t)-1) + { + xp_awk_str_close (&new); + xp_awk_freerex (awk, rex); + if (a2_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a2_ptr_free); + if (a1_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a1_ptr_free); + if (a0_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a0_ptr_free); + return -1; + } + break; + } + + if (xp_awk_str_ncat (&new, + cur_ptr, match_ptr - cur_ptr) == (xp_size_t)-1) + { + xp_awk_str_close (&new); + xp_awk_freerex (awk, rex); + if (a2_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a2_ptr_free); + if (a1_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a1_ptr_free); + if (a0_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a0_ptr_free); + return -1; + } + /*TODO: handle & */ + if (xp_awk_str_ncat (&new, a1_ptr, a1_len) == (xp_size_t)-1) + { + xp_awk_str_close (&new); + xp_awk_freerex (awk, rex); + if (a2_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a2_ptr_free); + if (a1_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a1_ptr_free); + if (a0_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a0_ptr_free); + return -1; + } + + cur_ptr = match_ptr + match_len; + cur_len = cur_len - ((match_ptr - cur_ptr) + match_len); + } + + xp_awk_freerex (awk, rex); + +xp_printf (XP_T("NEW STRING [%s]\n"), XP_AWK_STR_BUF(&new)); + if (a2 == XP_NULL) + { + if (xp_awk_setrecord (run, + XP_AWK_STR_BUF(&new), XP_AWK_STR_LEN(&new)) == -1) + { + xp_awk_str_close (&new); + if (a2_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a2_ptr_free); + if (a1_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a1_ptr_free); + if (a0_ptr_free != XP_NULL) + XP_AWK_FREE (awk, a0_ptr_free); + return -1; + } + } + else + { + /* TODO: */ + } + + xp_awk_str_close (&new); + + if (a2_ptr_free != XP_NULL) XP_AWK_FREE (awk, a2_ptr_free); if (a1_ptr_free != XP_NULL) XP_AWK_FREE (awk, a1_ptr_free); if (a0_ptr_free != XP_NULL) XP_AWK_FREE (awk, a0_ptr_free); diff --git a/ase/awk/run.c b/ase/awk/run.c index 9353f0d1..6a878ea5 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c,v 1.200 2006-09-11 03:20:42 bacon Exp $ + * $Id: run.c,v 1.201 2006-09-12 15:20:18 bacon Exp $ */ #include @@ -4690,14 +4690,9 @@ static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde) if (p->var == XP_NULL) { /* set $0 with the input value */ - if (__clear_record (run, xp_false) == -1) - { - xp_awk_str_close (&buf); - return XP_NULL; - } - - if (__set_record (run, - XP_AWK_STR_BUF(&buf), XP_AWK_STR_LEN(&buf)) == -1) + if (xp_awk_setrecord (run, + XP_AWK_STR_BUF(&buf), + XP_AWK_STR_LEN(&buf)) == -1) { xp_awk_str_close (&buf); return XP_NULL; @@ -4791,9 +4786,12 @@ static int __read_record (xp_awk_run_t* run) run, XP_AWK_IN_CONSOLE, XP_T(""), &run->inrec.line); if (n < 0) { - if (run->errnum == XP_AWK_EIOHANDLER) - PANIC_I (run, XP_AWK_ECONINDATA); - else return -1; + int errnum = run->errnum; + __clear_record (run, xp_false); + run->errnum = + (errnum == XP_AWK_EIOHANDLER)? + XP_AWK_ECONINDATA: errnum; + return -1; } if (n == 0) { @@ -4808,7 +4806,23 @@ static int __read_record (xp_awk_run_t* run) return 1; } -static int __set_record (xp_awk_run_t* run, const xp_char_t* str, xp_size_t len) +int xp_awk_setrecord (void* run, const xp_char_t* str, xp_size_t len) +{ + if (__clear_record (run, xp_false) == -1) return -1; + + if (xp_awk_str_ncpy ( + &((xp_awk_run_t*)run)->inrec.line, str, len) == (xp_size_t)-1) + { + __clear_record (run, xp_false); + ((xp_awk_run_t*)run)->errnum = XP_AWK_ENOMEM; + return -1; + } + + return __set_record (run, str, len); +} + +static int __set_record ( + xp_awk_run_t* run, const xp_char_t* str, xp_size_t len) { xp_awk_val_t* v; int errnum; @@ -4820,7 +4834,7 @@ static int __set_record (xp_awk_run_t* run, const xp_char_t* str, xp_size_t len) PANIC_I (run, XP_AWK_ENOMEM); } - xp_assert (run->inrec.d0 == xp_awk_val_nil); + xp_assert (run->inrec.d0->type == XP_AWK_VAL_NIL); /* the record should be clear cleared before this function is called * as it doesn't call xp_awk_refdownval on run->inrec.d0 */ run->inrec.d0 = v; @@ -5082,7 +5096,7 @@ static int __recomp_record_fields ( v = STACK_GLOBAL(run, XP_AWK_GLOBAL_OFS); xp_awk_refupval (v); - if (v == xp_awk_val_nil) + if (v->type == XP_AWK_VAL_NIL) { /* OFS not set */ ofs = XP_T(" "); @@ -5238,7 +5252,7 @@ static int __shorten_record (xp_awk_run_t* run, xp_size_t nflds) v = STACK_GLOBAL(run, XP_AWK_GLOBAL_OFS); xp_awk_refupval (v); - if (v == xp_awk_val_nil) + if (v->type == XP_AWK_VAL_NIL) { /* OFS not set */ ofs = XP_T(" ");