diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index dccb4859..c2ff6857 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -825,8 +825,7 @@ void qse_awk_seterror ( qse_awk_t* awk, int errnum, qse_size_t errlin, - const qse_cstr_t* errarg, - qse_size_t argcnt + const qse_cstr_t* errarg ); int qse_awk_getoption ( @@ -1361,8 +1360,7 @@ void qse_awk_rtx_seterror ( qse_awk_rtx_t* rtx, int errnum, qse_size_t errlin, - const qse_cstr_t* errarg, - qse_size_t argcnt + const qse_cstr_t* errarg ); diff --git a/qse/include/qse/cmn/str.h b/qse/include/qse/cmn/str.h index 20dcf8bc..20c974ba 100644 --- a/qse/include/qse/cmn/str.h +++ b/qse/include/qse/cmn/str.h @@ -181,11 +181,21 @@ qse_size_t qse_strfcpy ( ); /******/ +/****f* Common/qse_strfncpy + * NAME + * qse_strfncpy - copy a string + * SYNOPSIS + */ +qse_size_t qse_strfncpy ( + qse_char_t* buf, + const qse_char_t* fmt, + const qse_cstr_t* str +); +/******/ + /****f* Common/qse_strxfcpy * NAME * qse_strxfcpy - copy a string - * DESCRIPTION - * "format $1 $3 $2 \\$1 string" * SYNOPSIS */ qse_size_t qse_strxfcpy ( @@ -195,11 +205,32 @@ qse_size_t qse_strxfcpy ( ... ); /******/ - + +/****f* Common/qse_strxfncpy + * NAME + * qse_strxfncpy - copy a string + * SYNOPSIS + */ +qse_size_t qse_strxfncpy ( + qse_char_t* buf, + qse_size_t bsz, + const qse_char_t* fmt, + const qse_cstr_t* str +); +/******/ + qse_size_t qse_strxcat ( - qse_char_t* buf, qse_size_t bsz, const qse_char_t* str); + qse_char_t* buf, + qse_size_t bsz, + const qse_char_t* str +); + qse_size_t qse_strxncat ( - qse_char_t* buf, qse_size_t bsz, const qse_char_t* str, qse_size_t len); + qse_char_t* buf, + qse_size_t bsz, + const qse_char_t* str, + qse_size_t len +); int qse_strcmp (const qse_char_t* s1, const qse_char_t* s2); int qse_strxcmp (const qse_char_t* s1, qse_size_t len1, const qse_char_t* s2); diff --git a/qse/lib/awk/awk.c b/qse/lib/awk/awk.c index bd66fec1..cb9e2a60 100644 --- a/qse/lib/awk/awk.c +++ b/qse/lib/awk/awk.c @@ -30,7 +30,7 @@ qse_cstr_t errarg; \ errarg.len = (leng); \ errarg.ptr = (arg); \ - qse_awk_seterror ((awk), (code), (line), &errarg, 1); \ + qse_awk_seterror ((awk), (code), (line), &errarg); \ } while (0) static void free_fun (qse_map_t* map, void* vptr, qse_size_t vlen) diff --git a/qse/lib/awk/eio.c b/qse/lib/awk/eio.c index beae3856..5f008a78 100644 --- a/qse/lib/awk/eio.c +++ b/qse/lib/awk/eio.c @@ -394,7 +394,7 @@ int qse_awk_readeio ( if (qse_str_ccat (buf, c) == (qse_size_t)-1) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); ret = -1; break; } @@ -491,7 +491,7 @@ int qse_awk_writeeio_str ( if (p == QSE_NULL) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } @@ -500,7 +500,7 @@ int qse_awk_writeeio_str ( { QSE_AWK_FREE (run->awk, p); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } @@ -673,7 +673,7 @@ int qse_awk_nexteio_read ( /* something is totally wrong */ QSE_ASSERT ( !"should never happen - cannot find the relevant eio entry"); - qse_awk_rtx_seterror (run, QSE_AWK_EINTERN, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_EINTERN, 0, QSE_NULL); return -1; } @@ -751,7 +751,7 @@ int qse_awk_nexteio_write ( /* something is totally wrong */ QSE_ASSERT (!"should never happen - cannot find the relevant eio entry"); - qse_awk_rtx_seterror (run, QSE_AWK_EINTERN, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_EINTERN, 0, QSE_NULL); return -1; } @@ -824,7 +824,7 @@ int qse_awk_closeeio_read ( if (handler (QSE_AWK_IO_CLOSE, p, QSE_NULL, 0) <= -1) { /* this is not a run-time error.*/ - qse_awk_rtx_seterror (run, QSE_AWK_EIOIMPL, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_EIOIMPL, 0, QSE_NULL); return -1; } } @@ -866,7 +866,7 @@ int qse_awk_closeeio_write ( if (handler == QSE_NULL) { /* no io handler provided */ - qse_awk_rtx_seterror (run, QSE_AWK_EIOUSER, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_EIOUSER, 0, QSE_NULL); return -1; } diff --git a/qse/lib/awk/err.c b/qse/lib/awk/err.c index 5f99cfa8..7027e7ac 100644 --- a/qse/lib/awk/err.c +++ b/qse/lib/awk/err.c @@ -34,20 +34,20 @@ static const qse_char_t* __geterrstr (int errnum) QSE_T("too many open files"), QSE_T("too many links"), QSE_T("resource temporarily unavailable"), - QSE_T("'%.*s' not existing"), - QSE_T("'%.*s' already exists"), + QSE_T("'${0}' not existing"), + QSE_T("'${0}' already exists"), QSE_T("file or data too big"), QSE_T("system too busy"), QSE_T("is a directory"), QSE_T("i/o error"), - QSE_T("cannot open '%.*s'"), - QSE_T("cannot read '%.*s'"), - QSE_T("cannot write '%.*s'"), - QSE_T("cannot close '%.*s'"), + QSE_T("cannot open '${0}'"), + QSE_T("cannot read '${0}'"), + QSE_T("cannot write '${0}'"), + QSE_T("cannot close '${0}'"), QSE_T("internal error that should never have happened"), - QSE_T("general run-time error"), + QSE_T("general runtime error"), QSE_T("block nested too deeply"), QSE_T("expressio nested too deeply"), @@ -59,46 +59,46 @@ static const qse_char_t* __geterrstr (int errnum) QSE_T("cannot close source output"), QSE_T("cannot write source output"), - QSE_T("invalid character '%.*s'"), - QSE_T("invalid digit '%.*s'"), + QSE_T("invalid character '${0}'"), + QSE_T("invalid digit '${0}'"), QSE_T("cannot unget character"), QSE_T("unexpected end of source"), QSE_T("a comment not closed properly"), QSE_T("a string not closed with a quote"), QSE_T("unexpected end of a regular expression"), - QSE_T("a left brace expected in place of '%.*s'"), - QSE_T("a left parenthesis expected in place of '%.*s'"), - QSE_T("a right parenthesis expected in place of '%.*s'"), - QSE_T("a right bracket expected in place of '%.*s'"), - QSE_T("a comma expected in place of '%.*s'"), - QSE_T("a semicolon expected in place of '%.*s'"), - QSE_T("a colon expected in place of '%.*s'"), + QSE_T("a left brace expected in place of '${0}'"), + QSE_T("a left parenthesis expected in place of '${0}'"), + QSE_T("a right parenthesis expected in place of '${0}'"), + QSE_T("a right bracket expected in place of '${0}'"), + QSE_T("a comma expected in place of '${0}'"), + QSE_T("a semicolon expected in place of '${0}'"), + QSE_T("a colon expected in place of '${0}'"), QSE_T("statement not ending with a semicolon"), - QSE_T("'in' expected in place of '%.*s'"), + QSE_T("'in' expected in place of '${0}'"), QSE_T("right-hand side of the 'in' operator not a variable"), QSE_T("invalid expression"), - QSE_T("keyword 'function' expected in place of '%.*s'"), - QSE_T("keyword 'while' expected in place of '%.*s'"), + QSE_T("keyword 'function' expected in place of '${0}'"), + QSE_T("keyword 'while' expected in place of '${0}'"), QSE_T("invalid assignment statement"), - QSE_T("an identifier expected in place of '%.*s'"), - QSE_T("'%.*s' not a valid function name"), + QSE_T("an identifier expected in place of '${0}'"), + QSE_T("'${0}' not a valid function name"), QSE_T("BEGIN not followed by a left bracket on the same line"), QSE_T("END not followed by a left bracket on the same line"), QSE_T("duplicate BEGIN"), QSE_T("duplicate END"), - QSE_T("intrinsic function '%.*s' redefined"), - QSE_T("function '%.*s' redefined"), - QSE_T("global variable '%.*s' redefined"), - QSE_T("parameter '%.*s' redefined"), - QSE_T("variable '%.*s' redefined"), - QSE_T("duplicate parameter name '%.*s'"), - QSE_T("duplicate global variable '%.*s'"), - QSE_T("duplicate local variable '%.*s'"), - QSE_T("'%.*s' not a valid parameter name"), - QSE_T("'%.*s' not a valid variable name"), - QSE_T("undefined identifier '%.*s'"), + QSE_T("intrinsic function '${0}' redefined"), + QSE_T("function '${0}' redefined"), + QSE_T("global variable '${0}' redefined"), + QSE_T("parameter '${0}' redefined"), + QSE_T("variable '${0}' redefined"), + QSE_T("duplicate parameter name '${0}'"), + QSE_T("duplicate global variable '${0}'"), + QSE_T("duplicate local variable '${0}'"), + QSE_T("'${0}' not a valid parameter name"), + QSE_T("'${0}' not a valid variable name"), + QSE_T("undefined identifier '${0}'"), QSE_T("l-value required"), QSE_T("too many global variables"), QSE_T("too many local variables"), @@ -119,9 +119,9 @@ static const qse_char_t* __geterrstr (int errnum) QSE_T("wrong position index"), QSE_T("too few arguments"), QSE_T("too many arguments"), - QSE_T("function '%.*s' not found"), + QSE_T("function '${0}' not found"), QSE_T("variable not indexable"), - QSE_T("variable '%.*s' not deletable"), + QSE_T("variable '${0}' not deletable"), QSE_T("value not a map"), QSE_T("right-hand side of the 'in' operator not a map"), QSE_T("right-hand side of the 'in' operator not a map nor nil"), @@ -129,7 +129,7 @@ static const qse_char_t* __geterrstr (int errnum) QSE_T("value not assignable"), QSE_T("an indexed value cannot be assigned a map"), QSE_T("a positional value cannot be assigned a map"), - QSE_T("map '%.*s' not assignable with a scalar"), + QSE_T("map '${0}' not assignable with a scalar"), QSE_T("cannot change a scalar value to a map"), QSE_T("a map is not allowed"), QSE_T("invalid value type"), @@ -221,10 +221,9 @@ void qse_awk_geterror ( if (errlin != QSE_NULL) *errlin = awk->errlin; if (errmsg != QSE_NULL) { - if (awk->errmsg[0] == QSE_T('\0')) - *errmsg = qse_awk_geterrstr (awk, awk->errnum); - else - *errmsg = awk->errmsg; + *errmsg = (awk->errmsg[0] == QSE_T('\0'))? + qse_awk_geterrstr (awk, awk->errnum): + awk->errmsg; } } @@ -244,105 +243,17 @@ void qse_awk_seterrmsg (qse_awk_t* awk, } void qse_awk_seterror ( - qse_awk_t* awk, int errnum, qse_size_t errlin, - const qse_cstr_t* errarg, qse_size_t argcnt) + qse_awk_t* awk, int errnum, + qse_size_t errlin, const qse_cstr_t* errarg) { const qse_char_t* errfmt; - qse_size_t fmtlen; - - QSE_ASSERT (argcnt <= 5); awk->errnum = errnum; awk->errlin = errlin; errfmt = qse_awk_geterrstr (awk, errnum); - fmtlen = qse_strlen(errfmt); - - switch (argcnt) - { - case 0: - awk->prm->sprintf ( - awk->prm->data, - awk->errmsg, - QSE_COUNTOF(awk->errmsg), - errfmt); - return; - - case 1: - { - qse_char_t tmp[QSE_COUNTOF(awk->errmsg)]; - qse_size_t len, tl; - - if (fmtlen < QSE_COUNTOF(awk->errmsg) && - errarg[0].len + fmtlen >= QSE_COUNTOF(awk->errmsg)) - { - len = QSE_COUNTOF(awk->errmsg) - fmtlen - 3 - 1; - tl = qse_strxncpy (tmp, QSE_COUNTOF(tmp), errarg[0].ptr, len); - tmp[tl] = QSE_T('.'); - tmp[tl+1] = QSE_T('.'); - tmp[tl+2] = QSE_T('.'); - len += 3; - } - else - { - len = errarg[0].len; - qse_strxncpy (tmp, QSE_COUNTOF(tmp), errarg[0].ptr, len); - } - - awk->prm->sprintf ( - awk->prm->data, - awk->errmsg, - QSE_COUNTOF(awk->errmsg), - errfmt, (int)len, tmp); - return; - } - - case 2: - awk->prm->sprintf ( - awk->prm->data, - awk->errmsg, - QSE_COUNTOF(awk->errmsg), - errfmt, - (int)errarg[0].len, errarg[0].ptr, - (int)errarg[1].len, errarg[1].ptr); - return; - - case 3: - awk->prm->sprintf ( - awk->prm->data, - awk->errmsg, - QSE_COUNTOF(awk->errmsg), - errfmt, - (int)errarg[0].len, errarg[0].ptr, - (int)errarg[1].len, errarg[1].ptr, - (int)errarg[2].len, errarg[2].ptr); - return; - - case 4: - awk->prm->sprintf ( - awk->prm->data, - awk->errmsg, - QSE_COUNTOF(awk->errmsg), - errfmt, - (int)errarg[0].len, errarg[0].ptr, - (int)errarg[1].len, errarg[1].ptr, - (int)errarg[2].len, errarg[2].ptr, - (int)errarg[3].len, errarg[3].ptr); - return; - - case 5: - awk->prm->sprintf ( - awk->prm->data, - awk->errmsg, - QSE_COUNTOF(awk->errmsg), - errfmt, - (int)errarg[0].len, errarg[0].ptr, - (int)errarg[1].len, errarg[1].ptr, - (int)errarg[2].len, errarg[2].ptr, - (int)errarg[3].len, errarg[3].ptr, - (int)errarg[4].len, errarg[4].ptr); - return; - } + QSE_ASSERT (errfmt != QSE_NULL); + qse_strxfncpy (awk->errmsg, QSE_COUNTOF(awk->errmsg), errfmt, errarg); } int qse_awk_rtx_geterrnum (qse_awk_rtx_t* run) @@ -363,139 +274,44 @@ const qse_char_t* qse_awk_rtx_geterrmsg (qse_awk_rtx_t* run) return run->errmsg; } -void qse_awk_rtx_seterrnum (qse_awk_rtx_t* run, int errnum) +void qse_awk_rtx_seterrnum (qse_awk_rtx_t* rtx, int errnum) { - run->errnum = errnum; - run->errlin = 0; - run->errmsg[0] = QSE_T('\0'); + rtx->errnum = errnum; + rtx->errlin = 0; + rtx->errmsg[0] = QSE_T('\0'); } -void qse_awk_rtx_seterrmsg (qse_awk_rtx_t* run, +void qse_awk_rtx_seterrmsg (qse_awk_rtx_t* rtx, int errnum, qse_size_t errlin, const qse_char_t* errmsg) { - run->errnum = errnum; - run->errlin = errlin; - qse_strxcpy (run->errmsg, QSE_COUNTOF(run->errmsg), errmsg); + rtx->errnum = errnum; + rtx->errlin = errlin; + qse_strxcpy (rtx->errmsg, QSE_COUNTOF(rtx->errmsg), errmsg); } void qse_awk_rtx_geterror ( - qse_awk_rtx_t* run, int* errnum, + qse_awk_rtx_t* rtx, int* errnum, qse_size_t* errlin, const qse_char_t** errmsg) { - if (errnum != QSE_NULL) *errnum = run->errnum; - if (errlin != QSE_NULL) *errlin = run->errlin; + if (errnum != QSE_NULL) *errnum = rtx->errnum; + if (errlin != QSE_NULL) *errlin = rtx->errlin; if (errmsg != QSE_NULL) { - if (run->errmsg[0] == QSE_T('\0')) - *errmsg = qse_awk_geterrstr (run->awk, run->errnum); - else - *errmsg = run->errmsg; + *errmsg = (rtx->errmsg[0] == QSE_T('\0'))? + qse_awk_geterrstr (rtx->awk, rtx->errnum): rtx->errmsg; } } void qse_awk_rtx_seterror ( - qse_awk_rtx_t* run, int errnum, qse_size_t errlin, - const qse_cstr_t* errarg, qse_size_t argcnt) + qse_awk_rtx_t* rtx, int errnum, + qse_size_t errlin, const qse_cstr_t* errarg) { const qse_char_t* errfmt; - qse_size_t fmtlen; - QSE_ASSERT (argcnt <= 5); + rtx->errnum = errnum; + rtx->errlin = errlin; - run->errnum = errnum; - run->errlin = errlin; - - errfmt = qse_awk_geterrstr (run->awk, errnum); - fmtlen = qse_strlen (errfmt); - - switch (argcnt) - { - case 0: - /* TODO: convert % to %% if the original % is not - * the first % of the %% sequence */ - run->awk->prm->sprintf ( - run->awk->prm->data, - run->errmsg, - QSE_COUNTOF(run->errmsg), - errfmt); - return; - - case 1: - { - /* TODO: what if the argument contains a null character? - * handle the case more gracefully than now... */ - - qse_char_t tmp[QSE_COUNTOF(run->errmsg)]; - qse_size_t len, tl; - - if (fmtlen < QSE_COUNTOF(run->errmsg) && - errarg[0].len + fmtlen >= QSE_COUNTOF(run->errmsg)) - { - len = QSE_COUNTOF(run->errmsg) - fmtlen - 3 - 1; - tl = qse_strxncpy (tmp, QSE_COUNTOF(tmp), errarg[0].ptr, len); - tmp[tl] = QSE_T('.'); - tmp[tl+1] = QSE_T('.'); - tmp[tl+2] = QSE_T('.'); - len += 3; - } - else - { - len = errarg[0].len; - qse_strxncpy (tmp, QSE_COUNTOF(tmp), errarg[0].ptr, len); - } - - run->awk->prm->sprintf ( - run->awk->prm->data, - run->errmsg, - QSE_COUNTOF(run->errmsg), - errfmt, len, tmp); - return; - } - - case 2: - run->awk->prm->sprintf ( - run->awk->prm->data, - run->errmsg, - QSE_COUNTOF(run->errmsg), - errfmt, - errarg[0].len, errarg[0].ptr, - errarg[1].len, errarg[1].ptr); - return; - - case 3: - run->awk->prm->sprintf ( - run->awk->prm->data, - run->errmsg, - QSE_COUNTOF(run->errmsg), - errfmt, - errarg[0].len, errarg[0].ptr, - errarg[1].len, errarg[1].ptr, - errarg[2].len, errarg[2].ptr); - return; - - case 4: - run->awk->prm->sprintf ( - run->awk->prm->data, - run->errmsg, - QSE_COUNTOF(run->errmsg), - errfmt, - errarg[0].len, errarg[0].ptr, - errarg[1].len, errarg[1].ptr, - errarg[2].len, errarg[2].ptr, - errarg[3].len, errarg[3].ptr); - return; - - case 5: - run->awk->prm->sprintf ( - run->awk->prm->data, - run->errmsg, - QSE_COUNTOF(run->errmsg), - errfmt, - errarg[0].len, errarg[0].ptr, - errarg[1].len, errarg[1].ptr, - errarg[2].len, errarg[2].ptr, - errarg[3].len, errarg[3].ptr, - errarg[4].len, errarg[4].ptr); - return; - } + errfmt = qse_awk_geterrstr (rtx->awk, errnum); + QSE_ASSERT (errfmt != QSE_NULL); + qse_strxfncpy (rtx->errmsg, QSE_COUNTOF(rtx->errmsg), errfmt, errarg); } diff --git a/qse/lib/awk/fnc.c b/qse/lib/awk/fnc.c index 41da77f2..e530807f 100644 --- a/qse/lib/awk/fnc.c +++ b/qse/lib/awk/fnc.c @@ -66,7 +66,7 @@ void* qse_awk_addfnc ( if (name_len <= 0) { - qse_awk_seterror (awk, QSE_AWK_EINVAL, 0, QSE_NULL, 0); + qse_awk_seterror (awk, QSE_AWK_EINVAL, 0, QSE_NULL); return QSE_NULL; } @@ -77,7 +77,7 @@ void* qse_awk_addfnc ( errarg.ptr = name; errarg.len = name_len; - qse_awk_seterror (awk, QSE_AWK_EEXIST, 0, &errarg, 1); + qse_awk_seterror (awk, QSE_AWK_EEXIST, 0, &errarg); return QSE_NULL; } @@ -131,7 +131,7 @@ int qse_awk_delfnc ( errarg.ptr = name; errarg.len = name_len; - qse_awk_seterror (awk, QSE_AWK_ENOENT, 0, &errarg, 1); + qse_awk_seterror (awk, QSE_AWK_ENOENT, 0, &errarg); return -1; } @@ -1387,7 +1387,7 @@ static int fnc_sprintf ( } } - x.ptr = qse_awk_format (run, + x.ptr = qse_awk_rtx_format (run, &out, &fbu, cs0.ptr, cs0.len, nargs, QSE_NULL, &x.len); if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, cs0.ptr); if (x.ptr == QSE_NULL) diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index e7045acf..0232edb9 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -348,7 +348,7 @@ static global_t gtab[] = do { \ if (qse_str_ccat((awk)->token.name,(c)) == (qse_size_t)-1) \ { \ - qse_awk_seterror (awk, QSE_AWK_ENOMEM, (awk)->token.line, QSE_NULL, 0); \ + qse_awk_seterror (awk, QSE_AWK_ENOMEM, (awk)->token.line, QSE_NULL); \ return -1; \ } \ } while (0) @@ -357,7 +357,7 @@ static global_t gtab[] = do { \ if (qse_str_ncat((awk)->token.name,(s),(l)) == (qse_size_t)-1) \ { \ - qse_awk_seterror (awk, QSE_AWK_ENOMEM, (awk)->token.line, QSE_NULL, 0); \ + qse_awk_seterror (awk, QSE_AWK_ENOMEM, (awk)->token.line, QSE_NULL); \ return -1; \ } \ } while (0) @@ -367,16 +367,16 @@ static global_t gtab[] = #define CLRERR(awk) qse_awk_seterrnum(awk,QSE_AWK_ENOERR) #define ISNOERR(awk) ((awk)->errnum == QSE_AWK_ENOERR) #define SETERR(awk,code) qse_awk_seterrnum(awk,code) -#define SETERRLIN(awk,code,line) qse_awk_seterror(awk,code,line,QSE_NULL,0) +#define SETERRLIN(awk,code,line) qse_awk_seterror(awk,code,line,QSE_NULL); #define SETERRTOK(awk,code) \ do { \ qse_cstr_t errarg; \ errarg.len = QSE_STR_LEN((awk)->token.name); \ errarg.ptr = QSE_STR_PTR((awk)->token.name); \ if (MATCH(awk,TOKEN_EOF)) \ - qse_awk_seterror (awk, code, (awk)->token.prev.line, &errarg, 1); \ + qse_awk_seterror (awk, code, (awk)->token.prev.line, &errarg); \ else \ - qse_awk_seterror (awk, code, (awk)->token.line, &errarg, 1); \ + qse_awk_seterror (awk, code, (awk)->token.line, &errarg); \ } while (0) #define SETERRARG(awk,code,line,arg,leng) \ @@ -384,7 +384,7 @@ static global_t gtab[] = qse_cstr_t errarg; \ errarg.len = (leng); \ errarg.ptr = (arg); \ - qse_awk_seterror ((awk), (code), (line), &errarg, 1); \ + qse_awk_seterror ((awk), (code), (line), &errarg); \ } while (0) #define MATCH_TERMINATOR(awk) \ diff --git a/qse/lib/awk/rec.c b/qse/lib/awk/rec.c index c7d5ca54..d7ba33be 100644 --- a/qse/lib/awk/rec.c +++ b/qse/lib/awk/rec.c @@ -44,7 +44,7 @@ int qse_awk_rtx_setrec ( { qse_awk_rtx_clrrec (run, QSE_FALSE); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } } @@ -148,7 +148,7 @@ static int split_record (qse_awk_rtx_t* run) { if (fs_free != QSE_NULL) QSE_AWK_FREE (run->awk, fs_free); - qse_awk_rtx_seterror (run, errnum, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, errnum, 0, QSE_NULL); return -1; } } @@ -176,7 +176,7 @@ static int split_record (qse_awk_rtx_t* run) if (tmp == QSE_NULL) { if (fs_free != QSE_NULL) QSE_AWK_FREE (run->awk, fs_free); - qse_awk_rtx_seterror (run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } @@ -205,7 +205,7 @@ static int split_record (qse_awk_rtx_t* run) { if (fs_free != QSE_NULL) QSE_AWK_FREE (run->awk, fs_free); - qse_awk_rtx_seterror (run, errnum, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, errnum, 0, QSE_NULL); return -1; } } @@ -316,7 +316,7 @@ static int recomp_record_fields ( if (tmp == QSE_NULL) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } } @@ -327,7 +327,7 @@ static int recomp_record_fields ( if (tmp == QSE_NULL) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } if (run->inrec.flds != QSE_NULL) @@ -356,7 +356,7 @@ static int recomp_record_fields ( run->gbl.ofs.len) == (qse_size_t)-1) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } } @@ -374,7 +374,7 @@ static int recomp_record_fields ( &run->inrec.line, str, len) == (qse_size_t)-1) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } @@ -399,7 +399,7 @@ static int recomp_record_fields ( &run->inrec.line, QSE_T("")) == (qse_size_t)-1) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } @@ -426,7 +426,7 @@ static int recomp_record_fields ( tmp->ptr, tmp->len) == (qse_size_t)-1) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } } diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index 39c145bf..7a93a3d2 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -284,7 +284,7 @@ static int set_global ( errarg.len = var->id.name.len; qse_awk_rtx_seterror (run, - QSE_AWK_EMAPTOSCALAR, var->line, &errarg, 1); + QSE_AWK_EMAPTOSCALAR, var->line, &errarg); } else { @@ -294,7 +294,7 @@ static int set_global ( errarg.ptr = qse_awk_getgblname ( run->awk, idx, &errarg.len); qse_awk_rtx_seterror (run, - QSE_AWK_EMAPTOSCALAR, 0, &errarg, 1); + QSE_AWK_EMAPTOSCALAR, 0, &errarg); } return -1; @@ -645,7 +645,7 @@ qse_awk_rtx_t* qse_awk_rtx_open ( QSE_ASSERTX (awk->prm != QSE_NULL, "Call qse_awk_setprm() first"); /* clear the awk error code */ - qse_awk_seterror (awk, QSE_AWK_ENOERR, 0, QSE_NULL, 0); + qse_awk_seterror (awk, QSE_AWK_ENOERR, 0, QSE_NULL); /* check if the code has ever been parsed */ if (awk->tree.ngbls == 0 && @@ -654,7 +654,7 @@ qse_awk_rtx_t* qse_awk_rtx_open ( awk->tree.chain_size == 0 && qse_map_getsize(awk->tree.funs) == 0) { - qse_awk_seterror (awk, QSE_AWK_ENOPER, 0, QSE_NULL, 0); + qse_awk_seterror (awk, QSE_AWK_ENOPER, 0, QSE_NULL); return QSE_NULL; } @@ -665,7 +665,7 @@ qse_awk_rtx_t* qse_awk_rtx_open ( { /* if it fails, the failure is reported thru * the awk object */ - qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL); return QSE_NULL; } @@ -766,14 +766,14 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) if (qse_str_init ( &rtx->inrec.line, MMGR(rtx), DEF_BUF_CAPA) == QSE_NULL) { - qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } if (qse_str_init (&rtx->format.out, MMGR(rtx), 256) == QSE_NULL) { qse_str_fini (&rtx->inrec.line); - qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } @@ -781,7 +781,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) { qse_str_fini (&rtx->format.out); qse_str_fini (&rtx->inrec.line); - qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } @@ -792,7 +792,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) qse_str_fini (&rtx->format.fmt); qse_str_fini (&rtx->format.out); qse_str_fini (&rtx->inrec.line); - qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } *(qse_awk_rtx_t**)qse_map_getxtn(rtx->named) = rtx; @@ -809,7 +809,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) qse_str_fini (&rtx->format.fmt); qse_str_fini (&rtx->format.out); qse_str_fini (&rtx->inrec.line); - qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } rtx->format.tmp.len = 4096; @@ -826,7 +826,7 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) qse_str_fini (&rtx->format.fmt); qse_str_fini (&rtx->format.out); qse_str_fini (&rtx->inrec.line); - qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_seterror (awk, QSE_AWK_ENOMEM, 0, QSE_NULL); return -1; } @@ -1481,7 +1481,7 @@ int qse_awk_rtx_call ( { /* cannot call the function again when exit() is called * in an AWK program or qse_awk_rtx_stop() is invoked */ - qse_awk_rtx_seterror (rtx, QSE_AWK_ENOPER, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (rtx, QSE_AWK_ENOPER, 0, QSE_NULL); return -1; } /*rtx->exit_level = EXIT_NONE;*/ @@ -1505,7 +1505,7 @@ int qse_awk_rtx_call ( errarg.ptr = call.what.fun.name.ptr; errarg.len = call.what.fun.name.len; - qse_awk_rtx_seterror (rtx, QSE_AWK_EFUNNONE, 0, &errarg, 1); + qse_awk_rtx_seterror (rtx, QSE_AWK_EFUNNONE, 0, &errarg); return -1; } @@ -1517,7 +1517,7 @@ int qse_awk_rtx_call ( { /* TODO: is this correct? what if i want to * allow arbitarary numbers of arguments? */ - qse_awk_rtx_seterror (rtx, QSE_AWK_EARGTM, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (rtx, QSE_AWK_EARGTM, 0, QSE_NULL); return -1; } @@ -1737,7 +1737,7 @@ static int run_block (qse_awk_rtx_t* run, qse_awk_nde_blk_t* nde) run->depth.cur.block >= run->depth.max.block) { qse_awk_rtx_seterror ( - run, QSE_AWK_EBLKNST, nde->line, QSE_NULL, 0); + run, QSE_AWK_EBLKNST, nde->line, QSE_NULL); return -1;; } @@ -2253,7 +2253,7 @@ static int run_foreach (qse_awk_rtx_t* run, qse_awk_nde_foreach_t* nde) qse_awk_rtx_refdownval (run, rv); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOTMAPIN, test->right->line, QSE_NULL, 0); + run, QSE_AWK_ENOTMAPIN, test->right->line, QSE_NULL); return -1; } map = ((qse_awk_val_map_t*)rv)->map; @@ -2303,7 +2303,7 @@ static int run_return (qse_awk_rtx_t* run, qse_awk_nde_return_t* nde) qse_awk_rtx_seterror ( run, QSE_AWK_EMAPNOTALLOWED, - nde->line, QSE_NULL, 0); + nde->line, QSE_NULL); return -1; } } @@ -2350,13 +2350,13 @@ static int run_next (qse_awk_rtx_t* run, qse_awk_nde_next_t* nde) if (run->active_block == (qse_awk_nde_blk_t*)run->awk->tree.begin) { qse_awk_rtx_seterror ( - run, QSE_AWK_ERNEXTBEG, nde->line, QSE_NULL, 0); + run, QSE_AWK_ERNEXTBEG, nde->line, QSE_NULL); return -1; } else if (run->active_block == (qse_awk_nde_blk_t*)run->awk->tree.end) { qse_awk_rtx_seterror ( - run, QSE_AWK_ERNEXTEND, nde->line, QSE_NULL, 0); + run, QSE_AWK_ERNEXTEND, nde->line, QSE_NULL); return -1; } @@ -2372,13 +2372,13 @@ static int run_nextinfile (qse_awk_rtx_t* run, qse_awk_nde_nextfile_t* nde) if (run->active_block == (qse_awk_nde_blk_t*)run->awk->tree.begin) { qse_awk_rtx_seterror ( - run, QSE_AWK_ERNEXTFBEG, nde->line, QSE_NULL, 0); + run, QSE_AWK_ERNEXTFBEG, nde->line, QSE_NULL); return -1; } else if (run->active_block == (qse_awk_nde_blk_t*)run->awk->tree.end) { qse_awk_rtx_seterror ( - run, QSE_AWK_ERNEXTFEND, nde->line, QSE_NULL, 0); + run, QSE_AWK_ERNEXTFEND, nde->line, QSE_NULL); return -1; } @@ -2483,8 +2483,7 @@ static int run_delete (qse_awk_rtx_t* run, qse_awk_nde_delete_t* nde) qse_awk_rtx_refdownval (run, tmp); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, var->line, - QSE_NULL, 0); + run, QSE_AWK_ENOMEM, var->line, QSE_NULL); return -1; } @@ -2508,8 +2507,7 @@ static int run_delete (qse_awk_rtx_t* run, qse_awk_nde_delete_t* nde) errarg.len = var->id.name.len; qse_awk_rtx_seterror ( - run, QSE_AWK_ENOTDEL, var->line, - &errarg, 1); + run, QSE_AWK_ENOTDEL, var->line, &errarg); return -1; } @@ -2632,8 +2630,7 @@ static int run_delete (qse_awk_rtx_t* run, qse_awk_nde_delete_t* nde) errarg.len = var->id.name.len; qse_awk_rtx_seterror ( - run, QSE_AWK_ENOTDEL, var->line, - &errarg, 1); + run, QSE_AWK_ENOTDEL, var->line, &errarg); return -1; } @@ -2690,7 +2687,7 @@ static int run_delete (qse_awk_rtx_t* run, qse_awk_nde_delete_t* nde) "the delete statement cannot be called with other nodes than the variables such as a named variable, a named indexed variable, etc"); qse_awk_rtx_seterror ( - run, QSE_AWK_ERDELETE, var->line, QSE_NULL, 0); + run, QSE_AWK_ERDELETE, var->line, QSE_NULL); return -1; } @@ -2745,7 +2742,7 @@ static int run_reset (qse_awk_rtx_t* run, qse_awk_nde_reset_t* nde) "the reset statement can only be called with plain variables"); qse_awk_rtx_seterror ( - run, QSE_AWK_ERRESET, var->line, QSE_NULL, 0); + run, QSE_AWK_ERRESET, var->line, QSE_NULL); return -1; } @@ -2793,7 +2790,7 @@ static int run_print (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) /* the destination name is empty */ QSE_AWK_FREE (run->awk, out); qse_awk_rtx_seterror ( - run, QSE_AWK_EIONMEM, nde->line, QSE_NULL, 0); + run, QSE_AWK_EIONMEM, nde->line, QSE_NULL); return -1; } @@ -2806,8 +2803,7 @@ static int run_print (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) /* if so, it skips writing */ QSE_AWK_FREE (run->awk, out); qse_awk_rtx_seterror ( - run, QSE_AWK_EIONMNL, nde->line, - QSE_NULL, 0); + run, QSE_AWK_EIONMNL, nde->line, QSE_NULL); return -1; } } @@ -2952,7 +2948,7 @@ static int run_printf (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) /* the output destination name is empty. */ QSE_AWK_FREE (run->awk, out); qse_awk_rtx_seterror ( - run, QSE_AWK_EIONMEM, nde->line, QSE_NULL, 0); + run, QSE_AWK_EIONMEM, nde->line, QSE_NULL); return -1; } @@ -2964,8 +2960,7 @@ static int run_printf (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) * character. */ QSE_AWK_FREE (run->awk, out); qse_awk_rtx_seterror ( - run, QSE_AWK_EIONMNL, nde->line, - QSE_NULL, 0); + run, QSE_AWK_EIONMNL, nde->line, QSE_NULL); return -1; } } @@ -3043,7 +3038,7 @@ static int output_formatted ( qse_size_t len; int n; - ptr = qse_awk_format (run, + ptr = qse_awk_rtx_format (run, QSE_NULL, QSE_NULL, fmt, fmt_len, 0, args, &len); if (ptr == QSE_NULL) return -1; @@ -3107,7 +3102,7 @@ static qse_awk_val_t* eval_expression (qse_awk_rtx_t* run, qse_awk_nde_t* nde) * character. otherwise, the following way of * setting the error information may not work */ qse_awk_rtx_seterror ( - run, errnum, nde->line, QSE_NULL, 0); + run, errnum, nde->line, QSE_NULL); return QSE_NULL; } } @@ -3185,7 +3180,7 @@ static qse_awk_val_t* eval_group (qse_awk_rtx_t* run, qse_awk_nde_t* nde) /* eval_binop_in evaluates the QSE_AWK_NDE_GRP specially. * so this function should never be reached. */ QSE_ASSERT (!"should never happen - NDE_GRP only for in"); - qse_awk_rtx_seterror (run, QSE_AWK_EINTERN, nde->line, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_EINTERN, nde->line, QSE_NULL); return QSE_NULL; } @@ -3314,7 +3309,7 @@ static qse_awk_val_t* do_assignment ( return ret; exit_on_error: - qse_awk_rtx_seterror (run, errnum, var->line, QSE_NULL, 0); + qse_awk_rtx_seterror (run, errnum, var->line, QSE_NULL); return QSE_NULL; } @@ -3348,7 +3343,7 @@ static qse_awk_val_t* do_assignment_scalar ( errarg.len = var->id.name.len; qse_awk_rtx_seterror (run, - QSE_AWK_EMAPTOSCALAR, var->line, &errarg, 1); + QSE_AWK_EMAPTOSCALAR, var->line, &errarg); return QSE_NULL; } @@ -3356,7 +3351,7 @@ static qse_awk_val_t* do_assignment_scalar ( var->id.name.ptr, var->id.name.len, val, 0) == QSE_NULL) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, var->line, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, var->line, QSE_NULL); return QSE_NULL; } @@ -3384,7 +3379,7 @@ static qse_awk_val_t* do_assignment_scalar ( errarg.len = var->id.name.len; qse_awk_rtx_seterror (run, - QSE_AWK_EMAPTOSCALAR, var->line, &errarg, 1); + QSE_AWK_EMAPTOSCALAR, var->line, &errarg); return QSE_NULL; } @@ -3405,7 +3400,7 @@ static qse_awk_val_t* do_assignment_scalar ( errarg.len = var->id.name.len; qse_awk_rtx_seterror (run, - QSE_AWK_EMAPTOSCALAR, var->line, &errarg, 1); + QSE_AWK_EMAPTOSCALAR, var->line, &errarg); return QSE_NULL; } @@ -3479,7 +3474,7 @@ static qse_awk_val_t* do_assignment_map ( qse_awk_rtx_refdownval (run, tmp); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, var->line, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, var->line, QSE_NULL); return QSE_NULL; } @@ -3517,7 +3512,7 @@ static qse_awk_val_t* do_assignment_map ( { /* variable assigned is not a map */ qse_awk_rtx_seterror ( - run, QSE_AWK_ENOTIDX, var->line, QSE_NULL, 0); + run, QSE_AWK_ENOTIDX, var->line, QSE_NULL); return QSE_NULL; } @@ -3537,7 +3532,7 @@ static qse_awk_val_t* do_assignment_map ( if (qse_map_upsert (map->map, str, len, val, 0) == QSE_NULL) { if (str != idxbuf) QSE_AWK_FREE (run->awk, str); - qse_awk_rtx_seterror (run, QSE_AWK_ENOMEM, var->line, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_ENOMEM, var->line, QSE_NULL); return QSE_NULL; } @@ -3566,14 +3561,14 @@ static qse_awk_val_t* do_assignment_pos ( if (n == -1) { qse_awk_rtx_seterror ( - run, QSE_AWK_EPOSIDX, pos->line, QSE_NULL, 0); + run, QSE_AWK_EPOSIDX, pos->line, QSE_NULL); return QSE_NULL; } if (n == 1) lv = (qse_long_t)rv; if (!IS_VALID_POSIDX(lv)) { qse_awk_rtx_seterror ( - run, QSE_AWK_EPOSIDX, pos->line, QSE_NULL, 0); + run, QSE_AWK_EPOSIDX, pos->line, QSE_NULL); return QSE_NULL; } @@ -3818,7 +3813,7 @@ static qse_awk_val_t* eval_binop_in ( !"should never happen - in needs a plain variable"); qse_awk_rtx_seterror ( - run, QSE_AWK_EINTERN, right->line, QSE_NULL, 0); + run, QSE_AWK_EINTERN, right->line, QSE_NULL); return QSE_NULL; } @@ -3870,7 +3865,7 @@ static qse_awk_val_t* eval_binop_in ( if (str != idxbuf) QSE_AWK_FREE (run->awk, str); qse_awk_rtx_refdownval (run, rv); - qse_awk_rtx_seterror (run, QSE_AWK_ENOTMAPNILIN, right->line, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_ENOTMAPNILIN, right->line, QSE_NULL); return QSE_NULL; } @@ -4729,7 +4724,7 @@ static qse_awk_val_t* eval_binop_match0 ( ((qse_awk_val_str_t*)right)->len, &errnum); if (rex_code == QSE_NULL) { - qse_awk_rtx_seterror (run, errnum, rline, QSE_NULL, 0); + qse_awk_rtx_seterror (run, errnum, rline, QSE_NULL); return QSE_NULL; } } @@ -4744,7 +4739,7 @@ static qse_awk_val_t* eval_binop_match0 ( { QSE_AWK_FREE (run->awk, str); - qse_awk_rtx_seterror (run, errnum, rline, QSE_NULL, 0); + qse_awk_rtx_seterror (run, errnum, rline, QSE_NULL); return QSE_NULL; } @@ -4764,7 +4759,7 @@ static qse_awk_val_t* eval_binop_match0 ( if (right->type != QSE_AWK_VAL_REX) QSE_AWK_FREE (run->awk, rex_code); - qse_awk_rtx_seterror (run, errnum, lline, QSE_NULL, 0); + qse_awk_rtx_seterror (run, errnum, lline, QSE_NULL); return QSE_NULL; } @@ -4800,7 +4795,7 @@ static qse_awk_val_t* eval_binop_match0 ( if (right->type != QSE_AWK_VAL_REX) QSE_AWK_FREE (run->awk, rex_code); - qse_awk_rtx_seterror (run, errnum, lline, QSE_NULL, 0); + qse_awk_rtx_seterror (run, errnum, lline, QSE_NULL); return QSE_NULL; } @@ -4910,7 +4905,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) exp->left->type > QSE_AWK_NDE_POS) { qse_awk_rtx_seterror ( - run, QSE_AWK_EOPERAND, nde->line, QSE_NULL, 0); + run, QSE_AWK_EOPERAND, nde->line, QSE_NULL); return QSE_NULL; } @@ -4959,7 +4954,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) /* qse_awk_rtx_seterror ( run, QSE_AWK_EOPERAND, nde->line, - QSE_NULL, 0); + QSE_NULL); */ run->errlin = nde->line; return QSE_NULL; @@ -5023,7 +5018,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) /* qse_awk_rtx_seterror ( run, QSE_AWK_EOPERAND, nde->line, - QSE_NULL, 0); + QSE_NULL); */ run->errlin = nde->line; return QSE_NULL; @@ -5055,7 +5050,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) qse_awk_rtx_refdownval (run, left); qse_awk_rtx_seterror ( - run, QSE_AWK_EINTERN, nde->line, QSE_NULL, 0); + run, QSE_AWK_EINTERN, nde->line, QSE_NULL); return QSE_NULL; } @@ -5085,7 +5080,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) exp->left->type > QSE_AWK_NDE_POS) { qse_awk_rtx_seterror ( - run, QSE_AWK_EOPERAND, nde->line, QSE_NULL, 0); + run, QSE_AWK_EOPERAND, nde->line, QSE_NULL); return QSE_NULL; } @@ -5154,7 +5149,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) /* qse_awk_rtx_seterror ( run, QSE_AWK_EOPERAND, nde->line, - QSE_NULL, 0); + QSE_NULL); */ run->errlin = nde->line; return QSE_NULL; @@ -5264,7 +5259,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) /* qse_awk_rtx_seterror ( run, QSE_AWK_EOPERAND, nde->line, - QSE_NULL, 0); + QSE_NULL); */ run->errlin = nde->line; return QSE_NULL; @@ -5322,7 +5317,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) qse_awk_rtx_refdownval (run, left); qse_awk_rtx_seterror ( - run, QSE_AWK_EINTERN, nde->line, QSE_NULL, 0); + run, QSE_AWK_EINTERN, nde->line, QSE_NULL); return QSE_NULL; } @@ -5367,14 +5362,14 @@ static qse_awk_val_t* eval_fnc (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (call->nargs < call->what.fnc.arg.min) { qse_awk_rtx_seterror ( - run, QSE_AWK_EARGTF, nde->line, QSE_NULL, 0); + run, QSE_AWK_EARGTF, nde->line, QSE_NULL); return QSE_NULL; } if (call->nargs > call->what.fnc.arg.max) { qse_awk_rtx_seterror ( - run, QSE_AWK_EARGTM, nde->line, QSE_NULL, 0); + run, QSE_AWK_EARGTM, nde->line, QSE_NULL); return QSE_NULL; } @@ -5400,7 +5395,7 @@ static qse_awk_val_t* eval_fun_ex ( errarg.len = call->what.fun.name.len, qse_awk_rtx_seterror (run, - QSE_AWK_EFUNNONE, nde->line, &errarg, 1); + QSE_AWK_EFUNNONE, nde->line, &errarg); return QSE_NULL; } @@ -5412,7 +5407,7 @@ static qse_awk_val_t* eval_fun_ex ( /* TODO: is this correct? what if i want to * allow arbitarary numbers of arguments? */ qse_awk_rtx_seterror ( - run, QSE_AWK_EARGTM, nde->line, QSE_NULL, 0); + run, QSE_AWK_EARGTM, nde->line, QSE_NULL); return QSE_NULL; } @@ -5522,7 +5517,7 @@ static qse_awk_val_t* __eval_call ( if (__raw_push(run,(void*)run->stack_base) == -1) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, nde->line, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, nde->line, QSE_NULL); return QSE_NULL; } @@ -5530,7 +5525,7 @@ static qse_awk_val_t* __eval_call ( { __raw_pop (run); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, nde->line, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, nde->line, QSE_NULL); return QSE_NULL; } @@ -5540,7 +5535,7 @@ static qse_awk_val_t* __eval_call ( __raw_pop (run); __raw_pop (run); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, nde->line, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, nde->line, QSE_NULL); return QSE_NULL; } @@ -5551,7 +5546,7 @@ static qse_awk_val_t* __eval_call ( __raw_pop (run); __raw_pop (run); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, nde->line, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, nde->line, QSE_NULL); return QSE_NULL; } @@ -5577,7 +5572,7 @@ static qse_awk_val_t* __eval_call ( UNWIND_RTX_STACK (run, nargs); qse_awk_rtx_seterror ( run, QSE_AWK_ENOMEM, nde->line, - QSE_NULL, 0); + QSE_NULL); return QSE_NULL; } @@ -5627,7 +5622,7 @@ static qse_awk_val_t* __eval_call ( * fix it */ qse_awk_rtx_seterror ( run, QSE_AWK_EFNCIMPL, - nde->line, QSE_NULL, 0); + nde->line, QSE_NULL); } else { @@ -5714,7 +5709,7 @@ static qse_size_t push_arg_from_vals (qse_awk_rtx_t* rtx, qse_awk_nde_call_t* ca UNWIND_RTX_STACK_ARG (rtx, nargs); qse_awk_rtx_seterror ( - rtx, QSE_AWK_ENOMEM, call->line, QSE_NULL, 0); + rtx, QSE_AWK_ENOMEM, call->line, QSE_NULL); return (qse_size_t)-1; } } @@ -5781,7 +5776,7 @@ static qse_size_t push_arg_from_nde (qse_awk_rtx_t* rtx, qse_awk_nde_call_t* cal UNWIND_RTX_STACK_ARG (rtx, nargs); qse_awk_rtx_seterror ( - rtx, QSE_AWK_ENOMEM, call->line, QSE_NULL, 0); + rtx, QSE_AWK_ENOMEM, call->line, QSE_NULL); return (qse_size_t)-1; } @@ -5828,7 +5823,7 @@ static int get_reference ( { qse_awk_rtx_seterror ( run, QSE_AWK_ENOMEM, nde->line, - QSE_NULL, 0); + QSE_NULL); return -1; } } @@ -5870,7 +5865,7 @@ static int get_reference ( { qse_awk_rtx_seterror ( run, QSE_AWK_ENOMEM, nde->line, - QSE_NULL, 0); + QSE_NULL); return -1; } } @@ -5924,14 +5919,14 @@ static int get_reference ( if (n == -1) { qse_awk_rtx_seterror ( - run, QSE_AWK_EPOSIDX, nde->line, QSE_NULL, 0); + run, QSE_AWK_EPOSIDX, nde->line, QSE_NULL); return -1; } if (n == 1) lv = (qse_long_t)rv; if (!IS_VALID_POSIDX(lv)) { qse_awk_rtx_seterror ( - run, QSE_AWK_EPOSIDX, nde->line, QSE_NULL, 0); + run, QSE_AWK_EPOSIDX, nde->line, QSE_NULL); return -1; } @@ -5939,7 +5934,7 @@ static int get_reference ( return 0; } - qse_awk_rtx_seterror (run, QSE_AWK_ENOTREF, nde->line, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_ENOTREF, nde->line, QSE_NULL); return -1; } @@ -5971,7 +5966,7 @@ static qse_awk_val_t** get_reference_indexed ( else if ((*val)->type != QSE_AWK_VAL_MAP) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOTMAP, nde->line, QSE_NULL, 0); + run, QSE_AWK_ENOTMAP, nde->line, QSE_NULL); return QSE_NULL; } @@ -5995,7 +5990,7 @@ static qse_awk_val_t** get_reference_indexed ( { if (str != idxbuf) QSE_AWK_FREE (run->awk, str); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, nde->line, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, nde->line, QSE_NULL); return QSE_NULL; } @@ -6123,7 +6118,7 @@ static qse_awk_val_t* eval_indexed ( else if ((*val)->type != QSE_AWK_VAL_MAP) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOTMAP, nde->line, QSE_NULL, 0); + run, QSE_AWK_ENOTMAP, nde->line, QSE_NULL); return QSE_NULL; } @@ -6157,7 +6152,7 @@ static qse_awk_val_t* eval_namedidx (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (pair == QSE_NULL) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, nde->line, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, nde->line, QSE_NULL); return QSE_NULL; } @@ -6202,7 +6197,7 @@ static qse_awk_val_t* eval_pos (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (n == -1) { qse_awk_rtx_seterror ( - run, QSE_AWK_EPOSIDX, nde->line, QSE_NULL, 0); + run, QSE_AWK_EPOSIDX, nde->line, QSE_NULL); return QSE_NULL; } if (n == 1) lv = (qse_long_t)rv; @@ -6210,7 +6205,7 @@ static qse_awk_val_t* eval_pos (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (lv < 0) { qse_awk_rtx_seterror ( - run, QSE_AWK_EPOSIDX, nde->line, QSE_NULL, 0); + run, QSE_AWK_EPOSIDX, nde->line, QSE_NULL); return QSE_NULL; } if (lv == 0) v = run->inrec.d0; @@ -6289,7 +6284,7 @@ static qse_awk_val_t* eval_getline (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { if (in != QSE_NULL) QSE_AWK_FREE (run->awk, in); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, nde->line, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, nde->line, QSE_NULL); return QSE_NULL; } @@ -6560,7 +6555,7 @@ static qse_char_t* idxnde_to_str ( if (qse_str_init (&idxstr, MMGR(run), DEF_BUF_CAPA) == QSE_NULL) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, nde->line, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, nde->line, QSE_NULL); return QSE_NULL; } @@ -6584,8 +6579,7 @@ static qse_char_t* idxnde_to_str ( qse_str_fini (&idxstr); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, nde->line, - QSE_NULL, 0); + run, QSE_AWK_ENOMEM, nde->line, QSE_NULL); return QSE_NULL; } @@ -6612,7 +6606,7 @@ static qse_char_t* idxnde_to_str ( return str; } -qse_char_t* qse_awk_format ( +qse_char_t* qse_awk_rtx_format ( qse_awk_rtx_t* run, qse_str_t* out, qse_str_t* fbu, const qse_char_t* fmt, qse_size_t fmt_len, qse_size_t nargs_on_stack, qse_awk_nde_t* args, qse_size_t* len) diff --git a/qse/lib/awk/run.h b/qse/lib/awk/run.h index 81042954..ca6337e1 100644 --- a/qse/lib/awk/run.h +++ b/qse/lib/awk/run.h @@ -95,7 +95,7 @@ enum qse_awk_incop_type_t extern "C" { #endif -qse_char_t* qse_awk_format ( +qse_char_t* qse_awk_rtx_format ( qse_awk_rtx_t* run, qse_str_t* out, qse_str_t* fbu, diff --git a/qse/lib/awk/std.c b/qse/lib/awk/std.c index 4a2619b4..c2482f16 100644 --- a/qse/lib/awk/std.c +++ b/qse/lib/awk/std.c @@ -469,7 +469,7 @@ static qse_ssize_t awk_eio_file ( errarg.ptr = epa->name; errarg.len = qse_strlen(epa->name); - qse_awk_rtx_seterror (epa->rtx, QSE_AWK_EOPEN, 0, &errarg, 1); + qse_awk_rtx_seterror (epa->rtx, QSE_AWK_EOPEN, 0, &errarg); return -1; } @@ -557,7 +557,7 @@ static int open_eio_console (qse_awk_eio_t* epa) errarg.ptr = rd->ic.files[rd->ic.index]; errarg.len = qse_strlen(rd->ic.files[rd->ic.index]); - qse_awk_rtx_seterror (epa->rtx, QSE_AWK_EOPEN, 0, &errarg, 1); + qse_awk_rtx_seterror (epa->rtx, QSE_AWK_EOPEN, 0, &errarg); return -1; } @@ -660,7 +660,7 @@ static qse_ssize_t awk_eio_console ( errarg.ptr = rd->ic.files[rd->ic.index]; errarg.len = qse_strlen(rd->ic.files[rd->ic.index]); - qse_awk_rtx_seterror (epa->rtx, QSE_AWK_EOPEN, 0, &errarg, 1); + qse_awk_rtx_seterror (epa->rtx, QSE_AWK_EOPEN, 0, &errarg); return -1; } diff --git a/qse/lib/awk/val.c b/qse/lib/awk/val.c index 84f39542..79e2782c 100644 --- a/qse/lib/awk/val.c +++ b/qse/lib/awk/val.c @@ -805,7 +805,7 @@ qse_char_t* qse_awk_rtx_valtostr ( v->type); #endif - qse_awk_rtx_seterror (run, QSE_AWK_EVALTYPE, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_EVALTYPE, 0, QSE_NULL); return QSE_NULL; } @@ -819,8 +819,7 @@ static qse_char_t* str_to_str ( tmp = QSE_AWK_STRXDUP (run->awk, str, str_len); if (tmp == QSE_NULL) { - qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_ENOMEM, 0, QSE_NULL); return QSE_NULL; } @@ -833,8 +832,7 @@ static qse_char_t* str_to_str ( if (str_len >= *len) { - qse_awk_rtx_seterror ( - run, QSE_AWK_EINVAL, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_EINVAL, 0, QSE_NULL); *len = str_len + 1; return QSE_NULL; } @@ -850,8 +848,7 @@ static qse_char_t* str_to_str ( n = qse_str_ncat (buf, str, str_len); if (n == (qse_size_t)-1) { - qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_ENOMEM, 0, QSE_NULL); return QSE_NULL; } @@ -879,7 +876,7 @@ static qse_char_t* val_int_to_str ( if (tmp == QSE_NULL) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return QSE_NULL; } @@ -895,7 +892,7 @@ static qse_char_t* val_int_to_str ( if (1 >= *len) { qse_awk_rtx_seterror ( - run, QSE_AWK_EINVAL, 0, QSE_NULL, 0); + run, QSE_AWK_EINVAL, 0, QSE_NULL); *len = 2; /* buffer size required */ return QSE_NULL; } @@ -912,7 +909,7 @@ static qse_char_t* val_int_to_str ( if (qse_str_cat (buf, QSE_T("0")) == (qse_size_t)-1) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return QSE_NULL; } @@ -931,8 +928,7 @@ static qse_char_t* val_int_to_str ( run->awk, (rlen + 1) * QSE_SIZEOF(qse_char_t)); if (tmp == QSE_NULL) { - qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_ENOMEM, 0, QSE_NULL); return QSE_NULL; } @@ -945,8 +941,7 @@ static qse_char_t* val_int_to_str ( if (rlen >= *len) { - qse_awk_rtx_seterror ( - run, QSE_AWK_EINVAL, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_EINVAL, 0, QSE_NULL); *len = rlen + 1; /* buffer size required */ return QSE_NULL; } @@ -967,7 +962,7 @@ static qse_char_t* val_int_to_str ( buf, QSE_T(' '), rlen) == (qse_size_t)-1) { qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return QSE_NULL; } } @@ -1013,18 +1008,18 @@ static qse_char_t* val_real_to_str ( if (qse_str_init (&out, run->awk->mmgr, 256) == QSE_NULL) { - qse_awk_rtx_seterror (run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_ENOMEM, 0, QSE_NULL); return QSE_NULL; } if (qse_str_init (&fbu, run->awk->mmgr, 256) == QSE_NULL) { qse_str_fini (&out); - qse_awk_rtx_seterror (run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_ENOMEM, 0, QSE_NULL); return QSE_NULL; } - tmp = qse_awk_format (run, &out, &fbu, tmp, tmp_len, + tmp = qse_awk_rtx_format (run, &out, &fbu, tmp, tmp_len, (qse_size_t)-1, (qse_awk_nde_t*)v, &tmp_len); if (tmp == QSE_NULL) { @@ -1049,7 +1044,7 @@ static qse_char_t* val_real_to_str ( if (tmp_len >= *len) { qse_awk_rtx_seterror ( - run, QSE_AWK_EINVAL, 0, QSE_NULL, 0); + run, QSE_AWK_EINVAL, 0, QSE_NULL); *len = tmp_len + 1; /* buffer size required */ qse_str_close (&fbu); qse_str_close (&out); @@ -1072,7 +1067,7 @@ static qse_char_t* val_real_to_str ( qse_str_fini (&fbu); qse_str_fini (&out); qse_awk_rtx_seterror ( - run, QSE_AWK_ENOMEM, 0, QSE_NULL, 0); + run, QSE_AWK_ENOMEM, 0, QSE_NULL); return QSE_NULL; } @@ -1120,7 +1115,7 @@ int qse_awk_rtx_valtonum ( v->type); #endif - qse_awk_rtx_seterror (run, QSE_AWK_EVALTYPE, 0, QSE_NULL, 0); + qse_awk_rtx_seterror (run, QSE_AWK_EVALTYPE, 0, QSE_NULL); return -1; /* error */ } diff --git a/qse/lib/cmn/str_bas.c b/qse/lib/cmn/str_bas.c index 8695a7f4..2d97717a 100644 --- a/qse/lib/cmn/str_bas.c +++ b/qse/lib/cmn/str_bas.c @@ -159,6 +159,52 @@ qse_size_t qse_strfcpy (qse_char_t* buf, const qse_char_t* fmt, ...) return b - buf; } +qse_size_t qse_strfncpy (qse_char_t* buf, const qse_char_t* fmt, const qse_cstr_t* str) +{ + qse_char_t* b = buf; + const qse_char_t* f = fmt; + + while (*f != QSE_T('\0')) + { + if (*f == QSE_T('$')) + { + if (f[1] == QSE_T('{') && + (f[2] >= QSE_T('0') && f[2] <= QSE_T('9'))) + { + const qse_char_t* tmp, * tmpend; + qse_size_t idx = 0; + + tmp = f; + f += 2; + + do idx = idx * 10 + (*f++ - QSE_T('0')); + while (*f >= QSE_T('0') && *f <= QSE_T('9')); + + if (*f != QSE_T('}')) + { + f = tmp; + goto normal; + } + + f++; + + tmp = str[idx].ptr; + tmpend = tmp + str[idx].len; + + while (tmp < tmpend) *b++ = *tmp++; + continue; + } + else if (f[1] == QSE_T('$')) f++; + } + + normal: + *b++ = *f++; + } + + *b = QSE_T('\0'); + return b - buf; +} + qse_size_t qse_strxfcpy ( qse_char_t* buf, qse_size_t bsz, const qse_char_t* fmt, ...) { @@ -221,6 +267,63 @@ fini: return b - buf; } +qse_size_t qse_strxfncpy ( + qse_char_t* buf, qse_size_t bsz, + const qse_char_t* fmt, const qse_cstr_t* str) +{ + qse_char_t* b = buf; + qse_char_t* end = buf + bsz - 1; + const qse_char_t* f = fmt; + + if (bsz <= 0) return 0; + + while (*f != QSE_T('\0')) + { + if (*f == QSE_T('$')) + { + if (f[1] == QSE_T('{') && + (f[2] >= QSE_T('0') && f[2] <= QSE_T('9'))) + { + const qse_char_t* tmp, * tmpend; + qse_size_t idx = 0; + + tmp = f; + f += 2; + + do idx = idx * 10 + (*f++ - QSE_T('0')); + while (*f >= QSE_T('0') && *f <= QSE_T('9')); + + if (*f != QSE_T('}')) + { + f = tmp; + goto normal; + } + + f++; + + tmp = str[idx].ptr; + tmpend = tmp + str[idx].len; + + while (tmp < tmpend) + { + if (b >= end) goto fini; + *b++ = *tmp++; + } + continue; + } + else if (f[1] == QSE_T('$')) f++; + } + + normal: + if (b >= end) break; + *b++ = *f++; + } + +fini: + *b = QSE_T('\0'); + return b - buf; +} + qse_size_t qse_strxcat (qse_char_t* buf, qse_size_t bsz, const qse_char_t* str) { qse_char_t* p, * p2;