From fd56a19a79b0238385ce3fe341235cd992b5d875 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 9 Mar 2020 08:52:42 +0000 Subject: [PATCH] added @pragma stripstrspc on/off added a new global variable STRIPSTRSPC --- hawk/lib/Hawk.cpp | 4 +- hawk/lib/fnc.c | 29 ++++---- hawk/lib/hawk-prv.h | 7 +- hawk/lib/hawk.c | 2 +- hawk/lib/hawk.h | 17 ++--- hawk/lib/misc.c | 4 +- hawk/lib/mod-str.c | 4 +- hawk/lib/parse.c | 60 +++++++++++++--- hawk/lib/rio.c | 12 ++-- hawk/lib/run.c | 171 ++++++++++++++++++++++++-------------------- hawk/lib/std.c | 8 +-- hawk/lib/val.c | 32 ++++----- 12 files changed, 206 insertions(+), 144 deletions(-) diff --git a/hawk/lib/Hawk.cpp b/hawk/lib/Hawk.cpp index 76ea8d2e..60bbbb6a 100644 --- a/hawk/lib/Hawk.cpp +++ b/hawk/lib/Hawk.cpp @@ -1795,8 +1795,8 @@ int Hawk::call (const hawk_uch_t* name, Value* ret, const Value* args, hawk_oow_ int Hawk::exec (Value* ret, const Value* args, hawk_oow_t nargs) { - return (this->runctx.rtx->awk->parse.pragma.entry[0] != '\0')? - this->call(this->runctx.rtx->awk->parse.pragma.entry, ret, args, nargs): this->loop(ret); + return (this->runctx.rtx->hawk->parse.pragma.entry[0] != '\0')? + this->call(this->runctx.rtx->hawk->parse.pragma.entry, ret, args, nargs): this->loop(ret); } void Hawk::halt () diff --git a/hawk/lib/fnc.c b/hawk/lib/fnc.c index 2cb34a1b..98435be6 100644 --- a/hawk/lib/fnc.c +++ b/hawk/lib/fnc.c @@ -1095,7 +1095,7 @@ static int __substitute (hawk_rtx_t* rtx, hawk_int_t max_count) a1 = hawk_rtx_getarg(rtx, 1); a2 = (nargs >= 3)? hawk_rtx_getarg(rtx, 2): HAWK_NULL; - a0_vtype = HAWK_RTX_GETVALTYPE (rtx, a0); + a0_vtype = HAWK_RTX_GETVALTYPE(rtx, a0); HAWK_ASSERT (a2 == HAWK_NULL || HAWK_RTX_GETVALTYPE(rtx, a2) == HAWK_VAL_REF); if (a0_vtype == HAWK_VAL_REX) @@ -1110,12 +1110,12 @@ static int __substitute (hawk_rtx_t* rtx, hawk_int_t max_count) else { s0.ptr = hawk_rtx_valtooocstrdup(rtx, a0, &s0.len); - if (s0.ptr == HAWK_NULL) goto oops; + if (HAWK_UNLIKELY(!s0.ptr)) goto oops; s0_free = (hawk_ooch_t*)s0.ptr; } s1.ptr = hawk_rtx_getvaloocstr(rtx, a1, &s1.len); - if (s1.ptr == HAWK_NULL) goto oops; + if (HAWK_UNLIKELY(!s1.ptr)) goto oops; if (a2 == HAWK_NULL) { @@ -1126,7 +1126,7 @@ static int __substitute (hawk_rtx_t* rtx, hawk_int_t max_count) else { s2.ptr = hawk_rtx_valtooocstrdup(rtx, a2, &s2.len); - if (s2.ptr == HAWK_NULL) goto oops; + if (HAWK_UNLIKELY(!s2.ptr)) goto oops; s2_free = (hawk_ooch_t*)s2.ptr; } @@ -1140,7 +1140,7 @@ static int __substitute (hawk_rtx_t* rtx, hawk_int_t max_count) x = rtx->gbl.ignorecase? hawk_rtx_buildrex(rtx, s0.ptr, s0.len, HAWK_NULL, &rex): hawk_rtx_buildrex(rtx, s0.ptr, s0.len, &rex, HAWK_NULL); - if (x <= -1) goto oops; + if (HAWK_UNLIKELY(x <= -1)) goto oops; rex_free = rex; } @@ -1163,7 +1163,7 @@ static int __substitute (hawk_rtx_t* rtx, hawk_int_t max_count) if (max_count == 0 || sub_count < max_count) { n = hawk_rtx_matchrexwithoocs(rtx, rex, &s2, &cur, &mat, HAWK_NULL); - if (n <= -1) goto oops; + if (HAWK_UNLIKELY(n <= -1)) goto oops; } else n = 0; @@ -1187,19 +1187,19 @@ static int __substitute (hawk_rtx_t* rtx, hawk_int_t max_count) { if ((i+1) < s1.len && s1.ptr[i] == HAWK_T('\\') && s1.ptr[i+1] == HAWK_T('&')) { - m = hawk_ooecs_ccat (&new, HAWK_T('&')); + m = hawk_ooecs_ccat(&new, HAWK_T('&')); i++; } else if (s1.ptr[i] == HAWK_T('&')) { - m = hawk_ooecs_ncat (&new, mat.ptr, mat.len); + m = hawk_ooecs_ncat(&new, mat.ptr, mat.len); } else { - m = hawk_ooecs_ccat (&new, s1.ptr[i]); + m = hawk_ooecs_ccat(&new, s1.ptr[i]); } - if (m == (hawk_oow_t)-1) goto oops; + if (HAWK_UNLIKELY(m == (hawk_oow_t)-1)) goto oops; } sub_count++; @@ -1212,10 +1212,11 @@ static int __substitute (hawk_rtx_t* rtx, hawk_int_t max_count) { skip_one_char: /* special treatment is needed if match length is 0 */ - - m = hawk_ooecs_ncat(&new, cur.ptr, 1); - if (m == (hawk_oow_t)-1) goto oops; - + if (cur.ptr < s2_end) /* $ matches at s2_end. with this check, '\0' or whatever character after the end may get appended redundantly */ + { + m = hawk_ooecs_ncat(&new, cur.ptr, 1); + if (HAWK_UNLIKELY(m == (hawk_oow_t)-1)) goto oops; + } cur.ptr++; cur.len--; } } diff --git a/hawk/lib/hawk-prv.h b/hawk/lib/hawk-prv.h index 42f65af6..834af95c 100644 --- a/hawk/lib/hawk-prv.h +++ b/hawk/lib/hawk-prv.h @@ -349,7 +349,7 @@ struct hawk_chain_t #define RTX_STACK_LCL(rtx,n) RTX_STACK_AT(rtx,3+(hawk_oow_t)RTX_STACK_NARGS(rtx)+1+(n)) #define RTX_STACK_RETVAL(rtx) RTX_STACK_AT(rtx,2) #define RTX_STACK_GBL(rtx,n) ((rtx)->stack[(n)]) -#define RTX_STACK_RETVAL_GBL(rtx) ((rtx)->stack[(rtx)->awk->tree.ngbls+2]) +#define RTX_STACK_RETVAL_GBL(rtx) ((rtx)->stack[(rtx)->hawk->tree.ngbls+2]) struct hawk_rtx_t { @@ -414,6 +414,7 @@ struct hawk_rtx_t void* fs[2]; int ignorecase; int striprecspc; + int stripstrspc; hawk_int_t nr; hawk_int_t fnr; @@ -493,6 +494,10 @@ struct hawk_mod_data_t (refval)->adr = (_adr); \ } while(0); + +#define HAWK_RTX_IS_STRIPRECSPC_ON(rtx) ((rtx)->gbl.striprecspc > 0 || ((rtx)->gbl.striprecspc < 0 && ((rtx)->hawk->parse.pragma.trait & HAWK_STRIPRECSPC))) +#define HAWK_RTX_IS_STRIPSTRSPC_ON(rtx) ((rtx)->gbl.stripstrspc > 0 || ((rtx)->gbl.stripstrspc < 0 && ((rtx)->hawk->parse.pragma.trait & HAWK_STRIPSTRSPC))) + #if defined(__cplusplus) extern "C" { #endif diff --git a/hawk/lib/hawk.c b/hawk/lib/hawk.c index 6d39653d..e55da6f6 100644 --- a/hawk/lib/hawk.c +++ b/hawk/lib/hawk.c @@ -379,7 +379,7 @@ void hawk_clear (hawk_t* awk) awk->parse.depth.loop = 0; awk->parse.depth.expr = 0; awk->parse.depth.incl = 0; - awk->parse.pragma.trait = (awk->opt.trait & (HAWK_IMPLICIT | HAWK_STRIPRECSPC)); /* implicit on if you didn't mask it off in awk->opt.trait with hawk_setopt */ + awk->parse.pragma.trait = (awk->opt.trait & (HAWK_IMPLICIT | HAWK_STRIPRECSPC | HAWK_STRIPSTRSPC)); /* implicit on if you didn't mask it off in awk->opt.trait with hawk_setopt */ awk->parse.pragma.rtx_stack_limit = 0; awk->parse.pragma.entry[0] = '\0'; diff --git a/hawk/lib/hawk.h b/hawk/lib/hawk.h index 1f09d656..31d2e73c 100644 --- a/hawk/lib/hawk.h +++ b/hawk/lib/hawk.h @@ -52,18 +52,18 @@ * AWK script as shown below: * * \code - * hawk_t* awk; + * hawk_t* hawk; * hawk_rtx_t* rtx; * hawk_sio_cbs_t sio; // need to initialize it with callback functions * hawk_rio_cbs_t rio; // need to initialize it with callback functions * * awk = hawk_open(mmgr, 0, prm); // create an interpreter - * hawk_parse (awk, &sio); // parse a script - * rtx = hawk_rtx_open (awk, 0, &rio); // create a runtime context - * retv = hawk_rtx_loop (rtx); // run a standard AWK loop + * hawk_parse (hawk, &sio); // parse a script + * rtx = hawk_rtx_open(hawk, 0, &rio); // create a runtime context + * retv = hawk_rtx_loop(rtx); // run a standard AWK loop * if (retv) hawk_rtx_refdownval (rtx, retv); // free return value * hawk_rtx_close (rtx); // destroy the runtime context - * hawk_close (awk); // destroy the interpreter + * hawk_close (hawk); // destroy the interpreter * \endcode * * It provides an interface to change the conventional behavior of the @@ -115,7 +115,7 @@ typedef struct hawk_rtx_t hawk_rtx_t; hawk_oow_t _instsize; \ hawk_gem_t _gem; \ int id; \ - hawk_t* awk + hawk_t* hawk typedef struct hawk_rtx_alt_t hawk_rtx_alt_t; struct hawk_rtx_alt_t @@ -1316,6 +1316,7 @@ enum hawk_gbl_id_t HAWK_GBL_RSTART, HAWK_GBL_SCRIPTNAME, HAWK_GBL_STRIPRECSPC, + HAWK_GBL_STRIPSTRSPC, HAWK_GBL_SUBSEP, /* these are not not the actual IDs and are used internally only @@ -2054,14 +2055,14 @@ HAWK_EXPORT void hawk_rtx_close ( ); #if defined(HAWK_HAVE_INLINE) -static HAWK_INLINE hawk_t* hawk_rtx_gethawk (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->awk; } +static HAWK_INLINE hawk_t* hawk_rtx_gethawk (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->hawk; } static HAWK_INLINE void* hawk_rtx_getxtn (hawk_rtx_t* rtx) { return (void*)((hawk_uint8_t*)rtx + ((hawk_rtx_alt_t*)rtx)->_instsize); } static HAWK_INLINE hawk_gem_t* hawk_rtx_getgem (hawk_rtx_t* rtx) { return &((hawk_rtx_alt_t*)rtx)->_gem; } static HAWK_INLINE hawk_mmgr_t* hawk_rtx_getmmgr (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->_gem.mmgr; } static HAWK_INLINE hawk_cmgr_t* hawk_rtx_getcmgr (hawk_rtx_t* rtx) { return ((hawk_rtx_alt_t*)rtx)->_gem.cmgr; } static HAWK_INLINE void hawk_rtx_setcmgr (hawk_rtx_t* rtx, hawk_cmgr_t* cmgr) { ((hawk_rtx_alt_t*)rtx)->_gem.cmgr = cmgr; } #else -#define hawk_rtx_gethawk(rtx) (((hawk_rtx_alt_t*)(rtx))->awk) +#define hawk_rtx_gethawk(rtx) (((hawk_rtx_alt_t*)(rtx))->hawk) #define hawk_rtx_getxtn(rtx) ((void*)((hawk_uint8_t*)rtx + ((hawk_rtx_alt_t*)rtx)->_instsize)) #define hawk_rtx_getgem(rtx) (&((hawk_rtx_alt_t*)(rtx))->_gem) #define hawk_rtx_getmmgr(rtx) (((hawk_rtx_alt_t*)(rtx))->_gem.mmgr) diff --git a/hawk/lib/misc.c b/hawk/lib/misc.c index f275d4dd..986931ed 100644 --- a/hawk/lib/misc.c +++ b/hawk/lib/misc.c @@ -281,7 +281,7 @@ hawk_ooch_t* hawk_rtx_strxntokbyrex ( cursub.ptr++; cursub.len--; } - else if (rtx->gbl.striprecspc > 0 || (rtx->gbl.striprecspc < 0 && (rtx->awk->parse.pragma.trait & HAWK_STRIPRECSPC))) + else if (HAWK_RTX_IS_STRIPRECSPC_ON(rtx)) { /* match at the beginning of the input string */ if (match.ptr == substr) @@ -329,7 +329,7 @@ exit_loop: } /* the match is all spaces */ - if (rtx->gbl.striprecspc > 0 || (rtx->gbl.striprecspc < 0 && (rtx->awk->parse.pragma.trait & HAWK_STRIPRECSPC))) + if (HAWK_RTX_IS_STRIPRECSPC_ON(rtx)) { /* if the match reached the last character in the input string, * it returns HAWK_NULL to terminate tokenization. */ diff --git a/hawk/lib/mod-str.c b/hawk/lib/mod-str.c index fa0cc24d..fd608a0e 100644 --- a/hawk/lib/mod-str.c +++ b/hawk/lib/mod-str.c @@ -487,7 +487,7 @@ static int fnc_tonum (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) if (hawk_rtx_valtoint(rtx, a1, &base) <= -1) return -1; rx = hawk_bchars_to_num( - HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), base), + HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), base), ((hawk_val_mbs_t*)a0)->val.ptr, ((hawk_val_mbs_t*)a0)->val.len, &lv, &rv @@ -502,7 +502,7 @@ static int fnc_tonum (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) if (hawk_rtx_valtoint(rtx, a1, &base) <= -1) return -1; rx = hawk_oochars_to_num( - HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), base), + HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), base), ((hawk_val_str_t*)a0)->val.ptr, ((hawk_val_str_t*)a0)->val.len, &lv, &rv diff --git a/hawk/lib/parse.c b/hawk/lib/parse.c index b043ea23..8d6aa203 100644 --- a/hawk/lib/parse.c +++ b/hawk/lib/parse.c @@ -375,6 +375,8 @@ static global_t gtab[] = * if not set, the behavior is dependent on the awk->opt.trait & HAWK_STRIPRECSPC */ { HAWK_T("STRIPRECSPC"), 11, 0 }, + { HAWK_T("STRIPSTRSPC"), 11, 0 }, + { HAWK_T("SUBSEP"), 6, 0 } }; @@ -870,7 +872,7 @@ static int begin_include (hawk_t* awk, int once) arg->pragma_trait = awk->parse.pragma.trait; /* but don't change awk->parse.pragma.trait. it means the included file inherits * the existing progma values. - awk->parse.pragma.trait = (awk->opt.trait & (HAWK_IMPLICIT | HAWK_STRIPRECSPC)); + awk->parse.pragma.trait = (awk->opt.trait & (HAWK_IMPLICIT | HAWK_STRIPRECSPC | HAWK_STRIPSTRSPC)); */ /* i update the current pointer after opening is successful */ @@ -1049,14 +1051,11 @@ static int parse_progunit (hawk_t* awk) return -1; } - sl = hawk_oochars_to_int(HAWK_OOECS_PTR(awk->tok.name), HAWK_OOECS_LEN(awk->tok.name), - HAWK_OOCHARS_TO_INT_MAKE_OPTION((awk->opt.trait & HAWK_STRIPSTRSPC), (awk->opt.trait & HAWK_STRIPSTRSPC), 0), - HAWK_NULL, HAWK_NULL); + sl = hawk_oochars_to_int(HAWK_OOECS_PTR(awk->tok.name), HAWK_OOECS_LEN(awk->tok.name), HAWK_OOCHARS_TO_INT_MAKE_OPTION(0, 0, 0), HAWK_NULL, HAWK_NULL); if (sl < HAWK_MIN_RTX_STACK_LIMIT) sl = HAWK_MIN_RTX_STACK_LIMIT; else if (sl > HAWK_MAX_RTX_STACK_LIMIT) sl = HAWK_MAX_RTX_STACK_LIMIT; /* take the specified value if it's greater than the existing value */ if (sl > awk->parse.pragma.rtx_stack_limit) awk->parse.pragma.rtx_stack_limit = sl; - } else if (hawk_comp_oochars_oocstr(name.ptr, name.len, HAWK_T("striprecspc")) == 0) { @@ -1100,6 +1099,45 @@ static int parse_progunit (hawk_t* awk) awk->parse.pragma.trait &= ~HAWK_STRIPRECSPC; } } + else if (hawk_comp_oochars_oocstr(name.ptr, name.len, HAWK_T("stripstrspc")) == 0) + { + /* @pragma stripstrspc on + * @pragma stripstrspc off + */ + int is_on; + + if (get_token(awk) <= -1) return -1; + if (!MATCH(awk, TOK_IDENT)) + { + error_ident_on_off_expected_for_stripstrspc: + hawk_seterrfmt (awk, &awk->ptok.loc, HAWK_EIDENT, HAWK_T("identifier 'on' or 'off' expected for 'stripstrspc'")); + return -1; + } + + name.len = HAWK_OOECS_LEN(awk->tok.name); + name.ptr = HAWK_OOECS_PTR(awk->tok.name); + if (hawk_comp_oochars_oocstr(name.ptr, name.len, HAWK_T("on")) == 0) + { + is_on = 1; + } + else if (hawk_comp_oochars_oocstr(name.ptr, name.len, HAWK_T("off")) == 0) + { + is_on = 0; + } + else + { + goto error_ident_on_off_expected_for_stripstrspc; + } + + if (awk->sio.inp == &awk->sio.arg) + { + /* only the top level source. ignore stripstrspc pragma in other levels */ + if (is_on) + awk->parse.pragma.trait |= HAWK_STRIPSTRSPC; + else + awk->parse.pragma.trait &= ~HAWK_STRIPSTRSPC; + } + } else { hawk_seterrfmt (awk, &awk->ptok.loc, HAWK_EIDENT, HAWK_T("unknown @pragma identifier - %.*js"), name.len, name.ptr); @@ -4621,17 +4659,17 @@ static hawk_nde_t* parse_primary_int (hawk_t* hawk, const hawk_loc_t* xloc) /* create the node for the literal */ nde = (hawk_nde_int_t*)new_int_node ( hawk, - hawk_oochars_to_int (HAWK_OOECS_PTR(hawk->tok.name), HAWK_OOECS_LEN(hawk->tok.name), HAWK_OOCHARS_TO_INT_MAKE_OPTION((hawk->opt.trait & HAWK_STRIPSTRSPC), (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), HAWK_NULL, HAWK_NULL), + hawk_oochars_to_int (HAWK_OOECS_PTR(hawk->tok.name), HAWK_OOECS_LEN(hawk->tok.name), HAWK_OOCHARS_TO_INT_MAKE_OPTION(0, 0, 0), HAWK_NULL, HAWK_NULL), xloc ); - if (nde == HAWK_NULL) return HAWK_NULL; + if (HAWK_UNLIKELY(!nde)) return HAWK_NULL; HAWK_ASSERT (HAWK_OOECS_LEN(hawk->tok.name) == hawk_count_oocstr(HAWK_OOECS_PTR(hawk->tok.name))); /* remember the literal in the original form */ nde->len = HAWK_OOECS_LEN(hawk->tok.name); nde->str = hawk_dupoocs(hawk, HAWK_OOECS_OOCS(hawk->tok.name)); - if (nde->str == HAWK_NULL || get_token(hawk) <= -1) goto oops; + if (!nde->str || get_token(hawk) <= -1) goto oops; return (hawk_nde_t*)nde; @@ -4649,10 +4687,10 @@ static hawk_nde_t* parse_primary_flt (hawk_t* hawk, const hawk_loc_t* xloc) /* create the node for the literal */ nde = (hawk_nde_flt_t*)new_flt_node( hawk, - hawk_oochars_to_flt(HAWK_OOECS_PTR(hawk->tok.name), HAWK_OOECS_LEN(hawk->tok.name), HAWK_NULL, (hawk->opt.trait & HAWK_STRIPSTRSPC)), + hawk_oochars_to_flt(HAWK_OOECS_PTR(hawk->tok.name), HAWK_OOECS_LEN(hawk->tok.name), HAWK_NULL, 0), xloc ); - if (nde == HAWK_NULL) return HAWK_NULL; + if (HAWK_UNLIKELY(!nde)) return HAWK_NULL; HAWK_ASSERT ( HAWK_OOECS_LEN(hawk->tok.name) == @@ -4661,7 +4699,7 @@ static hawk_nde_t* parse_primary_flt (hawk_t* hawk, const hawk_loc_t* xloc) /* remember the literal in the original form */ nde->len = HAWK_OOECS_LEN(hawk->tok.name); nde->str = hawk_dupoocs(hawk, HAWK_OOECS_OOCS(hawk->tok.name)); - if (nde->str == HAWK_NULL || get_token(hawk) <= -1) goto oops; + if (!nde->str || get_token(hawk) <= -1) goto oops; return (hawk_nde_t*)nde; diff --git a/hawk/lib/rio.c b/hawk/lib/rio.c index d0c45d15..e1de7a9d 100644 --- a/hawk/lib/rio.c +++ b/hawk/lib/rio.c @@ -437,7 +437,7 @@ int hawk_rtx_readio (hawk_rtx_t* rtx, int in_type, const hawk_ooch_t* name, hawk if (HAWK_OOECS_LASTCHAR(buf) == HAWK_T('\n')) { HAWK_OOECS_LEN(buf) -= 1; - if (rtx->awk->opt.trait & HAWK_CRLF) + if (rtx->hawk->opt.trait & HAWK_CRLF) { /* drop preceding CR */ if (HAWK_OOECS_LEN(buf) > 0 && HAWK_OOECS_LASTCHAR(buf) == HAWK_T('\r')) HAWK_OOECS_LEN(buf) -= 1; @@ -541,7 +541,7 @@ int hawk_rtx_readio (hawk_rtx_t* rtx, int in_type, const hawk_ooch_t* name, hawk /* we don't drop CR from the record buffer * if we're in CRLF mode. POINT-X */ - if (!(rtx->awk->opt.trait & HAWK_CRLF)) + if (!(rtx->hawk->opt.trait & HAWK_CRLF)) HAWK_OOECS_LEN(buf) -= 1; } @@ -549,7 +549,7 @@ int hawk_rtx_readio (hawk_rtx_t* rtx, int in_type, const hawk_ooch_t* name, hawk { /* we got a blank line */ - if (rtx->awk->opt.trait & HAWK_CRLF) + if (rtx->hawk->opt.trait & HAWK_CRLF) { if (HAWK_OOECS_LEN(buf) > 0 && HAWK_OOECS_LASTCHAR(buf) == HAWK_T('\r')) { @@ -755,7 +755,7 @@ int hawk_rtx_readiobytes (hawk_rtx_t* rtx, int in_type, const hawk_ooch_t* name, if (HAWK_BECS_LASTCHAR(buf) == '\n') { HAWK_BECS_LEN(buf) -= 1; - if (rtx->awk->opt.trait & HAWK_CRLF) + if (rtx->hawk->opt.trait & HAWK_CRLF) { /* drop preceding CR */ if (HAWK_BECS_LEN(buf) > 0 && HAWK_BECS_LASTCHAR(buf) == '\r') HAWK_BECS_LEN(buf) -= 1; @@ -859,7 +859,7 @@ int hawk_rtx_readiobytes (hawk_rtx_t* rtx, int in_type, const hawk_ooch_t* name, /* we don't drop CR from the record buffer * if we're in CRLF mode. POINT-X */ - if (!(rtx->awk->opt.trait & HAWK_CRLF)) + if (!(rtx->hawk->opt.trait & HAWK_CRLF)) HAWK_BECS_LEN(buf) -= 1; } @@ -867,7 +867,7 @@ int hawk_rtx_readiobytes (hawk_rtx_t* rtx, int in_type, const hawk_ooch_t* name, { /* we got a blank line */ - if (rtx->awk->opt.trait & HAWK_CRLF) + if (rtx->hawk->opt.trait & HAWK_CRLF) { if (HAWK_BECS_LEN(buf) > 0 && HAWK_BECS_LASTCHAR(buf) == '\r') { diff --git a/hawk/lib/run.c b/hawk/lib/run.c index 2465b209..8011737f 100644 --- a/hawk/lib/run.c +++ b/hawk/lib/run.c @@ -232,7 +232,7 @@ HAWK_INLINE hawk_val_t* hawk_rtx_getarg (hawk_rtx_t* rtx, hawk_oow_t idx) HAWK_INLINE hawk_val_t* hawk_rtx_getgbl (hawk_rtx_t* rtx, int id) { - HAWK_ASSERT (id >= 0 && id < (int)HAWK_ARR_SIZE(rtx->awk->parse.gbls)); + HAWK_ASSERT (id >= 0 && id < (int)HAWK_ARR_SIZE(rtx->hawk->parse.gbls)); return RTX_STACK_GBL(rtx, id); } @@ -255,7 +255,7 @@ static int set_global (hawk_rtx_t* rtx, int idx, hawk_nde_var_t* var, hawk_val_t vtype = HAWK_RTX_GETVALTYPE (rtx, val); old_vtype = HAWK_RTX_GETVALTYPE (rtx, old); - if (!(rtx->awk->opt.trait & HAWK_FLEXMAP)) + if (!(rtx->hawk->opt.trait & HAWK_FLEXMAP)) { hawk_errnum_t errnum = HAWK_ENOERR; const hawk_ooch_t* errfmt; @@ -619,6 +619,22 @@ static int set_global (hawk_rtx_t* rtx, int idx, hawk_nde_var_t* var, hawk_val_t break; } + case HAWK_GBL_STRIPSTRSPC: + { + hawk_int_t l; + hawk_flt_t r; + int vt; + + vt = hawk_rtx_valtonum(rtx, val, &l, &r); + if (vt <= -1) return -1; + + if (vt == 0) + rtx->gbl.stripstrspc = ((l > 0)? 1: (l < 0)? -1: 0); + else + rtx->gbl.stripstrspc = ((r > 0.0)? 1: (r < 0.0)? -1: 0); + break; + } + case HAWK_GBL_SUBSEP: { hawk_rtx_valtostr_out_t out; @@ -656,7 +672,7 @@ HAWK_INLINE void hawk_rtx_setretval (hawk_rtx_t* rtx, hawk_val_t* val) HAWK_INLINE int hawk_rtx_setgbl (hawk_rtx_t* rtx, int id, hawk_val_t* val) { - HAWK_ASSERT (id >= 0 && id < (int)HAWK_ARR_SIZE(rtx->awk->parse.gbls)); + HAWK_ASSERT (id >= 0 && id < (int)HAWK_ARR_SIZE(rtx->hawk->parse.gbls)); return set_global(rtx, id, HAWK_NULL, val, 0); } @@ -762,7 +778,7 @@ int hawk_rtx_setofilenamewithuchars (hawk_rtx_t* rtx, const hawk_uch_t* name, ha hawk_val_t* tmp; int n; - if (rtx->awk->opt.trait & HAWK_NEXTOFILE) + if (rtx->hawk->opt.trait & HAWK_NEXTOFILE) { tmp = hawk_rtx_makestrvalwithuchars(rtx, name, len); if (HAWK_UNLIKELY(!tmp)) return -1; @@ -781,7 +797,7 @@ int hawk_rtx_setofilenamewithbchars (hawk_rtx_t* rtx, const hawk_bch_t* name, ha hawk_val_t* tmp; int n; - if (rtx->awk->opt.trait & HAWK_NEXTOFILE) + if (rtx->hawk->opt.trait & HAWK_NEXTOFILE) { tmp = hawk_rtx_makestrvalwithbchars(rtx, name, len); if (HAWK_UNLIKELY(!tmp)) return -1; @@ -891,15 +907,15 @@ hawk_rtx_t* hawk_rtx_open (hawk_t* awk, hawk_oow_t xtnsize, hawk_rio_cbs_t* rio) mic.count = 0; mic.rtx = rtx; - hawk_rbt_walk (rtx->awk->modtab, init_module, &mic); - if (mic.count != HAWK_RBT_SIZE(rtx->awk->modtab)) + hawk_rbt_walk (rtx->hawk->modtab, init_module, &mic); + if (mic.count != HAWK_RBT_SIZE(rtx->hawk->modtab)) { if (mic.count > 0) { struct module_fini_ctx_t mfc; mfc.limit = mic.count; mfc.count = 0; - hawk_rbt_walk (rtx->awk->modtab, fini_module, &mfc); + hawk_rbt_walk (rtx->hawk->modtab, fini_module, &mfc); } fini_rtx (rtx, 1); @@ -918,7 +934,7 @@ void hawk_rtx_close (hawk_rtx_t* rtx) mfc.limit = 0; mfc.count = 0; mfc.rtx = rtx; - hawk_rbt_walk (rtx->awk->modtab, fini_module, &mfc); + hawk_rbt_walk (rtx->hawk->modtab, fini_module, &mfc); for (ecb = rtx->ecb; ecb; ecb = ecb->next) { @@ -943,7 +959,7 @@ void hawk_rtx_halt (hawk_rtx_t* rtx) int hawk_rtx_ishalt (hawk_rtx_t* rtx) { - return (rtx->exit_level == EXIT_ABORT || rtx->awk->haltall); + return (rtx->exit_level == EXIT_ABORT || rtx->hawk->haltall); } void hawk_rtx_getrio (hawk_rtx_t* rtx, hawk_rio_cbs_t* rio) @@ -1003,7 +1019,7 @@ static int init_rtx (hawk_rtx_t* rtx, hawk_t* awk, hawk_rio_cbs_t* rio) hawk_oow_t stack_limit; rtx->_gem = awk->_gem; - rtx->awk = awk; + rtx->hawk = awk; CLRERR (rtx); @@ -1054,11 +1070,11 @@ static int init_rtx (hawk_rtx_t* rtx, hawk_t* awk, hawk_rio_cbs_t* rio) rtx->formatmbs.tmp.len = 4096; rtx->formatmbs.tmp.inc = 4096 * 2; - if (rtx->awk->tree.chain_size > 0) + if (rtx->hawk->tree.chain_size > 0) { - rtx->pattern_range_state = (hawk_oob_t*)hawk_rtx_allocmem(rtx, rtx->awk->tree.chain_size * HAWK_SIZEOF(hawk_oob_t)); + rtx->pattern_range_state = (hawk_oob_t*)hawk_rtx_allocmem(rtx, rtx->hawk->tree.chain_size * HAWK_SIZEOF(hawk_oob_t)); if (!rtx->pattern_range_state) goto oops_12; - HAWK_MEMSET (rtx->pattern_range_state, 0, rtx->awk->tree.chain_size * HAWK_SIZEOF(hawk_oob_t)); + HAWK_MEMSET (rtx->pattern_range_state, 0, rtx->hawk->tree.chain_size * HAWK_SIZEOF(hawk_oob_t)); } else rtx->pattern_range_state = HAWK_NULL; @@ -1075,7 +1091,8 @@ static int init_rtx (hawk_rtx_t* rtx, hawk_t* awk, hawk_rio_cbs_t* rio) rtx->gbl.fs[0] = HAWK_NULL; rtx->gbl.fs[1] = HAWK_NULL; rtx->gbl.ignorecase = 0; - rtx->gbl.striprecspc = -1; + rtx->gbl.striprecspc = -1; /* means 'not set' */ + rtx->gbl.stripstrspc = -1; /* means 'not set' */ return 0; @@ -1280,7 +1297,7 @@ static int prepare_globals (hawk_rtx_t* rtx) hawk_oow_t ngbls; saved_stack_top = rtx->stack_top; - ngbls = rtx->awk->tree.ngbls; + ngbls = rtx->hawk->tree.ngbls; /* initialize all global variables to nil by push nils to the stack */ while (ngbls > 0) @@ -1337,7 +1354,7 @@ static int defaultify_globals (hawk_rtx_t* rtx) hawk_oow_t i, j; int stridx; - stridx = (rtx->awk->opt.trait & HAWK_CRLF)? 1: 0; + stridx = (rtx->hawk->opt.trait & HAWK_CRLF)? 1: 0; for (i = 0; i < HAWK_COUNTOF(gtab); i++) { if (gtab[i].str[stridx] == HAWK_NULL || gtab[i].str[stridx][0] == HAWK_T('\0')) @@ -1371,17 +1388,17 @@ static int defaultify_globals (hawk_rtx_t* rtx) return 0; } -static void refdown_globals (hawk_rtx_t* run, int pop) +static void refdown_globals (hawk_rtx_t* rtx, int pop) { hawk_oow_t ngbls; - ngbls = run->awk->tree.ngbls; + ngbls = rtx->hawk->tree.ngbls; while (ngbls > 0) { --ngbls; - hawk_rtx_refdownval (run, RTX_STACK_GBL(run,ngbls)); - if (pop) __raw_pop (run); - else RTX_STACK_GBL(run,ngbls) = hawk_val_nil; + hawk_rtx_refdownval (rtx, RTX_STACK_GBL(rtx,ngbls)); + if (pop) __raw_pop (rtx); + else RTX_STACK_GBL(rtx,ngbls) = hawk_val_nil; } } @@ -1469,7 +1486,7 @@ static hawk_val_t* run_bpae_loop (hawk_rtx_t* rtx) RTX_STACK_NARGS(rtx) = (void*)nargs; /* execute the BEGIN block */ - for (nde = rtx->awk->tree.begin; + for (nde = rtx->hawk->tree.begin; ret == 0 && nde != HAWK_NULL && rtx->exit_level < EXIT_GLOBAL; nde = nde->next) { @@ -1495,8 +1512,8 @@ static hawk_val_t* run_bpae_loop (hawk_rtx_t* rtx) /* run pattern block loops */ if (ret == 0 && - (rtx->awk->tree.chain != HAWK_NULL || - rtx->awk->tree.end != HAWK_NULL) && + (rtx->hawk->tree.chain != HAWK_NULL || + rtx->hawk->tree.end != HAWK_NULL) && rtx->exit_level < EXIT_GLOBAL) { if (run_pblocks(rtx) <= -1) ret = -1; @@ -1514,7 +1531,7 @@ static hawk_val_t* run_bpae_loop (hawk_rtx_t* rtx) /* execute END blocks. the first END block is executed if the * program is not explicitly aborted with hawk_rtx_halt().*/ - for (nde = rtx->awk->tree.end; + for (nde = rtx->hawk->tree.end; ret == 0 && nde != HAWK_NULL && rtx->exit_level < EXIT_ABORT; nde = nde->next) { @@ -1585,15 +1602,15 @@ hawk_val_t* hawk_rtx_loop (hawk_rtx_t* rtx) hawk_val_t* hawk_rtx_execwithucstrarr (hawk_rtx_t* rtx, const hawk_uch_t* args[], hawk_oow_t nargs) { - return (rtx->awk->parse.pragma.entry[0] != '\0')? - hawk_rtx_callwithooucstrarr(rtx, rtx->awk->parse.pragma.entry, args, nargs): + return (rtx->hawk->parse.pragma.entry[0] != '\0')? + hawk_rtx_callwithooucstrarr(rtx, rtx->hawk->parse.pragma.entry, args, nargs): hawk_rtx_loop(rtx); } hawk_val_t* hawk_rtx_execwithbcstrarr (hawk_rtx_t* rtx, const hawk_bch_t* args[], hawk_oow_t nargs) { - return (rtx->awk->parse.pragma.entry[0] != '\0')? - hawk_rtx_callwithoobcstrarr(rtx, rtx->awk->parse.pragma.entry, args, nargs): + return (rtx->hawk->parse.pragma.entry[0] != '\0')? + hawk_rtx_callwithoobcstrarr(rtx, rtx->hawk->parse.pragma.entry, args, nargs): hawk_rtx_loop(rtx); } @@ -1603,7 +1620,7 @@ static hawk_fun_t* find_fun (hawk_rtx_t* rtx, const hawk_ooch_t* name) { hawk_htb_pair_t* pair; - pair = hawk_htb_search(rtx->awk->tree.funs, name, hawk_count_oocstr(name)); + pair = hawk_htb_search(rtx->hawk->tree.funs, name, hawk_count_oocstr(name)); if (!pair) { hawk_rtx_seterrfmt (rtx, HAWK_NULL, HAWK_EFUNNF, HAWK_T("unable to find function '%js'"), name); @@ -1870,16 +1887,16 @@ static int run_pblocks (hawk_rtx_t* rtx) int n; #define ADJUST_ERROR(run) \ - if (rtx->awk->tree.chain != HAWK_NULL) \ + if (rtx->hawk->tree.chain != HAWK_NULL) \ { \ - if (rtx->awk->tree.chain->pattern != HAWK_NULL) \ - ADJERR_LOC (rtx, &rtx->awk->tree.chain->pattern->loc); \ - else if (rtx->awk->tree.chain->action != HAWK_NULL) \ - ADJERR_LOC (rtx, &rtx->awk->tree.chain->action->loc); \ + if (rtx->hawk->tree.chain->pattern != HAWK_NULL) \ + ADJERR_LOC (rtx, &rtx->hawk->tree.chain->pattern->loc); \ + else if (rtx->hawk->tree.chain->action != HAWK_NULL) \ + ADJERR_LOC (rtx, &rtx->hawk->tree.chain->action->loc); \ } \ - else if (rtx->awk->tree.end != HAWK_NULL) \ + else if (rtx->hawk->tree.end != HAWK_NULL) \ { \ - ADJERR_LOC (run, &rtx->awk->tree.end->loc); \ + ADJERR_LOC (run, &rtx->hawk->tree.end->loc); \ } rtx->inrec.buf_pos = 0; @@ -1899,9 +1916,9 @@ static int run_pblocks (hawk_rtx_t* rtx) } if (n == 0) break; /* end of input */ - if (rtx->awk->tree.chain) + if (rtx->hawk->tree.chain) { - if (run_pblock_chain(rtx, rtx->awk->tree.chain) <= -1) return -1; + if (run_pblock_chain(rtx, rtx->hawk->tree.chain) <= -1) return -1; } } @@ -2096,8 +2113,8 @@ static int run_block (hawk_rtx_t* rtx, hawk_nde_blk_t* nde) { int n; - if (rtx->awk->opt.depth.s.block_run > 0 && - rtx->depth.block >= rtx->awk->opt.depth.s.block_run) + if (rtx->hawk->opt.depth.s.block_run > 0 && + rtx->depth.block >= rtx->hawk->opt.depth.s.block_run) { hawk_rtx_seterrnum (rtx, &nde->loc, HAWK_EBLKNST); return -1;; @@ -2112,7 +2129,7 @@ static int run_block (hawk_rtx_t* rtx, hawk_nde_blk_t* nde) #define ON_STATEMENT(rtx,nde) do { \ hawk_rtx_ecb_t* ecb; \ - if ((rtx)->awk->haltall) (rtx)->exit_level = EXIT_ABORT; \ + if ((rtx)->hawk->haltall) (rtx)->exit_level = EXIT_ABORT; \ for (ecb = (rtx)->ecb; ecb; ecb = ecb->next) \ if (ecb->stmt) ecb->stmt (rtx, nde); \ } while(0) @@ -2185,12 +2202,12 @@ static int run_statement (hawk_rtx_t* rtx, hawk_nde_t* nde) break; case HAWK_NDE_PRINT: - if (rtx->awk->opt.trait & HAWK_TOLERANT) goto __fallback__; + if (rtx->hawk->opt.trait & HAWK_TOLERANT) goto __fallback__; xret = run_print(rtx, (hawk_nde_print_t*)nde); break; case HAWK_NDE_PRINTF: - if (rtx->awk->opt.trait & HAWK_TOLERANT) goto __fallback__; + if (rtx->hawk->opt.trait & HAWK_TOLERANT) goto __fallback__; xret = run_printf(rtx, (hawk_nde_print_t*)nde); break; @@ -2531,7 +2548,7 @@ static int run_return (hawk_rtx_t* rtx, hawk_nde_return_t* nde) val = eval_expression (rtx, nde->val); if (val == HAWK_NULL) return -1; - if (!(rtx->awk->opt.trait & HAWK_FLEXMAP)) + if (!(rtx->hawk->opt.trait & HAWK_FLEXMAP)) { if (HAWK_RTX_GETVALTYPE (rtx, val) == HAWK_VAL_MAP) { @@ -2582,12 +2599,12 @@ static int run_next (hawk_rtx_t* rtx, hawk_nde_next_t* nde) /* the parser checks if next has been called in the begin/end * block or whereever inappropriate. so the rtxtime doesn't * check that explicitly */ - if (rtx->active_block == (hawk_nde_blk_t*)rtx->awk->tree.begin) + if (rtx->active_block == (hawk_nde_blk_t*)rtx->hawk->tree.begin) { hawk_rtx_seterrnum (rtx, &nde->loc, HAWK_ERNEXTBEG); return -1; } - else if (rtx->active_block == (hawk_nde_blk_t*)rtx->awk->tree.end) + else if (rtx->active_block == (hawk_nde_blk_t*)rtx->hawk->tree.end) { hawk_rtx_seterrnum (rtx, &nde->loc, HAWK_ERNEXTEND); return -1; @@ -2602,12 +2619,12 @@ static int run_nextinfile (hawk_rtx_t* rtx, hawk_nde_nextfile_t* nde) int n; /* normal nextfile statement */ - if (rtx->active_block == (hawk_nde_blk_t*)rtx->awk->tree.begin) + if (rtx->active_block == (hawk_nde_blk_t*)rtx->hawk->tree.begin) { hawk_rtx_seterrnum (rtx, &nde->loc, HAWK_ERNEXTFBEG); return -1; } - else if (rtx->active_block == (hawk_nde_blk_t*)rtx->awk->tree.end) + else if (rtx->active_block == (hawk_nde_blk_t*)rtx->hawk->tree.end) { hawk_rtx_seterrnum (rtx, &nde->loc, HAWK_ERNEXTFEND); return -1; @@ -3028,7 +3045,7 @@ static int run_print (hawk_rtx_t* rtx, hawk_nde_print_t* nde) n = hawk_rtx_writeiostr(rtx, nde->out_type, out.ptr, HAWK_OOECS_PTR(&rtx->inrec.line), HAWK_OOECS_LEN(&rtx->inrec.line)); if (n <= -1 /*&& rtx->errinf.num != HAWK_EIOIMPL*/) { - if (rtx->awk->opt.trait & HAWK_TOLERANT) + if (rtx->hawk->opt.trait & HAWK_TOLERANT) { xret = PRINT_IOERR; } @@ -3060,7 +3077,7 @@ static int run_print (hawk_rtx_t* rtx, hawk_nde_print_t* nde) n = hawk_rtx_writeiostr(rtx, nde->out_type, out.ptr, rtx->gbl.ofs.ptr, rtx->gbl.ofs.len); if (n <= -1 /*&& rtx->errinf.num != HAWK_EIOIMPL*/) { - if (rtx->awk->opt.trait & HAWK_TOLERANT) + if (rtx->hawk->opt.trait & HAWK_TOLERANT) { xret = PRINT_IOERR; } @@ -3080,7 +3097,7 @@ static int run_print (hawk_rtx_t* rtx, hawk_nde_print_t* nde) if (n <= -1 /*&& rtx->errinf.num != HAWK_EIOIMPL*/) { - if (rtx->awk->opt.trait & HAWK_TOLERANT) + if (rtx->hawk->opt.trait & HAWK_TOLERANT) { xret = PRINT_IOERR; } @@ -3096,7 +3113,7 @@ static int run_print (hawk_rtx_t* rtx, hawk_nde_print_t* nde) n = hawk_rtx_writeiostr(rtx, nde->out_type, out.ptr, rtx->gbl.ors.ptr, rtx->gbl.ors.len); if (n <= -1 /*&& rtx->errinf.num != HAWK_EIOIMPL*/) { - if (rtx->awk->opt.trait & HAWK_TOLERANT) + if (rtx->hawk->opt.trait & HAWK_TOLERANT) { xret = PRINT_IOERR; } @@ -3207,7 +3224,7 @@ static int run_printf (hawk_rtx_t* rtx, hawk_nde_print_t* nde) if (n <= -1 /*&& rtx->errinf.num != HAWK_EIOIMPL*/) { - if (rtx->awk->opt.trait & HAWK_TOLERANT) xret = PRINT_IOERR; + if (rtx->hawk->opt.trait & HAWK_TOLERANT) xret = PRINT_IOERR; else goto oops; } break; @@ -3215,7 +3232,7 @@ static int run_printf (hawk_rtx_t* rtx, hawk_nde_print_t* nde) if (hawk_rtx_flushio(rtx, nde->out_type, out.ptr) <= -1) { - if (rtx->awk->opt.trait & HAWK_TOLERANT) xret = PRINT_IOERR; + if (rtx->hawk->opt.trait & HAWK_TOLERANT) xret = PRINT_IOERR; else goto oops_1; } @@ -3254,7 +3271,7 @@ static int output_formatted ( n = hawk_rtx_writeiostr(rtx, out_type, dst, ptr, len); if (n <= -1 /*&& rtx->errinf.num != HAWK_EIOIMPL*/) { - return (rtx->awk->opt.trait & HAWK_TOLERANT)? PRINT_IOERR: -1; + return (rtx->hawk->opt.trait & HAWK_TOLERANT)? PRINT_IOERR: -1; } return 0; @@ -3274,7 +3291,7 @@ static int output_formatted_bytes ( n = hawk_rtx_writeiobytes(rtx, out_type, dst, ptr, len); if (n <= -1 /*&& rtx->errinf.num != HAWK_EIOIMPL*/) { - return (rtx->awk->opt.trait & HAWK_TOLERANT)? PRINT_IOERR: -1; + return (rtx->hawk->opt.trait & HAWK_TOLERANT)? PRINT_IOERR: -1; } return 0; @@ -3602,7 +3619,7 @@ static hawk_val_t* do_assignment_nonidx (hawk_rtx_t* rtx, hawk_nde_var_t* var, h pair = hawk_htb_search(rtx->named, var->id.name.ptr, var->id.name.len); - if (!(rtx->awk->opt.trait & HAWK_FLEXMAP)) + if (!(rtx->hawk->opt.trait & HAWK_FLEXMAP)) { if (pair && HAWK_RTX_GETVALTYPE(rtx, (hawk_val_t*)HAWK_HTB_VPTR(pair)) == HAWK_VAL_MAP) { @@ -3646,7 +3663,7 @@ static hawk_val_t* do_assignment_nonidx (hawk_rtx_t* rtx, hawk_nde_var_t* var, h { hawk_val_t* old = RTX_STACK_LCL(rtx,var->id.idxa); - if (!(rtx->awk->opt.trait & HAWK_FLEXMAP)) + if (!(rtx->hawk->opt.trait & HAWK_FLEXMAP)) { if (HAWK_RTX_GETVALTYPE(rtx, old) == HAWK_VAL_MAP) { @@ -3676,7 +3693,7 @@ static hawk_val_t* do_assignment_nonidx (hawk_rtx_t* rtx, hawk_nde_var_t* var, h { hawk_val_t* old = RTX_STACK_ARG(rtx,var->id.idxa); - if (!(rtx->awk->opt.trait & HAWK_FLEXMAP)) + if (!(rtx->hawk->opt.trait & HAWK_FLEXMAP)) { if (HAWK_RTX_GETVALTYPE(rtx, old) == HAWK_VAL_MAP) { @@ -3809,7 +3826,7 @@ retry: } else if (mvtype != HAWK_VAL_MAP) { - if (rtx->awk->opt.trait & HAWK_FLEXMAP) + if (rtx->hawk->opt.trait & HAWK_FLEXMAP) { /* if FLEXMAP is on, you can switch a scalar value to a map */ hawk_nde_var_t fake; @@ -4361,7 +4378,7 @@ static HAWK_INLINE int __cmp_int_str (hawk_rtx_t* rtx, hawk_val_t* left, hawk_va hawk_flt_t rr; n = hawk_oochars_to_num( - HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), + HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ((hawk_val_str_t*)right)->val.ptr, ((hawk_val_str_t*)right)->val.len, &ll, &rr @@ -4401,7 +4418,7 @@ static HAWK_INLINE int __cmp_int_mbs (hawk_rtx_t* rtx, hawk_val_t* left, hawk_va hawk_flt_t rr; n = hawk_bchars_to_num ( - HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), + HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ((hawk_val_mbs_t*)right)->val.ptr, ((hawk_val_mbs_t*)right)->val.len, &ll, &rr @@ -4482,7 +4499,7 @@ static HAWK_INLINE int __cmp_flt_str (hawk_rtx_t* rtx, hawk_val_t* left, hawk_va const hawk_ooch_t* end; hawk_flt_t rr; - rr = hawk_oochars_to_flt(((hawk_val_str_t*)right)->val.ptr, ((hawk_val_str_t*)right)->val.len, &end, (hawk->opt.trait & HAWK_STRIPSTRSPC)); + rr = hawk_oochars_to_flt(((hawk_val_str_t*)right)->val.ptr, ((hawk_val_str_t*)right)->val.len, &end, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx)); if (end == ((hawk_val_str_t*)right)->val.ptr + ((hawk_val_str_t*)right)->val.len) { return (((hawk_val_flt_t*)left)->val > rr)? 1: @@ -4510,7 +4527,7 @@ static HAWK_INLINE int __cmp_flt_mbs (hawk_rtx_t* rtx, hawk_val_t* left, hawk_va const hawk_bch_t* end; hawk_flt_t rr; - rr = hawk_bchars_to_flt(((hawk_val_mbs_t*)right)->val.ptr, ((hawk_val_mbs_t*)right)->val.len, &end, (hawk->opt.trait & HAWK_STRIPSTRSPC)); + rr = hawk_bchars_to_flt(((hawk_val_mbs_t*)right)->val.ptr, ((hawk_val_mbs_t*)right)->val.len, &end, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx)); if (end == ((hawk_val_mbs_t*)right)->val.ptr + ((hawk_val_mbs_t*)right)->val.len) { return (((hawk_val_flt_t*)left)->val > rr)? 1: @@ -4572,13 +4589,13 @@ static HAWK_INLINE int __cmp_str_str (hawk_rtx_t* rtx, hawk_val_t* left, hawk_va ls = (hawk_val_str_t*)left; rs = (hawk_val_str_t*)right; - if (ls->nstr == 0 || rs->nstr == 0) + if (HAWK_LIKELY(ls->nstr == 0 || rs->nstr == 0)) { /* both are definitely strings */ return hawk_comp_oochars(ls->val.ptr, ls->val.len, rs->val.ptr, rs->val.len, rtx->gbl.ignorecase); } - stripspc = (hawk->opt.trait & HAWK_STRIPSTRSPC); + stripspc = HAWK_RTX_IS_STRIPSTRSPC_ON(rtx); if (ls->nstr == 1) { @@ -4831,7 +4848,7 @@ static HAWK_INLINE int __cmp_val (hawk_rtx_t* rtx, hawk_val_t* left, hawk_val_t* lvtype = HAWK_RTX_GETVALTYPE(rtx, left); rvtype = HAWK_RTX_GETVALTYPE(rtx, right); - if (!(rtx->awk->opt.trait & HAWK_FLEXMAP) && + if (!(rtx->hawk->opt.trait & HAWK_FLEXMAP) && (lvtype == HAWK_VAL_MAP || rvtype == HAWK_VAL_MAP)) { /* a map can't be compared againt other values */ @@ -5201,7 +5218,7 @@ static hawk_val_t* eval_binop_mod (hawk_rtx_t* rtx, hawk_val_t* left, hawk_val_t hawk_val_t* res; /* the mod function must be provided when the awk object is created to be able to calculate floating-pointer remainder */ - HAWK_ASSERT (rtx->awk->prm.math.mod != HAWK_NULL); + HAWK_ASSERT (rtx->hawk->prm.math.mod != HAWK_NULL); n1 = hawk_rtx_valtonum(rtx, left, &l1, &r1); n2 = hawk_rtx_valtonum(rtx, right, &l2, &r2); @@ -5225,15 +5242,15 @@ static hawk_val_t* eval_binop_mod (hawk_rtx_t* rtx, hawk_val_t* left, hawk_val_t break; case 1: - res = hawk_rtx_makefltval(rtx, rtx->awk->prm.math.mod(hawk_rtx_gethawk(rtx), (hawk_flt_t)r1, (hawk_flt_t)l2)); + res = hawk_rtx_makefltval(rtx, rtx->hawk->prm.math.mod(hawk_rtx_gethawk(rtx), (hawk_flt_t)r1, (hawk_flt_t)l2)); break; case 2: - res = hawk_rtx_makefltval(rtx, rtx->awk->prm.math.mod(hawk_rtx_gethawk(rtx), (hawk_flt_t)l1, (hawk_flt_t)r2)); + res = hawk_rtx_makefltval(rtx, rtx->hawk->prm.math.mod(hawk_rtx_gethawk(rtx), (hawk_flt_t)l1, (hawk_flt_t)r2)); break; case 3: - res = hawk_rtx_makefltval(rtx, rtx->awk->prm.math.mod(hawk_rtx_gethawk(rtx), (hawk_flt_t)r1, (hawk_flt_t)r2)); + res = hawk_rtx_makefltval(rtx, rtx->hawk->prm.math.mod(hawk_rtx_gethawk(rtx), (hawk_flt_t)r1, (hawk_flt_t)r2)); break; } @@ -5307,7 +5324,7 @@ static hawk_val_t* eval_binop_exp (hawk_rtx_t* rtx, hawk_val_t* left, hawk_val_t /* left - int, right - real */ res = hawk_rtx_makefltval ( rtx, - rtx->awk->prm.math.pow(hawk_rtx_gethawk(rtx), (hawk_flt_t)l1, (hawk_flt_t)r2) + rtx->hawk->prm.math.pow(hawk_rtx_gethawk(rtx), (hawk_flt_t)l1, (hawk_flt_t)r2) ); break; @@ -5315,7 +5332,7 @@ static hawk_val_t* eval_binop_exp (hawk_rtx_t* rtx, hawk_val_t* left, hawk_val_t /* left - real, right - real */ res = hawk_rtx_makefltval ( rtx, - rtx->awk->prm.math.pow(hawk_rtx_gethawk(rtx), (hawk_flt_t)r1,(hawk_flt_t)r2) + rtx->hawk->prm.math.pow(hawk_rtx_gethawk(rtx), (hawk_flt_t)r1,(hawk_flt_t)r2) ); break; } @@ -5836,7 +5853,7 @@ static HAWK_INLINE hawk_val_t* eval_fncall_fun_ex (hawk_rtx_t* rtx, hawk_nde_t* * hoping that the pointer assignment is atomic. (call->u.fun.fun = fun). * i don't mind each instance performs a search duplicately for a short while */ - pair = hawk_htb_search(rtx->awk->tree.funs, call->u.fun.name.ptr, call->u.fun.name.len); + pair = hawk_htb_search(rtx->hawk->tree.funs, call->u.fun.name.ptr, call->u.fun.name.len); if (!pair) { hawk_rtx_seterrfmt (rtx, &nde->loc, HAWK_EFUNNF, HAWK_T("function '%.*js' not found"), call->u.fun.name.len, call->u.fun.name.ptr); @@ -6585,7 +6602,7 @@ static hawk_val_t* eval_fun (hawk_rtx_t* rtx, hawk_nde_t* nde) * the funptr field in the node can be HAWK_NULL */ /* TODO: support builtin functions?, support module functions? */ - pair = hawk_htb_search(rtx->awk->tree.funs, ((hawk_nde_fun_t*)nde)->name.ptr, ((hawk_nde_fun_t*)nde)->name.len); + pair = hawk_htb_search(rtx->hawk->tree.funs, ((hawk_nde_fun_t*)nde)->name.ptr, ((hawk_nde_fun_t*)nde)->name.len); if (!pair) { /* it's unlikely to be not found in the function table for the parser structure. but keep this code in case */ diff --git a/hawk/lib/std.c b/hawk/lib/std.c index 25cb016d..788c0075 100644 --- a/hawk/lib/std.c +++ b/hawk/lib/std.c @@ -2029,7 +2029,7 @@ static int open_rio_console (hawk_rtx_t* rtx, hawk_rio_arg_t* riod) /* this part is more complex than the code in the else part. * it handles simple assignemnt as well as open files * via in ARGV instead of rxtn->c.in.files */ - xtn_t* xtn = (xtn_t*)GET_XTN(rtx->awk); + xtn_t* xtn = (xtn_t*)GET_XTN(hawk_rtx_gethawk(rtx)); hawk_val_t* v_argc, * v_argv, * v_pair; hawk_int_t i_argc; const hawk_ooch_t* file; @@ -2391,7 +2391,7 @@ static hawk_ooi_t awk_rio_console (hawk_rtx_t* rtx, hawk_rio_cmd_t cmd, hawk_rio static void fini_rxtn (hawk_rtx_t* rtx) { rxtn_t* rxtn = GET_RXTN(rtx); - /*xtn_t* xtn = (xtn_t*)GET_XTN(rtx->awk);*/ + /*xtn_t* xtn = (xtn_t*)GET_XTN(hawk_rtx_gethawk(rtx));*/ if (rxtn->c.in.files) { @@ -2685,7 +2685,7 @@ static hawk_rtx_t* open_rtx_std ( rxtn = GET_RXTN(rtx); - if (rtx->awk->opt.trait & HAWK_RIO) + if (rtx->hawk->opt.trait & HAWK_RIO) { if (hawk_htb_init(&rxtn->cmgrtab, hawk_getgem(awk), 256, 70, HAWK_SIZEOF(hawk_ooch_t), 1) <= -1) { @@ -2990,7 +2990,7 @@ static int fnc_setioattr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* no error is returned by hawk_rtx_strnum() if the strict option * of the second parameter is 0. so i don't check for an error */ - x = hawk_oochars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), ptr[2], len[2], &l, &r); + x = hawk_oochars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr[2], len[2], &l, &r); if (x == 0) r = (hawk_flt_t)l; ioattr = find_or_make_ioattr(rtx, &rxtn->cmgrtab, ptr[0], len[0]); diff --git a/hawk/lib/val.c b/hawk/lib/val.c index 82e4606d..3848faae 100644 --- a/hawk/lib/val.c +++ b/hawk/lib/val.c @@ -307,7 +307,7 @@ hawk_val_t* hawk_rtx_makenumorstrvalwithuchars (hawk_rtx_t* rtx, const hawk_uch_ hawk_int_t l; hawk_flt_t r; - x = hawk_uchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), ptr, len, &l, &r); + x = hawk_uchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r); if (x == 0) return hawk_rtx_makeintval(rtx, l); else if (x >= 1) return hawk_rtx_makefltval(rtx, r); @@ -321,7 +321,7 @@ hawk_val_t* hawk_rtx_makenumorstrvalwithbchars (hawk_rtx_t* rtx, const hawk_bch_ hawk_int_t l; hawk_flt_t r; - x = hawk_bchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), ptr, len, &l, &r); + x = hawk_bchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r); if (x == 0) return hawk_rtx_makeintval(rtx, l); else if (x >= 1) return hawk_rtx_makefltval(rtx, r); @@ -339,7 +339,7 @@ hawk_val_t* hawk_rtx_makenstrvalwithuchars (hawk_rtx_t* rtx, const hawk_uch_t* p hawk_int_t l; hawk_flt_t r; - x = hawk_uchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), ptr, len, &l, &r); + x = hawk_uchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r); v = hawk_rtx_makestrvalwithuchars(rtx, ptr, len); if (!v) return HAWK_NULL; @@ -363,7 +363,7 @@ hawk_val_t* hawk_rtx_makenstrvalwithbchars (hawk_rtx_t* rtx, const hawk_bch_t* p hawk_int_t l; hawk_flt_t r; - x = hawk_bchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), ptr, len, &l, &r); + x = hawk_bchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r); v = hawk_rtx_makestrvalwithbchars(rtx, ptr, len); if (!v) return HAWK_NULL; @@ -465,7 +465,7 @@ hawk_val_t* hawk_rtx_makenumormbsvalwithuchars (hawk_rtx_t* rtx, const hawk_uch_ hawk_int_t l; hawk_flt_t r; - x = hawk_uchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), ptr, len, &l, &r); + x = hawk_uchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r); if (x == 0) return hawk_rtx_makeintval(rtx, l); else if (x >= 1) return hawk_rtx_makefltval(rtx, r); @@ -479,7 +479,7 @@ hawk_val_t* hawk_rtx_makenumormbsvalwithbchars (hawk_rtx_t* rtx, const hawk_bch_ hawk_int_t l; hawk_flt_t r; - x = hawk_bchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), ptr, len, &l, &r); + x = hawk_bchars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(1, 1, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ptr, len, &l, &r); if (x == 0) return hawk_rtx_makeintval(rtx, l); else if (x >= 1) return hawk_rtx_makefltval(rtx, r); @@ -858,7 +858,7 @@ void hawk_rtx_freeval (hawk_rtx_t* rtx, hawk_val_t* val, int cache) /* code is just a pointer to a regular expression stored * in parse tree nodes. so don't free it. - hawk_freerex (rtx->awk, ((hawk_val_rex_t*)val)->code[0], ((hawk_val_rex_t*)val)->code[1]); + hawk_freerex (rtx->hawk, ((hawk_val_rex_t*)val)->code[0], ((hawk_val_rex_t*)val)->code[1]); */ hawk_rtx_freemem (rtx, val); @@ -1447,7 +1447,7 @@ int hawk_rtx_valtostr (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_rtx_valtostr_o return str_to_str(rtx, ((hawk_val_fun_t*)v)->fun->name.ptr, ((hawk_val_fun_t*)v)->fun->name.len, out); case HAWK_VAL_MAP: - if (rtx->awk->opt.trait & HAWK_FLEXMAP) + if (rtx->hawk->opt.trait & HAWK_FLEXMAP) { return str_to_str(rtx, HAWK_T("#MAP"), 4, out); } @@ -1651,7 +1651,7 @@ static int val_ref_to_num (hawk_rtx_t* rtx, const hawk_val_ref_t* ref, hawk_int_ if (idx == 0) { return hawk_oochars_to_num( - HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), + HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), HAWK_OOECS_PTR(&rtx->inrec.line), HAWK_OOECS_LEN(&rtx->inrec.line), l, r @@ -1660,7 +1660,7 @@ static int val_ref_to_num (hawk_rtx_t* rtx, const hawk_val_ref_t* ref, hawk_int_ else if (idx <= rtx->inrec.nflds) { return hawk_oochars_to_num( - HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), + HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), rtx->inrec.flds[idx-1].ptr, rtx->inrec.flds[idx-1].len, l, r @@ -1668,7 +1668,7 @@ static int val_ref_to_num (hawk_rtx_t* rtx, const hawk_val_ref_t* ref, hawk_int_ } else { - return hawk_oochars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), HAWK_T(""), 0, l, r); + return hawk_oochars_to_num(HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), HAWK_T(""), 0, l, r); } } @@ -1715,7 +1715,7 @@ int hawk_rtx_valtonum (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_int_t* l, hawk case HAWK_VAL_STR: return hawk_oochars_to_num( - HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), + HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ((hawk_val_str_t*)v)->val.ptr, ((hawk_val_str_t*)v)->val.len, l, r @@ -1723,7 +1723,7 @@ int hawk_rtx_valtonum (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_int_t* l, hawk case HAWK_VAL_MBS: return hawk_bchars_to_num( - HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, (hawk->opt.trait & HAWK_STRIPSTRSPC), 0), + HAWK_OOCHARS_TO_NUM_MAKE_OPTION(0, 0, HAWK_RTX_IS_STRIPSTRSPC_ON(rtx), 0), ((hawk_val_mbs_t*)v)->val.ptr, ((hawk_val_mbs_t*)v)->val.len, l, r @@ -1734,7 +1734,7 @@ int hawk_rtx_valtonum (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_int_t* l, hawk goto invalid; case HAWK_VAL_MAP: - if (rtx->awk->opt.trait & HAWK_FLEXMAP) + if (rtx->hawk->opt.trait & HAWK_FLEXMAP) { *l = HAWK_HTB_SIZE(((hawk_val_map_t*)v)->map); return 0; /* long */ @@ -2004,7 +2004,7 @@ int hawk_rtx_setrefval (hawk_rtx_t* rtx, hawk_val_ref_t* ref, hawk_val_t* val) /* new value: map, old value: nil or map => ok */ if (rref_vtype != HAWK_VAL_NIL && rref_vtype != HAWK_VAL_MAP) { - if (!(rtx->awk->opt.trait & HAWK_FLEXMAP)) + if (!(rtx->hawk->opt.trait & HAWK_FLEXMAP)) { /* cannot change a scalar value to a map */ hawk_rtx_seterrnum (rtx, HAWK_NULL, HAWK_ESCALARTOMAP); @@ -2017,7 +2017,7 @@ int hawk_rtx_setrefval (hawk_rtx_t* rtx, hawk_val_ref_t* ref, hawk_val_t* val) /* new value: scalar, old value: nil or scalar => ok */ if (rref_vtype == HAWK_VAL_MAP) { - if (!(rtx->awk->opt.trait & HAWK_FLEXMAP)) + if (!(rtx->hawk->opt.trait & HAWK_FLEXMAP)) { hawk_rtx_seterrnum (rtx, HAWK_NULL, HAWK_EMAPTOSCALAR); return -1;