From c9e0adfde07f745aec56b85fc54fe7337135f34d Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Thu, 19 Dec 2019 09:11:40 +0000 Subject: [PATCH] cleaned up regular expression functions in misc.c --- hawk/bin/main.c | 4 +- hawk/lib/fnc.c | 20 ++------ hawk/lib/hawk-tre.h | 6 ++- hawk/lib/misc-prv.h | 21 ++++---- hawk/lib/misc.c | 80 +++++++++++------------------ hawk/lib/rec.c | 24 ++++----- hawk/lib/rio.c | 14 ++---- hawk/lib/run.c | 4 +- hawk/lib/std.c | 120 +++++++++++++++++++++++++------------------- hawk/lib/tre.c | 20 ++++---- 10 files changed, 145 insertions(+), 168 deletions(-) diff --git a/hawk/bin/main.c b/hawk/bin/main.c index dcc24e45..b6d906ab 100644 --- a/hawk/bin/main.c +++ b/hawk/bin/main.c @@ -1158,8 +1158,8 @@ static HAWK_INLINE int execute_hawk (int argc, hawk_bch_t* argv[]) goto oops; } - rtx = hawk_rtx_openstd ( - awk, 0, HAWK_T("hawk"), + rtx = hawk_rtx_openstdwithbcstr( + awk, 0, "hawk", (arg.call? HAWK_NULL: (const hawk_ooch_t**)arg.icf.ptr), /* console input */ HAWK_NULL, /* console output */ arg.console_cmgr diff --git a/hawk/lib/fnc.c b/hawk/lib/fnc.c index 3765a650..b9218df5 100644 --- a/hawk/lib/fnc.c +++ b/hawk/lib/fnc.c @@ -928,10 +928,9 @@ int hawk_fnc_split (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) } else { - p = hawk_rtx_strxntokbyrex(rtx, str.ptr, org_len, p, str.len, fs_rex, &tok, &errnum); - if (p == HAWK_NULL && errnum != HAWK_ENOERR) + p = hawk_rtx_strxntokbyrex(rtx, str.ptr, org_len, p, str.len, fs_rex, &tok); + if (p == HAWK_NULL && hawk_rtx_geterrnum(rtx) != HAWK_ENOERR) { - hawk_rtx_seterrnum (rtx, errnum, HAWK_NULL); goto oops; } } @@ -1170,25 +1169,16 @@ static int __substitute (hawk_rtx_t* rtx, hawk_int_t max_count) * end of string($) needs to be tested */ while (cur.ptr <= s2_end) { - hawk_errnum_t errnum; int n; hawk_oow_t m, i; if (max_count == 0 || sub_count < max_count) { - n = hawk_matchrex ( - hawk_rtx_gethawk(rtx), rex, rtx->gbl.ignorecase, - &s2, &cur, &mat, HAWK_NULL, &errnum - ); + n = hawk_rtx_matchrex(rtx, rex, &s2, &cur, &mat, HAWK_NULL); + if (n <= -1) goto oops; } else n = 0; - if (n <= -1) - { - hawk_rtx_seterrnum (rtx, errnum, HAWK_NULL); - goto oops; - } - if (n == 0) { /* no more match found */ @@ -1366,7 +1356,7 @@ int hawk_fnc_match (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) tmp.ptr = str0 + start - 1; tmp.len = len0 - start + 1; - n = hawk_rtx_matchrex(rtx, a1, &tmp, &tmp, &mat, (nargs >= 4? submat: HAWK_NULL)); + n = hawk_rtx_matchval(rtx, a1, &tmp, &tmp, &mat, (nargs >= 4? submat: HAWK_NULL)); if (n <= -1) return -1; } diff --git a/hawk/lib/hawk-tre.h b/hawk/lib/hawk-tre.h index 250cc7ca..d65e09d5 100644 --- a/hawk/lib/hawk-tre.h +++ b/hawk/lib/hawk-tre.h @@ -125,7 +125,8 @@ HAWK_EXPORT int hawk_tre_execx ( hawk_oow_t len, hawk_tre_match_t* pmatch, hawk_oow_t nmatch, - int eflags + int eflags, + hawk_gem_t* errgem ); HAWK_EXPORT int hawk_tre_exec ( @@ -133,7 +134,8 @@ HAWK_EXPORT int hawk_tre_exec ( const hawk_ooch_t* str, hawk_tre_match_t* pmatch, hawk_oow_t nmatch, - int eflags + int eflags, + hawk_gem_t* errgem ); #if defined(__cplusplus) diff --git a/hawk/lib/misc-prv.h b/hawk/lib/misc-prv.h index af02364f..d961194d 100644 --- a/hawk/lib/misc-prv.h +++ b/hawk/lib/misc-prv.h @@ -55,9 +55,8 @@ hawk_ooch_t* hawk_rtx_strxntokbyrex ( hawk_oow_t len, const hawk_ooch_t* substr, hawk_oow_t sublen, - void* rex, - hawk_oocs_t* tok, - hawk_errnum_t* errnum + hawk_tre_t* rex, + hawk_oocs_t* tok ); hawk_ooch_t* hawk_rtx_strxnfld ( @@ -80,20 +79,22 @@ int hawk_buildrex ( hawk_tre_t** icode ); -int hawk_matchrex ( - hawk_t* awk, hawk_tre_t* code, int icase, - const hawk_oocs_t* str, const hawk_oocs_t* substr, - hawk_oocs_t* match, hawk_oocs_t submat[9], hawk_errnum_t* errnum -); - void hawk_freerex (hawk_t* awk, hawk_tre_t* code, hawk_tre_t* icode); -int hawk_rtx_matchrex ( +int hawk_rtx_matchval ( hawk_rtx_t* rtx, hawk_val_t* val, const hawk_oocs_t* str, const hawk_oocs_t* substr, hawk_oocs_t* match, hawk_oocs_t submat[9] ); + +int hawk_rtx_matchrex ( + hawk_rtx_t* rtx, hawk_tre_t* code, + const hawk_oocs_t* str, const hawk_oocs_t* substr, + hawk_oocs_t* match, hawk_oocs_t submat[9] +); + + #if defined(__cplusplus) } #endif diff --git a/hawk/lib/misc.c b/hawk/lib/misc.c index 696591e7..6a616dd2 100644 --- a/hawk/lib/misc.c +++ b/hawk/lib/misc.c @@ -244,8 +244,7 @@ hawk_ooch_t* hawk_rtx_strxntokbyrex ( hawk_rtx_t* rtx, const hawk_ooch_t* str, hawk_oow_t len, const hawk_ooch_t* substr, hawk_oow_t sublen, - void* rex, hawk_oocs_t* tok, - hawk_errnum_t* errnum) + hawk_tre_t* rex, hawk_oocs_t* tok) { int n; hawk_oow_t i; @@ -262,17 +261,15 @@ hawk_ooch_t* hawk_rtx_strxntokbyrex ( while (cursub.len > 0) { - n = hawk_matchrex ( - rtx->awk, rex, rtx->gbl.ignorecase, - &s, &cursub, &match, HAWK_NULL, errnum); - if (n == -1) return HAWK_NULL; + n = hawk_rtx_matchrex(rtx, rex, &s, &cursub, &match, HAWK_NULL); + if (n <= -1) return HAWK_NULL; + if (n == 0) { - /* no match has been found. - * return the entire string as a token */ + /* no match has been found. return the entire string as a token */ + hawk_rtx_seterrnum (rtx, HAWK_ENOERR, HAWK_NULL); /* reset HAWK_EREXNOMAT to no error */ tok->ptr = realsub.ptr; tok->len = realsub.len; - *errnum = HAWK_ENOERR; return HAWK_NULL; } @@ -310,11 +307,12 @@ hawk_ooch_t* hawk_rtx_strxntokbyrex ( } exit_loop: + hawk_rtx_seterrnum (rtx, HAWK_ENOERR, HAWK_NULL); + if (cursub.len <= 0) { tok->ptr = realsub.ptr; tok->len = realsub.len; - *errnum = HAWK_ENOERR; return HAWK_NULL; } @@ -326,13 +324,11 @@ exit_loop: if (!hawk_is_ooch_space(match.ptr[i])) { /* the match contains a non-space character. */ - *errnum = HAWK_ENOERR; return (hawk_ooch_t*)match.ptr+match.len; } } /* the match is all spaces */ - *errnum = HAWK_ENOERR; if (rtx->gbl.striprecspc > 0 || (rtx->gbl.striprecspc < 0 && (rtx->awk->opt.trait & HAWK_STRIPRECSPC))) { /* if the match reached the last character in the input string, @@ -486,21 +482,17 @@ int hawk_buildrex (hawk_t* awk, const hawk_ooch_t* ptn, hawk_oow_t len, hawk_err return 0; } -static int matchtre ( - hawk_tre_t* tre, int opt, - const hawk_oocs_t* str, hawk_oocs_t* mat, - hawk_oocs_t submat[9], hawk_errnum_t* errnum) +static int matchtre (hawk_tre_t* tre, int opt, const hawk_oocs_t* str, hawk_oocs_t* mat, hawk_oocs_t submat[9], hawk_gem_t* errgem) { int n; /*hawk_tre_match_t match[10] = { { 0, 0 }, };*/ hawk_tre_match_t match[10]; HAWK_MEMSET (match, 0, HAWK_SIZEOF(match)); - n = hawk_tre_execx(tre, str->ptr, str->len, match, HAWK_COUNTOF(match), opt); + n = hawk_tre_execx(tre, str->ptr, str->len, match, HAWK_COUNTOF(match), opt, errgem); if (n <= -1) { - if (hawk_gem_geterrnum(tre->gem) == HAWK_EREXNOMAT) return 0; - *errnum = hawk_gem_geterrnum(tre->gem); + if (hawk_gem_geterrnum(errgem) == HAWK_EREXNOMAT) return 0; return -1; } @@ -529,39 +521,22 @@ static int matchtre ( return 1; } -int hawk_matchrex ( - hawk_t* awk, hawk_tre_t* code, int ignorecase, - const hawk_oocs_t* str, const hawk_oocs_t* substr, - hawk_oocs_t* match, hawk_oocs_t submat[9], hawk_errnum_t* errnum) -{ - int x; - int opt = HAWK_TRE_BACKTRACKING; /* TODO: option... HAWK_TRE_BACKTRACKING ??? */ - - x = matchtre ( - code, ((str->ptr == substr->ptr)? opt: (opt | HAWK_TRE_NOTBOL)), - substr, match, submat, errnum - ); - - return x; -} - void hawk_freerex (hawk_t* awk, hawk_tre_t* code, hawk_tre_t* icode) { if (icode && icode != code) hawk_tre_close (icode); if (code) hawk_tre_close (code); } -int hawk_rtx_matchrex ( - hawk_rtx_t* rtx, hawk_val_t* val, - const hawk_oocs_t* str, const hawk_oocs_t* substr, hawk_oocs_t* match, hawk_oocs_t submat[9]) +int hawk_rtx_matchval (hawk_rtx_t* rtx, hawk_val_t* val, const hawk_oocs_t* str, const hawk_oocs_t* substr, hawk_oocs_t* match, hawk_oocs_t submat[9]) { - hawk_tre_t* code; int ignorecase, x; - hawk_errnum_t awkerr; + int opt = HAWK_TRE_BACKTRACKING; /* TODO: option... HAWK_TRE_BACKTRACKING ??? */ + hawk_tre_t* code; + hawk_errnum_t awkerr; /*TODO: get rid of this */ ignorecase = rtx->gbl.ignorecase; - if (HAWK_RTX_GETVALTYPE (rtx, val) == HAWK_VAL_REX) + if (HAWK_RTX_GETVALTYPE(rtx, val) == HAWK_VAL_REX) { code = ((hawk_val_rex_t*)val)->code[ignorecase]; } @@ -570,7 +545,7 @@ int hawk_rtx_matchrex ( /* convert to a string and build a regular expression */ hawk_oocs_t tmp; - tmp.ptr = hawk_rtx_getvaloocstr (rtx, val, &tmp.len); + tmp.ptr = hawk_rtx_getvaloocstr(rtx, val, &tmp.len); if (tmp.ptr == HAWK_NULL) return -1; x = ignorecase? hawk_buildrex(rtx->awk, tmp.ptr, tmp.len, &awkerr, HAWK_NULL, &code): @@ -583,11 +558,10 @@ int hawk_rtx_matchrex ( } } - x = matchtre ( - code, ((str->ptr == substr->ptr)? HAWK_TRE_BACKTRACKING: (HAWK_TRE_BACKTRACKING | HAWK_TRE_NOTBOL)), - substr, match, submat, &awkerr + x = matchtre( + code, ((str->ptr == substr->ptr)? opt: (opt | HAWK_TRE_NOTBOL)), + substr, match, submat, hawk_rtx_getgem(rtx) ); - if (x <= -1) hawk_rtx_seterrnum (rtx, awkerr, HAWK_NULL); if (HAWK_RTX_GETVALTYPE(rtx, val) == HAWK_VAL_REX) { @@ -595,11 +569,17 @@ int hawk_rtx_matchrex ( } else { - if (ignorecase) - hawk_freerex (rtx->awk, HAWK_NULL, code); - else - hawk_freerex (rtx->awk, code, HAWK_NULL); + hawk_tre_close (code); } return x; } + +int hawk_rtx_matchrex (hawk_rtx_t* rtx, hawk_tre_t* code, const hawk_oocs_t* str, const hawk_oocs_t* substr, hawk_oocs_t* match, hawk_oocs_t submat[9]) +{ + int opt = HAWK_TRE_BACKTRACKING; /* TODO: option... HAWK_TRE_BACKTRACKING ??? */ + return matchtre( + code, ((str->ptr == substr->ptr)? opt: (opt | HAWK_TRE_NOTBOL)), + substr, match, submat, hawk_rtx_getgem(rtx) + ); +} diff --git a/hawk/lib/rec.c b/hawk/lib/rec.c index adb52cd0..318cc605 100644 --- a/hawk/lib/rec.c +++ b/hawk/lib/rec.c @@ -166,26 +166,23 @@ static int split_record (hawk_rtx_t* rtx) switch (how) { case 0: - p = hawk_rtx_strxntok (rtx, - p, len, fs_ptr, fs_len, &tok); + p = hawk_rtx_strxntok (rtx, p, len, fs_ptr, fs_len, &tok); break; case 1: break; default: - p = hawk_rtx_strxntokbyrex ( + p = hawk_rtx_strxntokbyrex( rtx, HAWK_OOECS_PTR(&rtx->inrec.line), HAWK_OOECS_LEN(&rtx->inrec.line), p, len, - rtx->gbl.fs[rtx->gbl.ignorecase], &tok, &errnum + rtx->gbl.fs[rtx->gbl.ignorecase], &tok ); - if (p == HAWK_NULL && errnum != HAWK_ENOERR) + if (p == HAWK_NULL && hawk_rtx_geterrnum(rtx) != HAWK_ENOERR) { - if (fs_free != HAWK_NULL) - hawk_rtx_freemem (rtx, fs_free); - hawk_rtx_seterrnum (rtx, errnum, HAWK_NULL); + if (fs_free) hawk_rtx_freemem (rtx, fs_free); return -1; } } @@ -262,22 +259,19 @@ static int split_record (hawk_rtx_t* rtx) default: /* all other cases */ - p = hawk_rtx_strxntokbyrex ( + p = hawk_rtx_strxntokbyrex( rtx, HAWK_OOECS_PTR(&rtx->inrec.line), HAWK_OOECS_LEN(&rtx->inrec.line), p, len, - rtx->gbl.fs[rtx->gbl.ignorecase], &tok, &errnum + rtx->gbl.fs[rtx->gbl.ignorecase], &tok ); - if (p == HAWK_NULL && errnum != HAWK_ENOERR) + if (p == HAWK_NULL && hawk_rtx_geterrnum(rtx) != HAWK_ENOERR) { - if (fs_free != HAWK_NULL) - hawk_rtx_freemem (rtx, fs_free); - hawk_rtx_seterrnum (rtx, errnum, HAWK_NULL); + if (fs_free) hawk_rtx_freemem (rtx, fs_free); return -1; } } - #if 1 if (rtx->inrec.nflds == 0 && p == HAWK_NULL && tok.len == 0) { diff --git a/hawk/lib/rio.c b/hawk/lib/rio.c index afe0df9c..26da4674 100644 --- a/hawk/lib/rio.c +++ b/hawk/lib/rio.c @@ -228,15 +228,11 @@ static HAWK_INLINE int match_long_rs (hawk_rtx_t* rtx, hawk_ooecs_t* buf, hawk_r HAWK_ASSERT (hawk_rtx_gethawk(rtx), rtx->gbl.rs[0] != HAWK_NULL); HAWK_ASSERT (hawk_rtx_gethawk(rtx), rtx->gbl.rs[1] != HAWK_NULL); - ret = hawk_matchrex( - rtx->awk, rtx->gbl.rs[rtx->gbl.ignorecase], - rtx->gbl.ignorecase, HAWK_OOECS_OOCS(buf), HAWK_OOECS_OOCS(buf), - &match, HAWK_NULL, &errnum); - if (ret <= -1) - { - hawk_rtx_seterrnum (rtx, errnum, HAWK_NULL); - } - else if (ret >= 1) + ret = hawk_rtx_matchrex( + rtx, rtx->gbl.rs[rtx->gbl.ignorecase], + HAWK_OOECS_OOCS(buf), HAWK_OOECS_OOCS(buf), + &match, HAWK_NULL); + if (ret >= 1) { if (p->in.eof) { diff --git a/hawk/lib/run.c b/hawk/lib/run.c index b0b2ba0d..9a8bbffe 100644 --- a/hawk/lib/run.c +++ b/hawk/lib/run.c @@ -3238,7 +3238,7 @@ static hawk_val_t* eval_expression (hawk_rtx_t* rtx, hawk_nde_t* nde) vs.len = ((hawk_val_str_t*)rtx->inrec.d0)->val.len; } - n = hawk_rtx_matchrex(rtx, v, &vs, &vs, HAWK_NULL, HAWK_NULL); + n = hawk_rtx_matchval(rtx, v, &vs, &vs, HAWK_NULL, HAWK_NULL); if (n <= -1) { ADJERR_LOC (rtx, &nde->loc); @@ -5261,7 +5261,7 @@ static hawk_val_t* eval_binop_match0 ( out.ptr = hawk_rtx_getvaloocstr (rtx, left, &out.len); if (out.ptr == HAWK_NULL) return HAWK_NULL; - n = hawk_rtx_matchrex (rtx, right, &out, &out, HAWK_NULL, HAWK_NULL); + n = hawk_rtx_matchval(rtx, right, &out, &out, HAWK_NULL, HAWK_NULL); hawk_rtx_freevaloocstr (rtx, left, out.ptr); if (n <= -1) diff --git a/hawk/lib/std.c b/hawk/lib/std.c index b2166b77..e44ced2e 100644 --- a/hawk/lib/std.c +++ b/hawk/lib/std.c @@ -160,14 +160,14 @@ typedef struct rxtn_t struct { struct { - const hawk_ooch_t*const* files; + const hawk_ooch_t** files; hawk_oow_t index; hawk_oow_t count; } in; struct { - const hawk_ooch_t*const* files; + const hawk_ooch_t** files; hawk_oow_t index; hawk_oow_t count; } out; @@ -894,16 +894,14 @@ oops: return HAWK_NULL; } -static hawk_sio_t* open_sio (hawk_t* awk, const hawk_ooch_t* file, int flags) +static hawk_sio_t* open_sio (hawk_t* hawk, const hawk_ooch_t* file, int flags) { hawk_sio_t* sio; - sio = hawk_sio_open(hawk_getgem(awk), 0, file, flags); + sio = hawk_sio_open(hawk_getgem(hawk), 0, file, flags); if (sio == HAWK_NULL) { - hawk_oocs_t errarg; - errarg.ptr = (hawk_ooch_t*)file; - errarg.len = hawk_count_oocstr(file); - hawk_seterrnum (awk, HAWK_EOPEN, &errarg); + const hawk_ooch_t* bem = hawk_backuperrmsg(hawk); + hawk_seterrbfmt (hawk, HAWK_NULL, HAWK_EOPEN, "unable to open %js - %js", file, bem); } return sio; } @@ -912,12 +910,10 @@ static hawk_sio_t* open_sio_rtx (hawk_rtx_t* rtx, const hawk_ooch_t* file, int f { hawk_sio_t* sio; sio = hawk_sio_open(hawk_rtx_getgem(rtx), 0, file, flags); - if (sio == HAWK_NULL) + if (sio == HAWK_NULL) { - hawk_oocs_t errarg; - errarg.ptr = (hawk_ooch_t*)file; - errarg.len = hawk_count_oocstr(file); - hawk_rtx_seterrnum (rtx, HAWK_EOPEN, &errarg); + const hawk_ooch_t* bem = hawk_rtx_backuperrmsg(rtx); + hawk_rtx_seterrbfmt (rtx, HAWK_NULL, HAWK_EOPEN, "unable to open %js - %js", file, bem); } return sio; } @@ -1234,21 +1230,43 @@ static hawk_ooi_t sf_in_read (hawk_t* awk, hawk_sio_arg_t* arg, hawk_ooch_t* dat again: switch (xtn->s.in.x[xtn->s.in.xindex].type) { + #if defined(HAWK_OOCH_IS_UCH) case HAWK_PARSESTD_FILE: - case HAWK_PARSESTD_FILEB: + #endif case HAWK_PARSESTD_FILEU: HAWK_ASSERT (awk, arg->handle != HAWK_NULL); - n = hawk_sio_getoochars (arg->handle, data, size); + n = hawk_sio_getoochars(arg->handle, data, size); if (n <= -1) { - hawk_oocs_t ea; - ea.ptr = (hawk_ooch_t*)xtn->s.in.x[xtn->s.in.xindex].u.file.path; - if (ea.ptr == HAWK_NULL) ea.ptr = sio_std_names[HAWK_SIO_STDIN].ptr; - ea.len = hawk_count_oocstr(ea.ptr); - hawk_seterrnum (awk, HAWK_EREAD, &ea); + const hawk_ooch_t* bem = hawk_backuperrmsg(awk); + const hawk_uch_t* path; + path = xtn->s.in.x[xtn->s.in.xindex].u.fileu.path; + if (path) + hawk_seterrbfmt (awk, HAWK_NULL, HAWK_EREAD, "unable to read %ls - %js", path, bem); + else + hawk_seterrbfmt (awk, HAWK_NULL, HAWK_EREAD, "unable to read %js - %js", sio_std_names[HAWK_SIO_STDIN].ptr, bem); } break; + #if defined(HAWK_OOCH_IS_BCH) + case HAWK_PARSESTD_FILE: + #endif + case HAWK_PARSESTD_FILEB: + HAWK_ASSERT (awk, arg->handle != HAWK_NULL); + n = hawk_sio_getoochars(arg->handle, data, size); + if (n <= -1) + { + const hawk_ooch_t* bem = hawk_backuperrmsg(awk); + const hawk_bch_t* path; + path = xtn->s.in.x[xtn->s.in.xindex].u.fileb.path; + if (path) + hawk_seterrbfmt (awk, HAWK_NULL, HAWK_EREAD, "unable to read %hs - %js", path, bem); + else + hawk_seterrbfmt (awk, HAWK_NULL, HAWK_EREAD, "unable to read %js - %js", sio_std_names[HAWK_SIO_STDIN].ptr, bem); + } + break; + + case HAWK_PARSESTD_OOCS: parsestd_str: n = 0; @@ -1999,10 +2017,7 @@ static int open_rio_console (hawk_rtx_t* rtx, hawk_rio_arg_t* riod) if (rxtn->c.in.count == 0) { - sio = open_sio_std_rtx ( - rtx, HAWK_SIO_STDIN, - HAWK_SIO_READ | HAWK_SIO_IGNOREECERR - ); + sio = open_sio_std_rtx (rtx, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR); if (sio == HAWK_NULL) return -1; if (rxtn->c.cmgr) hawk_sio_setcmgr (sio, rxtn->c.cmgr); @@ -2111,10 +2126,8 @@ static int open_rio_console (hawk_rtx_t* rtx, hawk_rio_arg_t* riod) file = as.ptr; sio = (file[0] == HAWK_T('-') && file[1] == HAWK_T('\0'))? - open_sio_std_rtx (rtx, HAWK_SIO_STDIN, - HAWK_SIO_READ | HAWK_SIO_IGNOREECERR): - open_sio_rtx (rtx, file, - HAWK_SIO_READ | HAWK_SIO_IGNOREECERR); + open_sio_std_rtx (rtx, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR): + open_sio_rtx (rtx, file, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR); if (sio == HAWK_NULL) { hawk_rtx_freevaloocstr (rtx, v, as.ptr); @@ -2180,13 +2193,8 @@ static int open_rio_console (hawk_rtx_t* rtx, hawk_rio_arg_t* riod) } sio = (file[0] == HAWK_T('-') && file[1] == HAWK_T('\0'))? - open_sio_std_rtx ( - rtx, HAWK_SIO_STDOUT, - HAWK_SIO_WRITE | HAWK_SIO_IGNOREECERR | HAWK_SIO_LINEBREAK): - open_sio_rtx ( - rtx, file, - HAWK_SIO_WRITE | HAWK_SIO_CREATE | - HAWK_SIO_TRUNCATE | HAWK_SIO_IGNOREECERR); + open_sio_std_rtx (rtx, HAWK_SIO_STDOUT, HAWK_SIO_WRITE | HAWK_SIO_IGNOREECERR | HAWK_SIO_LINEBREAK): + open_sio_rtx (rtx, file, HAWK_SIO_WRITE | HAWK_SIO_CREATE | HAWK_SIO_TRUNCATE | HAWK_SIO_IGNOREECERR); if (sio == HAWK_NULL) return -1; if (rxtn->c.cmgr) hawk_sio_setcmgr (sio, rxtn->c.cmgr); @@ -2214,7 +2222,7 @@ static hawk_ooi_t awk_rio_console (hawk_rtx_t* rtx, hawk_rio_cmd_t cmd, hawk_rio switch (cmd) { case HAWK_RIO_CMD_OPEN: - return open_rio_console (rtx, riod); + return open_rio_console(rtx, riod); case HAWK_RIO_CMD_CLOSE: if (riod->handle) hawk_sio_close ((hawk_sio_t*)riod->handle); @@ -2307,7 +2315,7 @@ static int build_argcv ( hawk_rtx_refupval (rtx, v_argv); /* make ARGV[0] */ - v_tmp = hawk_rtx_makestrvalwithoocstr (rtx, id); + v_tmp = hawk_rtx_makestrvalwithoocstr(rtx, id); if (v_tmp == HAWK_NULL) { hawk_rtx_refdownval (rtx, v_argv); @@ -2661,15 +2669,18 @@ hawk_rtx_t* hawk_rtx_openstdwithbcstr ( rtx = open_rtx_std(awk, xtnsize, wid, (const hawk_uch_t**)wicf, (const hawk_uch_t**)wocf, cmgr); done: - if (wocf) + if (!rtx) { - for (i = 0; wocf[i]; i++) hawk_freemem (awk, wocf[i]); - hawk_freemem (awk, wocf); - } - if (wicf) - { - for (i = 0; wicf[i]; i++) hawk_freemem (awk, wicf[i]); - hawk_freemem (awk, wicf); + if (wocf) + { + for (i = 0; wocf[i]; i++) hawk_freemem (awk, wocf[i]); + hawk_freemem (awk, wocf); + } + if (wicf) + { + for (i = 0; wicf[i]; i++) hawk_freemem (awk, wicf[i]); + hawk_freemem (awk, wicf); + } } if (wid) hawk_freemem (awk, wid); @@ -2726,15 +2737,18 @@ hawk_rtx_t* hawk_rtx_openstdwithucstr ( rtx = open_rtx_std(awk, xtnsize, mid, (const hawk_bch_t**)micf, (const hawk_bch_t**)mocf, cmgr); done: - if (mocf) + if (!rtx) { - for (i = 0; mocf[i]; i++) hawk_freemem (awk, mocf[i]); - hawk_freemem (awk, mocf); - } - if (micf) - { - for (i = 0; micf[i]; i++) hawk_freemem (awk, micf[i]); - hawk_freemem (awk, micf); + if (mocf) + { + for (i = 0; mocf[i]; i++) hawk_freemem (awk, mocf[i]); + hawk_freemem (awk, mocf); + } + if (micf) + { + for (i = 0; micf[i]; i++) hawk_freemem (awk, micf[i]); + hawk_freemem (awk, micf); + } } if (mid) hawk_freemem (awk, mid); diff --git a/hawk/lib/tre.c b/hawk/lib/tre.c index 1f8d8066..4e8ac940 100644 --- a/hawk/lib/tre.c +++ b/hawk/lib/tre.c @@ -98,8 +98,8 @@ int hawk_tre_comp (hawk_tre_t* tre, const hawk_ooch_t* regex, unsigned int* nsub /* Fills the POSIX.2 regmatch_t array according to the TNFA tag and match endpoint values. */ -void tre_fill_pmatch(size_t nmatch, regmatch_t pmatch[], int cflags, - const tre_tnfa_t *tnfa, int *tags, int match_eo) +void tre_fill_pmatch (size_t nmatch, regmatch_t pmatch[], int cflags, + const tre_tnfa_t *tnfa, int *tags, int match_eo) { tre_submatch_data_t *submatch_data; unsigned int i, j; @@ -168,13 +168,13 @@ void tre_fill_pmatch(size_t nmatch, regmatch_t pmatch[], int cflags, Wrapper functions for POSIX compatible regexp matching. */ -int tre_have_backrefs(const regex_t *preg) +int tre_have_backrefs (const regex_t *preg) { tre_tnfa_t *tnfa = (void *)preg->TRE_REGEX_T_FIELD; return tnfa->have_backrefs; } -static int tre_match( +static int tre_match ( const regex_t* preg, const void *string, hawk_oow_t len, tre_str_type_t type, hawk_oow_t nmatch, regmatch_t pmatch[], int eflags) @@ -184,7 +184,7 @@ static int tre_match( int *tags = HAWK_NULL, eo; if (tnfa->num_tags > 0 && nmatch > 0) { - tags = xmalloc (preg->gem, sizeof(*tags) * tnfa->num_tags); + tags = xmalloc(preg->gem, sizeof(*tags) * tnfa->num_tags); if (tags == HAWK_NULL) return REG_ESPACE; } @@ -213,14 +213,14 @@ static int tre_match( int hawk_tre_execx ( hawk_tre_t* tre, const hawk_ooch_t *str, hawk_oow_t len, - regmatch_t* pmatch, hawk_oow_t nmatch, int eflags) + regmatch_t* pmatch, hawk_oow_t nmatch, int eflags, hawk_gem_t* errgem) { int ret; if (tre->TRE_REGEX_T_FIELD == HAWK_NULL) { /* regular expression is bad as none is compiled yet */ - hawk_gem_seterrnum (tre->gem, HAWK_NULL, HAWK_EREXBADPAT); + hawk_gem_seterrnum ((errgem? errgem: tre->gem), HAWK_NULL, HAWK_EREXBADPAT); return -1; } #if defined(HAWK_OOCH_IS_UCH) @@ -230,7 +230,7 @@ int hawk_tre_execx ( #endif if (ret > 0) { - hawk_gem_seterrnum (tre->gem, HAWK_NULL, ret); + hawk_gem_seterrnum ((errgem? errgem: tre->gem), HAWK_NULL, ret); return -1; } @@ -239,7 +239,7 @@ int hawk_tre_execx ( int hawk_tre_exec ( hawk_tre_t* tre, const hawk_ooch_t* str, - regmatch_t* pmatch, hawk_oow_t nmatch, int eflags) + regmatch_t* pmatch, hawk_oow_t nmatch, int eflags, hawk_gem_t* errgem) { - return hawk_tre_execx (tre, str, (hawk_oow_t)-1, pmatch, nmatch, eflags); + return hawk_tre_execx(tre, str, (hawk_oow_t)-1, pmatch, nmatch, eflags, errgem); }