From f9bf64992472da096a9c4dad9d589e09b5fbce26 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 15 Jun 2009 02:40:52 +0000 Subject: [PATCH] fixed bugs in awk - added qse_awk_seterrinf() and qse_awk_geterrinf(). - deleted qse_awk_seterrmsg() - fixed a bug in qse_awk_geterrmsg() - fixed wrong handling of 'length' - changed run_printf() to flush before returning --- qse/cmd/awk/awk.c | 23 ++++- qse/include/qse/awk/awk.h | 71 +++++++------ qse/lib/awk/Awk.cpp | 19 +++- qse/lib/awk/awk.c | 6 +- qse/lib/awk/awk.h | 11 +- qse/lib/awk/err.c | 108 ++++++++++++-------- qse/lib/awk/fnc.c | 76 +++++++------- qse/lib/awk/fnc.h | 4 +- qse/lib/awk/parse.c | 29 ++++-- qse/lib/awk/rio.c | 26 ++--- qse/lib/awk/run.c | 204 +++++++++++++++++++------------------- 11 files changed, 324 insertions(+), 253 deletions(-) diff --git a/qse/cmd/awk/awk.c b/qse/cmd/awk/awk.c index b5cf9fb8..7e01f664 100644 --- a/qse/cmd/awk/awk.c +++ b/qse/cmd/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c 195 2009-06-10 13:18:25Z hyunghwan.chung $ + * $Id: awk.c 199 2009-06-14 08:40:52Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -146,21 +146,34 @@ static void unset_intr_run (void) static qse_map_walk_t print_awk_value ( qse_map_t* map, qse_map_pair_t* pair, void* arg) { - qse_awk_rtx_t* run = (qse_awk_rtx_t*)arg; + qse_awk_rtx_t* rtx = (qse_awk_rtx_t*)arg; qse_char_t* str; qse_size_t len; + qse_awk_errinf_t oerrinf; - str = qse_awk_rtx_valtocpldup (run, QSE_MAP_VPTR(pair), &len); + qse_awk_rtx_geterrinf (rtx, &oerrinf); + + str = qse_awk_rtx_valtocpldup (rtx, QSE_MAP_VPTR(pair), &len); if (str == QSE_NULL) { - dprint (QSE_T("***OUT OF MEMORY***\n")); + if (qse_awk_rtx_geterrnum(rtx) == QSE_AWK_EVALTYPE) + { + dprint (QSE_T("%.*s = [not printable]\n"), + (int)QSE_MAP_KLEN(pair), QSE_MAP_KPTR(pair)); + + qse_awk_rtx_seterrinf (rtx, &oerrinf); + } + else + { + dprint (QSE_T("***OUT OF MEMORY***\n")); + } } else { dprint (QSE_T("%.*s = %.*s\n"), (int)QSE_MAP_KLEN(pair), QSE_MAP_KPTR(pair), (int)len, str); - qse_awk_free (qse_awk_rtx_getawk(run), str); + qse_awk_free (qse_awk_rtx_getawk(rtx), str); } return QSE_MAP_WALK_FORWARD; diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index 07981140..9bd66f28 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h 197 2009-06-12 02:59:59Z hyunghwan.chung $ + * $Id: awk.h 199 2009-06-14 08:40:52Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -173,10 +173,8 @@ typedef int (*qse_awk_sprintf_t) ( ... ); -/****e* AWK/qse_awk_sio_cmd_t - * NAME - * qse_awk_sio_cmd_t - define source IO commands - * SYNOPSIS +/** + * The qse_awk_sio_cmd_t type defines source IO commands */ enum qse_awk_sio_cmd_t { @@ -186,7 +184,6 @@ enum qse_awk_sio_cmd_t QSE_AWK_SIO_WRITE = 3 }; typedef enum qse_awk_sio_cmd_t qse_awk_sio_cmd_t; -/******/ /****t* AWK/qse_awk_siof_t * NAME @@ -539,7 +536,7 @@ enum qse_awk_errnum_t QSE_AWK_EMAPTOSCALAR, /* cannot change a map to a scalar value */ QSE_AWK_ESCALARTOMAP, /* cannot change a scalar value to a map */ QSE_AWK_EMAPNOTALLOWED, /* a map is not allowed */ - QSE_AWK_EVALTYPE, /* wrong value type */ + QSE_AWK_EVALTYPE, /* invalid value type */ QSE_AWK_ERDELETE, /* delete called with a wrong target */ QSE_AWK_ERRESET, /* reset called with a wrong target */ QSE_AWK_ERNEXTBEG, /* next called from BEGIN */ @@ -578,6 +575,16 @@ enum qse_awk_errnum_t typedef enum qse_awk_errnum_t qse_awk_errnum_t; + +struct qse_awk_errinf_t +{ + qse_awk_errnum_t num; + qse_size_t lin; + qse_char_t msg[256]; +}; + +typedef struct qse_awk_errinf_t qse_awk_errinf_t; + /** * The qse_awk_errstr_t type defines a error string getter. It should return * an error formatting string for an error number requested. A new string @@ -904,16 +911,19 @@ const qse_char_t* qse_awk_geterrmsg ( qse_awk_t* awk ); +void qse_awk_geterrinf ( + qse_awk_t* awk, + qse_awk_errinf_t* errinf +); + void qse_awk_seterrnum ( qse_awk_t* awk, qse_awk_errnum_t errnum ); -void qse_awk_seterrmsg ( - qse_awk_t* awk, - qse_awk_errnum_t errnum, - qse_size_t errlin, - const qse_char_t* errmsg +void qse_awk_seterrinf ( + qse_awk_t* awk, + const qse_awk_errinf_t* errinf ); void qse_awk_geterror ( @@ -1415,25 +1425,19 @@ void* qse_awk_rtx_getxtn ( ); /******/ -/****f* AWK/qse_awk_rtx_getnvmap - * NAME - * qse_awk_rtx_getnvmap - get the map of named variables - * SYNOPSIS +/** + * The qse_awk_rtx_getnvmap() gets the map of named variables */ qse_map_t* qse_awk_rtx_getnvmap ( qse_awk_rtx_t* rtx ); -/******/ -/****f* AWK/qse_awk_rtx_geterrnum - * NAME - * qse_awk_rtx_geterrnum - get an error code of a runtime context - * SYNOPSIS +/** + * The qse_awk_rtx_geterrnum() function gets an error code of a runtime context */ int qse_awk_rtx_geterrnum ( qse_awk_rtx_t* rtx ); -/******/ qse_size_t qse_awk_rtx_geterrlin ( qse_awk_rtx_t* rtx @@ -1443,16 +1447,9 @@ const qse_char_t* qse_awk_rtx_geterrmsg ( qse_awk_rtx_t* rtx ); -void qse_awk_rtx_seterrnum ( - qse_awk_rtx_t* rtx, - qse_awk_errnum_t errnum -); - -void qse_awk_rtx_seterrmsg ( - qse_awk_rtx_t* rtx, - qse_awk_errnum_t errnum, - qse_size_t errlin, - const qse_char_t* errmsg +void qse_awk_rtx_geterrinf ( + qse_awk_rtx_t* rtx, + qse_awk_errinf_t* errinf ); void qse_awk_rtx_geterror ( @@ -1462,6 +1459,16 @@ void qse_awk_rtx_geterror ( const qse_char_t** errmsg ); +void qse_awk_rtx_seterrnum ( + qse_awk_rtx_t* rtx, + qse_awk_errnum_t errnum +); + +void qse_awk_rtx_seterrinf ( + qse_awk_rtx_t* rtx, + const qse_awk_errinf_t* errinf +); + void qse_awk_rtx_seterror ( qse_awk_rtx_t* rtx, qse_awk_errnum_t errnum, diff --git a/qse/lib/awk/Awk.cpp b/qse/lib/awk/Awk.cpp index 5d66722e..65b1a8c1 100644 --- a/qse/lib/awk/Awk.cpp +++ b/qse/lib/awk/Awk.cpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.cpp 197 2009-06-12 02:59:59Z hyunghwan.chung $ + * $Id: Awk.cpp 199 2009-06-14 08:40:52Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -994,7 +994,14 @@ void Awk::Run::setErrorWithMessage ( ErrorNumber code, size_t line, const char_t* msg) { QSE_ASSERT (this->run != QSE_NULL); - qse_awk_rtx_seterrmsg (this->run, (errnum_t)code, line, msg); + + qse_awk_errinf_t errinf; + + errinf.num = (errnum_t)code; + errinf.lin = line; + qse_strxcpy (errinf.msg, QSE_COUNTOF(errinf.msg), msg); + + qse_awk_rtx_seterrinf (this->run, &errinf); } int Awk::Run::setGlobal (int id, long_t v) @@ -1129,7 +1136,13 @@ void Awk::setErrorWithMessage (ErrorNumber code, size_t line, const char_t* msg) { if (awk != QSE_NULL) { - qse_awk_seterrmsg (awk, (errnum_t)code, line, msg); + qse_awk_errinf_t errinf; + + errinf.num = (errnum_t)code; + errinf.lin = line; + qse_strxcpy (errinf.msg, QSE_COUNTOF(errinf.msg), msg); + + qse_awk_seterrinf (awk, &errinf); retrieveError (); } else diff --git a/qse/lib/awk/awk.c b/qse/lib/awk/awk.c index 02e0faa2..c3147af4 100644 --- a/qse/lib/awk/awk.c +++ b/qse/lib/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c 171 2009-06-01 09:34:34Z hyunghwan.chung $ + * $Id: awk.c 199 2009-06-14 08:40:52Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -153,8 +153,8 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_awk_prm_t* prm) qse_lda_setscale (awk->parse.params, QSE_SIZEOF(qse_char_t)); awk->option = QSE_AWK_CLASSIC; - awk->errnum = QSE_AWK_ENOERR; - awk->errlin = 0; + awk->errinf.num = QSE_AWK_ENOERR; + awk->errinf.lin = 0; awk->errstr = qse_awk_dflerrstr; awk->stopall = QSE_FALSE; diff --git a/qse/lib/awk/awk.h b/qse/lib/awk/awk.h index e136691b..6ffbc54b 100644 --- a/qse/lib/awk/awk.h +++ b/qse/lib/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h 171 2009-06-01 09:34:34Z hyunghwan.chung $ + * $Id: awk.h 199 2009-06-14 08:40:52Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -231,10 +231,7 @@ struct qse_awk_t /* housekeeping */ qse_awk_errstr_t errstr; - - qse_awk_errnum_t errnum; - qse_size_t errlin; - qse_char_t errmsg[256]; + qse_awk_errinf_t errinf; qse_bool_t stopall; }; @@ -367,9 +364,7 @@ struct qse_awk_rtx_t } max; } depth; - qse_awk_errnum_t errnum; - qse_size_t errlin; - qse_char_t errmsg[256]; + qse_awk_errinf_t errinf; qse_awk_t* awk; qse_awk_rcb_t rcb; diff --git a/qse/lib/awk/err.c b/qse/lib/awk/err.c index 9f03247b..99c489d7 100644 --- a/qse/lib/awk/err.c +++ b/qse/lib/awk/err.c @@ -1,5 +1,5 @@ /* - * $Id: err.c 195 2009-06-10 13:18:25Z hyunghwan.chung $ + * $Id: err.c 199 2009-06-14 08:40:52Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -181,47 +181,54 @@ void qse_awk_seterrstr (qse_awk_t* awk, qse_awk_errstr_t errstr) int qse_awk_geterrnum (qse_awk_t* awk) { - return awk->errnum; + return awk->errinf.num; } qse_size_t qse_awk_geterrlin (qse_awk_t* awk) { - return awk->errlin; + return awk->errinf.lin; } const qse_char_t* qse_awk_geterrmsg (qse_awk_t* awk) { - return (awk->errmsg[0] == QSE_T('\0'))? - qse_awk_geterrstr(awk)(awk,awk->errnum): awk->errmsg; + return (awk->errinf.msg[0] == QSE_T('\0'))? + qse_awk_geterrstr(awk)(awk,awk->errinf.num): awk->errinf.msg; +} + +void qse_awk_geterrinf (qse_awk_t* awk, qse_awk_errinf_t* errinf) +{ + QSE_MEMCPY (errinf, &awk->errinf, QSE_SIZEOF(*errinf)); + if (errinf->msg[0] == QSE_T('\0')) + { + qse_strxcpy (errinf->msg, QSE_COUNTOF(errinf->msg), + qse_awk_geterrstr(awk)(awk,awk->errinf.num)); + } } void qse_awk_geterror ( qse_awk_t* awk, qse_awk_errnum_t* errnum, qse_size_t* errlin, const qse_char_t** errmsg) { - if (errnum != QSE_NULL) *errnum = awk->errnum; - if (errlin != QSE_NULL) *errlin = awk->errlin; + if (errnum != QSE_NULL) *errnum = awk->errinf.num; + if (errlin != QSE_NULL) *errlin = awk->errinf.lin; if (errmsg != QSE_NULL) { - *errmsg = (awk->errmsg[0] == QSE_T('\0'))? - qse_awk_geterrstr(awk)(awk,awk->errnum): - awk->errmsg; + *errmsg = (awk->errinf.msg[0] == QSE_T('\0'))? + qse_awk_geterrstr(awk)(awk,awk->errinf.num): + awk->errinf.msg; } } void qse_awk_seterrnum (qse_awk_t* awk, qse_awk_errnum_t errnum) { - awk->errnum = errnum; - awk->errlin = 0; - awk->errmsg[0] = QSE_T('\0'); + awk->errinf.num = errnum; + awk->errinf.lin = 0; + awk->errinf.msg[0] = QSE_T('\0'); } -void qse_awk_seterrmsg (qse_awk_t* awk, - qse_awk_errnum_t errnum, qse_size_t errlin, const qse_char_t* errmsg) +void qse_awk_seterrinf (qse_awk_t* awk, const qse_awk_errinf_t* errinf) { - awk->errnum = errnum; - awk->errlin = errlin; - qse_strxcpy (awk->errmsg, QSE_COUNTOF(awk->errmsg), errmsg); + QSE_MEMCPY (&awk->errinf, errinf, QSE_SIZEOF(*errinf)); } void qse_awk_seterror ( @@ -230,68 +237,81 @@ void qse_awk_seterror ( { const qse_char_t* errfmt; - awk->errnum = errnum; - awk->errlin = errlin; + awk->errinf.num = errnum; + awk->errinf.lin = errlin; errfmt = qse_awk_geterrstr(awk)(awk,errnum); QSE_ASSERT (errfmt != QSE_NULL); - qse_strxfncpy (awk->errmsg, QSE_COUNTOF(awk->errmsg), errfmt, errarg); + qse_strxfncpy ( + awk->errinf.msg, QSE_COUNTOF(awk->errinf.msg), + errfmt, errarg + ); } int qse_awk_rtx_geterrnum (qse_awk_rtx_t* rtx) { - return rtx->errnum; + return rtx->errinf.num; } qse_size_t qse_awk_rtx_geterrlin (qse_awk_rtx_t* rtx) { - return rtx->errlin; + return rtx->errinf.lin; } const qse_char_t* qse_awk_rtx_geterrmsg (qse_awk_rtx_t* rtx) { - return (rtx->errmsg[0] == QSE_T('\0')) ? - qse_awk_geterrstr(rtx->awk)(rtx->awk,rtx->errnum): rtx->errmsg; + return (rtx->errinf.msg[0] == QSE_T('\0')) ? + qse_awk_geterrstr(rtx->awk)(rtx->awk,rtx->errinf.num): rtx->errinf.msg; } -void qse_awk_rtx_seterrnum (qse_awk_rtx_t* rtx, qse_awk_errnum_t errnum) +void qse_awk_rtx_geterrinf (qse_awk_rtx_t* rtx, qse_awk_errinf_t* errinf) { - rtx->errnum = errnum; - rtx->errlin = 0; - rtx->errmsg[0] = QSE_T('\0'); -} - -void qse_awk_rtx_seterrmsg (qse_awk_rtx_t* rtx, - qse_awk_errnum_t errnum, qse_size_t errlin, const qse_char_t* errmsg) -{ - rtx->errnum = errnum; - rtx->errlin = errlin; - qse_strxcpy (rtx->errmsg, QSE_COUNTOF(rtx->errmsg), errmsg); + QSE_MEMCPY (errinf, &rtx->errinf, QSE_SIZEOF(*errinf)); + if (errinf->msg[0] == QSE_T('\0')) + { + qse_strxcpy (errinf->msg, QSE_COUNTOF(errinf->msg), + qse_awk_geterrstr(rtx->awk)(rtx->awk,rtx->errinf.num)); + } } void qse_awk_rtx_geterror ( qse_awk_rtx_t* rtx, qse_awk_errnum_t* errnum, qse_size_t* errlin, const qse_char_t** errmsg) { - if (errnum != QSE_NULL) *errnum = rtx->errnum; - if (errlin != QSE_NULL) *errlin = rtx->errlin; + if (errnum != QSE_NULL) *errnum = rtx->errinf.num; + if (errlin != QSE_NULL) *errlin = rtx->errinf.lin; if (errmsg != QSE_NULL) { - *errmsg = (rtx->errmsg[0] == QSE_T('\0'))? - qse_awk_geterrstr(rtx->awk)(rtx->awk,rtx->errnum): rtx->errmsg; + *errmsg = (rtx->errinf.msg[0] == QSE_T('\0'))? + qse_awk_geterrstr(rtx->awk)(rtx->awk,rtx->errinf.num): rtx->errinf.msg; } } +void qse_awk_rtx_seterrnum (qse_awk_rtx_t* rtx, qse_awk_errnum_t errnum) +{ + rtx->errinf.num = errnum; + rtx->errinf.lin = 0; + rtx->errinf.msg[0] = QSE_T('\0'); +} + +void qse_awk_rtx_seterrinf (qse_awk_rtx_t* rtx, const qse_awk_errinf_t* errinf) +{ + QSE_MEMCPY (&rtx->errinf, errinf, QSE_SIZEOF(*errinf)); +} + void qse_awk_rtx_seterror ( qse_awk_rtx_t* rtx, qse_awk_errnum_t errnum, qse_size_t errlin, const qse_cstr_t* errarg) { const qse_char_t* errfmt; - rtx->errnum = errnum; - rtx->errlin = errlin; + rtx->errinf.num = errnum; + rtx->errinf.lin = errlin; errfmt = qse_awk_geterrstr(rtx->awk)(rtx->awk,errnum); QSE_ASSERT (errfmt != QSE_NULL); - qse_strxfncpy (rtx->errmsg, QSE_COUNTOF(rtx->errmsg), errfmt, errarg); + qse_strxfncpy ( + rtx->errinf.msg, QSE_COUNTOF(rtx->errinf.msg), + errfmt, errarg + ); } diff --git a/qse/lib/awk/fnc.c b/qse/lib/awk/fnc.c index 1247c46d..f9c65ccf 100644 --- a/qse/lib/awk/fnc.c +++ b/qse/lib/awk/fnc.c @@ -1,5 +1,5 @@ /* - * $Id: fnc.c 195 2009-06-10 13:18:25Z hyunghwan.chung $ + * $Id: fnc.c 199 2009-06-14 08:40:52Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -37,22 +37,22 @@ static int fnc_sprintf (qse_awk_rtx_t*, const qse_char_t*, qse_size_t); static qse_awk_fnc_t sys_fnc[] = { /* io functions */ - { {QSE_T("close"), 5}, QSE_AWK_RIO, {1, 1, QSE_NULL}, fnc_close}, - { {QSE_T("fflush"), 6}, QSE_AWK_RIO, {0, 1, QSE_NULL}, fnc_fflush}, + { {QSE_T("close"), 5}, 0, QSE_AWK_RIO, {1, 1, QSE_NULL}, fnc_close}, + { {QSE_T("fflush"), 6}, 0, QSE_AWK_RIO, {0, 1, QSE_NULL}, fnc_fflush}, /* string functions */ - { {QSE_T("index"), 5}, 0, {2, 2, QSE_NULL}, fnc_index}, - { {QSE_T("substr"), 6}, 0, {2, 3, QSE_NULL}, fnc_substr}, - { {QSE_T("length"), 6}, 0, {1, 1, QSE_NULL}, fnc_length}, - { {QSE_T("split"), 5}, 0, {2, 3, QSE_T("vrv")}, fnc_split}, - { {QSE_T("tolower"), 7}, 0, {1, 1, QSE_NULL}, fnc_tolower}, - { {QSE_T("toupper"), 7}, 0, {1, 1, QSE_NULL}, fnc_toupper}, - { {QSE_T("gsub"), 4}, 0, {2, 3, QSE_T("xvr")}, fnc_gsub}, - { {QSE_T("sub"), 3}, 0, {2, 3, QSE_T("xvr")}, fnc_sub}, - { {QSE_T("match"), 5}, 0, {2, 2, QSE_T("vx")}, fnc_match}, - { {QSE_T("sprintf"), 7}, 0, {1, MAX, QSE_NULL}, fnc_sprintf}, + { {QSE_T("index"), 5}, 0, 0, {2, 2, QSE_NULL}, fnc_index}, + { {QSE_T("substr"), 6}, 0, 0, {2, 3, QSE_NULL}, fnc_substr}, + { {QSE_T("length"), 6}, 1, 0, {0, 1, QSE_NULL}, fnc_length}, + { {QSE_T("split"), 5}, 0, 0, {2, 3, QSE_T("vrv")}, fnc_split}, + { {QSE_T("tolower"), 7}, 0, 0, {1, 1, QSE_NULL}, fnc_tolower}, + { {QSE_T("toupper"), 7}, 0, 0, {1, 1, QSE_NULL}, fnc_toupper}, + { {QSE_T("gsub"), 4}, 0, 0, {2, 3, QSE_T("xvr")}, fnc_gsub}, + { {QSE_T("sub"), 3}, 0, 0, {2, 3, QSE_T("xvr")}, fnc_sub}, + { {QSE_T("match"), 5}, 0, 0, {2, 2, QSE_T("vx")}, fnc_match}, + { {QSE_T("sprintf"), 7}, 0, 0, {1, MAX, QSE_NULL}, fnc_sprintf}, - { {QSE_NULL, 0}, 0, {0, 0, QSE_NULL}, QSE_NULL} + { {QSE_NULL, 0}, 0, 0, {0, 0, QSE_NULL}, QSE_NULL} }; void* qse_awk_addfnc ( @@ -280,7 +280,7 @@ static int fnc_close ( n = qse_awk_rtx_closeio (run, name); /* - if (n == -1 && run->errnum != QSE_AWK_EIONONE) + if (n == -1 && run->errinf.num != QSE_AWK_EIONONE) { if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, name); @@ -313,14 +313,14 @@ static int flush_io ( if (n2 == -1) { /* - if (run->errnum == QSE_AWK_EIOIMPL) n = -1; - else if (run->errnum == QSE_AWK_EIONONE) + if (run->errinf.num == QSE_AWK_EIOIMPL) n = -1; + else if (run->errinf.num == QSE_AWK_EIONONE) { if (n != 0) n = -2; } else n = -99; */ - if (run->errnum == QSE_AWK_EIONONE) + if (run->errinf.num == QSE_AWK_EIONONE) { if (n != 0) n = -2; } @@ -471,36 +471,44 @@ static int fnc_index ( } static int fnc_length ( - qse_awk_rtx_t* run, const qse_char_t* fnm, qse_size_t fnl) + qse_awk_rtx_t* rtx, const qse_char_t* fnm, qse_size_t fnl) { qse_size_t nargs; qse_awk_val_t* v; qse_char_t* str; qse_size_t len; - nargs = qse_awk_rtx_getnargs (run); - QSE_ASSERT (nargs == 1); + nargs = qse_awk_rtx_getnargs (rtx); + QSE_ASSERT (nargs >= 0 && nargs <= 1); - v = qse_awk_rtx_getarg (run, 0); - if (v->type == QSE_AWK_VAL_STR) + if (nargs == 0) { - len = ((qse_awk_val_str_t*)v)->len; + /* get the length of $0 */ + len = QSE_STR_LEN(&rtx->inrec.line); } else { - str = qse_awk_rtx_valtocpldup (run, v, &len); - if (str == QSE_NULL) return -1; - QSE_AWK_FREE (run->awk, str); + v = qse_awk_rtx_getarg (rtx, 0); + if (v->type == QSE_AWK_VAL_STR) + { + len = ((qse_awk_val_str_t*)v)->len; + } + else + { + str = qse_awk_rtx_valtocpldup (rtx, v, &len); + if (str == QSE_NULL) return -1; + QSE_AWK_FREE (rtx->awk, str); + } } - v = qse_awk_rtx_makeintval (run, len); + v = qse_awk_rtx_makeintval (rtx, len); if (v == QSE_NULL) { - /*qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM);*/ + /*qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM);*/ return -1; } - qse_awk_rtx_setretval (run, v); + qse_awk_rtx_setretval (rtx, v); return 0; } @@ -1045,7 +1053,7 @@ static int __substitute (qse_awk_rtx_t* run, qse_long_t max_count) if (a0->type != QSE_AWK_VAL_REX) { - rex = QSE_AWK_BUILDREX (run->awk, a0_ptr, a0_len, &run->errnum); + rex = QSE_AWK_BUILDREX (run->awk, a0_ptr, a0_len, &run->errinf.num); if (rex == QSE_NULL) { qse_str_fini (&new); @@ -1067,7 +1075,7 @@ static int __substitute (qse_awk_rtx_t* run, qse_long_t max_count) run->awk, rex, opt, a2_ptr, a2_len, cur_ptr, cur_len, - &mat, &run->errnum); + &mat, &run->errinf.num); } else n = 0; @@ -1261,7 +1269,7 @@ static int fnc_match ( } } - rex = QSE_AWK_BUILDREX (run->awk, str1, len1, &run->errnum); + rex = QSE_AWK_BUILDREX (run->awk, str1, len1, &run->errinf.num); if (rex == QSE_NULL) { if (a0->type != QSE_AWK_VAL_STR) @@ -1276,7 +1284,7 @@ static int fnc_match ( n = QSE_AWK_MATCHREX ( run->awk, rex, opt, str0, len0, str0, len0, - &mat, &run->errnum + &mat, &run->errinf.num ); if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str0); diff --git a/qse/lib/awk/fnc.h b/qse/lib/awk/fnc.h index 73f29a28..aabcfda3 100644 --- a/qse/lib/awk/fnc.h +++ b/qse/lib/awk/fnc.h @@ -1,5 +1,5 @@ /* - * $Id: fnc.h 75 2009-02-22 14:10:34Z hyunghwan.chung $ + * $Id: fnc.h 199 2009-06-14 08:40:52Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -29,6 +29,8 @@ struct qse_awk_fnc_t qse_size_t len; } name; + int dfl0; /* if set, ($0) is assumed if () is missing. + * this ia mainly for the weird length() function */ int valid; /* the entry is valid when this option is set */ struct diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index ced91a16..267309ec 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c 194 2009-06-09 13:07:42Z hyunghwan.chung $ + * $Id: parse.c 199 2009-06-14 08:40:52Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -199,7 +199,7 @@ static qse_awk_nde_t* parse_hashidx ( qse_size_t line); static qse_awk_nde_t* parse_fncall ( qse_awk_t* awk, qse_char_t* name, qse_size_t name_len, - qse_awk_fnc_t* fnc, qse_size_t line); + qse_awk_fnc_t* fnc, qse_size_t line, int noarg); static qse_awk_nde_t* parse_if (qse_awk_t* awk, qse_size_t line); static qse_awk_nde_t* parse_while (qse_awk_t* awk, qse_size_t line); static qse_awk_nde_t* parse_for (qse_awk_t* awk, qse_size_t line); @@ -365,7 +365,7 @@ static global_t gtab[] = #define MATCH(awk,token_type) ((awk)->token.type == (token_type)) #define CLRERR(awk) qse_awk_seterrnum(awk,QSE_AWK_ENOERR) -#define ISNOERR(awk) ((awk)->errnum == QSE_AWK_ENOERR) +#define ISNOERR(awk) ((awk)->errinf.num == 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); #define SETERRTOK(awk,code) \ @@ -3200,6 +3200,17 @@ static qse_awk_nde_t* parse_primary_ident (qse_awk_t* awk, qse_size_t line) if (!MATCH(awk,TOKEN_LPAREN)) { + if (fnc->dfl0) + { + /* handles a function that assumes () + * when () is missing */ + nde = parse_fncall ( + awk, name_dup, name_len, fnc, line, 1); + if (nde == QSE_NULL) + QSE_AWK_FREE (awk, name_dup); + return (qse_awk_nde_t*)nde; + } + /* an intrinsic function should be in the form * of the function call */ QSE_AWK_FREE (awk, name_dup); @@ -3207,7 +3218,7 @@ static qse_awk_nde_t* parse_primary_ident (qse_awk_t* awk, qse_size_t line) return QSE_NULL; } - nde = parse_fncall (awk, name_dup, name_len, fnc, line); + nde = parse_fncall (awk, name_dup, name_len, fnc, line, 0); if (nde == QSE_NULL) QSE_AWK_FREE (awk, name_dup); return (qse_awk_nde_t*)nde; } @@ -3339,7 +3350,7 @@ static qse_awk_nde_t* parse_primary_ident (qse_awk_t* awk, qse_size_t line) } } - nde = parse_fncall (awk, name_dup, name_len, QSE_NULL, line); + nde = parse_fncall (awk, name_dup, name_len, QSE_NULL, line, 0); if (nde == QSE_NULL) QSE_AWK_FREE (awk, name_dup); return (qse_awk_nde_t*)nde; } @@ -3597,17 +3608,18 @@ exit_func: static qse_awk_nde_t* parse_fncall ( qse_awk_t* awk, qse_char_t* name, qse_size_t name_len, - qse_awk_fnc_t* fnc, qse_size_t line) + qse_awk_fnc_t* fnc, qse_size_t line, int noarg) { qse_awk_nde_t* head, * curr, * nde; qse_awk_nde_call_t* call; qse_size_t nargs; - if (get_token(awk) == -1) return QSE_NULL; - head = curr = QSE_NULL; nargs = 0; + if (noarg) goto make_node; + if (get_token(awk) == -1) return QSE_NULL; + if (MATCH(awk,TOKEN_RPAREN)) { /* no parameters to the function call */ @@ -3660,6 +3672,7 @@ static qse_awk_nde_t* parse_fncall ( } +make_node: call = (qse_awk_nde_call_t*) QSE_AWK_ALLOC (awk, QSE_SIZEOF(qse_awk_nde_call_t)); if (call == QSE_NULL) diff --git a/qse/lib/awk/rio.c b/qse/lib/awk/rio.c index 1644bf7a..6456f018 100644 --- a/qse/lib/awk/rio.c +++ b/qse/lib/awk/rio.c @@ -1,5 +1,5 @@ /* - * $Id: rio.c 195 2009-06-10 13:18:25Z hyunghwan.chung $ + * $Id: rio.c 199 2009-06-14 08:40:52Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -166,7 +166,7 @@ int qse_awk_rtx_readio ( QSE_AWK_FREE (run->awk, p->name); QSE_AWK_FREE (run->awk, p); - if (run->errnum == QSE_AWK_ENOERR) + if (run->errinf.num == QSE_AWK_ENOERR) { /* if the error number has not been * set by the user handler */ @@ -246,7 +246,7 @@ int qse_awk_rtx_readio ( p, p->in.buf, QSE_COUNTOF(p->in.buf)); if (n <= -1) { - if (run->errnum == QSE_AWK_ENOERR) + if (run->errinf.num == QSE_AWK_ENOERR) { /* if the error number has not been * set by the user handler */ @@ -278,7 +278,7 @@ int qse_awk_rtx_readio ( ((run->gbl.ignorecase)? QSE_REX_MATCH_IGNORECASE: 0), QSE_STR_PTR(buf), QSE_STR_LEN(buf), QSE_STR_PTR(buf), QSE_STR_LEN(buf), - &match, &run->errnum); + &match, &run->errinf.num); if (n == -1) { ret = -1; @@ -366,7 +366,7 @@ int qse_awk_rtx_readio ( ((run->gbl.ignorecase)? QSE_REX_MATCH_IGNORECASE: 0), QSE_STR_PTR(buf), QSE_STR_LEN(buf), QSE_STR_PTR(buf), QSE_STR_LEN(buf), - &match, &run->errnum); + &match, &run->errinf.num); if (n == -1) { ret = -1; @@ -519,7 +519,7 @@ int qse_awk_rtx_writeio_str ( QSE_AWK_FREE (run->awk, p->name); QSE_AWK_FREE (run->awk, p); - if (run->errnum == QSE_AWK_ENOERR) + if (run->errinf.num == QSE_AWK_ENOERR) qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL); return -1; @@ -560,7 +560,7 @@ int qse_awk_rtx_writeio_str ( n = handler (run, QSE_AWK_RIO_WRITE, p, str, len); if (n <= -1) { - if (run->errnum == QSE_AWK_ENOERR) + if (run->errinf.num == QSE_AWK_ENOERR) qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL); return -1; @@ -616,7 +616,7 @@ int qse_awk_rtx_flushio ( if (n <= -1) { - if (run->errnum == QSE_AWK_ENOERR) + if (run->errinf.num == QSE_AWK_ENOERR) qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL); return -1; } @@ -685,7 +685,7 @@ int qse_awk_rtx_nextio_read ( n = handler (run, QSE_AWK_RIO_NEXT, p, QSE_NULL, 0); if (n <= -1) { - if (run->errnum == QSE_AWK_ENOERR) + if (run->errinf.num == QSE_AWK_ENOERR) qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL); return -1; } @@ -763,7 +763,7 @@ int qse_awk_rtx_nextio_write ( n = handler (run, QSE_AWK_RIO_NEXT, p, QSE_NULL, 0); if (n <= -1) { - if (run->errnum == QSE_AWK_ENOERR) + if (run->errinf.num == QSE_AWK_ENOERR) qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL); return -1; } @@ -881,7 +881,7 @@ int qse_awk_rtx_closio_write ( qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR); if (handler (run, QSE_AWK_RIO_CLOSE, p, QSE_NULL, 0) <= -1) { - if (run->errnum == QSE_AWK_ENOERR) + if (run->errinf.num == QSE_AWK_ENOERR) qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL); return -1; } @@ -922,7 +922,7 @@ int qse_awk_rtx_closeio (qse_awk_rtx_t* run, const qse_char_t* name) if (handler (run, QSE_AWK_RIO_CLOSE, p, QSE_NULL, 0) <= -1) { /* this is not a run-time error.*/ - if (run->errnum == QSE_AWK_ENOERR) + if (run->errinf.num == QSE_AWK_ENOERR) qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL); return -1; } @@ -963,7 +963,7 @@ void qse_awk_rtx_cleario (qse_awk_rtx_t* run) n = handler (run, QSE_AWK_RIO_CLOSE, run->rio.chain, QSE_NULL, 0); if (n <= -1) { - if (run->errnum == QSE_AWK_ENOERR) + if (run->errinf.num == QSE_AWK_ENOERR) qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL); /* TODO: some warnings need to be shown??? */ } diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index 0839fd3b..4bef0151 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c 195 2009-06-10 13:18:25Z hyunghwan.chung $ + * $Id: run.c 199 2009-06-14 08:40:52Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -375,7 +375,7 @@ static int set_global ( /* TODO: use safebuild */ rex = QSE_AWK_BUILDREX ( - run->awk, fs_ptr, fs_len, &run->errnum); + run->awk, fs_ptr, fs_len, &run->errinf.num); if (rex == QSE_NULL) { if (val->type != QSE_AWK_VAL_STR) @@ -423,7 +423,7 @@ static int set_global ( if (shorten_record (run, (qse_size_t)lv) == -1) { /* adjust the error line */ - if (var != QSE_NULL) run->errlin = var->line; + if (var != QSE_NULL) run->errinf.lin = var->line; return -1; } } @@ -518,7 +518,7 @@ static int set_global ( /* compile the regular expression */ /* TODO: use safebuild */ rex = QSE_AWK_BUILDREX ( - run->awk, rs_ptr, rs_len, &run->errnum); + run->awk, rs_ptr, rs_len, &run->errinf.num); if (rex == QSE_NULL) { if (val->type != QSE_AWK_VAL_STR) @@ -676,9 +676,9 @@ qse_awk_rtx_t* qse_awk_rtx_open ( } /* clear the run error */ - rtx->errnum = QSE_AWK_ENOERR; - rtx->errlin = 0; - rtx->errmsg[0] = QSE_T('\0'); + rtx->errinf.num = QSE_AWK_ENOERR; + rtx->errinf.lin = 0; + rtx->errinf.msg[0] = QSE_T('\0'); if (init_globals (rtx, arg) == -1) { @@ -751,9 +751,9 @@ static int init_rtx (qse_awk_rtx_t* rtx, qse_awk_t* awk, qse_awk_rio_t* rio) rtx->vmgr.rchunk = QSE_NULL; rtx->vmgr.rfree = QSE_NULL; - rtx->errnum = QSE_AWK_ENOERR; - rtx->errlin = 0; - rtx->errmsg[0] = QSE_T('\0'); + rtx->errinf.num = QSE_AWK_ENOERR; + rtx->errinf.lin = 0; + rtx->errinf.msg[0] = QSE_T('\0'); rtx->inrec.buf_pos = 0; rtx->inrec.buf_len = 0; @@ -1328,7 +1328,7 @@ static int run_bpae_loop (qse_awk_rtx_t* rtx) ret = rtx->rcb.on_enter (rtx, rtx->rcb.data); if (ret <= -1) { - if (rtx->errnum == QSE_AWK_ENOMEM) + if (rtx->errinf.num == QSE_AWK_ENOMEM) qse_awk_rtx_seterrnum (rtx, QSE_AWK_EUNKNOWN); ret = -1; } @@ -1349,15 +1349,15 @@ static int run_bpae_loop (qse_awk_rtx_t* rtx) if (run_block (rtx, blk) == -1) ret = -1; } - if (ret == -1 && rtx->errnum == QSE_AWK_ENOERR) + if (ret == -1 && rtx->errinf.num == QSE_AWK_ENOERR) { /* an error is returned with no error number set. * this feature is used by eval_expression() to * abort the evaluation when exit() is executed * during function evaluation */ ret = 0; - rtx->errlin = 0; - rtx->errmsg[0] = QSE_T('\0'); + rtx->errinf.lin = 0; + rtx->errinf.msg[0] = QSE_T('\0'); } /* run pattern block loops */ @@ -1369,15 +1369,15 @@ static int run_bpae_loop (qse_awk_rtx_t* rtx) if (run_pattern_blocks(rtx) == -1) ret = -1; } - if (ret == -1 && rtx->errnum == QSE_AWK_ENOERR) + if (ret == -1 && rtx->errinf.num == QSE_AWK_ENOERR) { /* an error is returned with no error number set. * this feature is used by eval_expression() to * abort the evaluation when exit() is executed * during function evaluation */ ret = 0; - rtx->errlin = 0; - rtx->errmsg[0] = QSE_T('\0'); + rtx->errinf.lin = 0; + rtx->errinf.msg[0] = QSE_T('\0'); } /* execute END blocks. the first END block is executed if the @@ -1402,15 +1402,15 @@ static int run_bpae_loop (qse_awk_rtx_t* rtx) } } - if (ret == -1 && rtx->errnum == QSE_AWK_ENOERR) + if (ret == -1 && rtx->errinf.num == QSE_AWK_ENOERR) { /* an error is returned with no error number set. * this feature is used by eval_expression() to * abort the evaluation when exit() is executed * during function evaluation */ ret = 0; - rtx->errlin = 0; - rtx->errmsg[0] = QSE_T('\0'); + rtx->errinf.lin = 0; + rtx->errinf.msg[0] = QSE_T('\0'); } /* derefrence all arguments. however, there should be no arguments @@ -1567,13 +1567,13 @@ static int run_pattern_blocks (qse_awk_rtx_t* run) if (run->awk->tree.chain != QSE_NULL) \ { \ if (run->awk->tree.chain->pattern != QSE_NULL) \ - run->errlin = run->awk->tree.chain->pattern->line; \ + run->errinf.lin = run->awk->tree.chain->pattern->line; \ else if (run->awk->tree.chain->action != QSE_NULL) \ - run->errlin = run->awk->tree.chain->action->line; \ + run->errinf.lin = run->awk->tree.chain->action->line; \ } \ else if (run->awk->tree.end != QSE_NULL) \ { \ - run->errlin = run->awk->tree.end->line; \ + run->errinf.lin = run->awk->tree.end->line; \ } run->inrec.buf_pos = 0; @@ -1764,7 +1764,7 @@ static int run_block0 (qse_awk_rtx_t* run, qse_awk_nde_blk_t* nde) qse_awk_rtx_refdownval (run, run->inrec.d0); /* adjust the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } @@ -1776,7 +1776,7 @@ static int run_block0 (qse_awk_rtx_t* run, qse_awk_nde_blk_t* nde) qse_awk_rtx_refdownval (run, run->inrec.d0); /* adjust the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } @@ -2199,7 +2199,7 @@ static qse_map_walk_t walk_foreach ( if (str == QSE_NULL) { /* adjust the error line */ - w->rtx->errlin = w->var->line; + w->rtx->errinf.lin = w->var->line; w->ret = -1; return QSE_MAP_WALK_STOP; } @@ -2396,7 +2396,7 @@ static int run_nextinfile (qse_awk_rtx_t* run, qse_awk_nde_nextfile_t* nde) if (n == -1) { /* adjust the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } @@ -2410,7 +2410,7 @@ static int run_nextinfile (qse_awk_rtx_t* run, qse_awk_nde_nextfile_t* nde) /* FNR resets to 0, NR remains the same */ if (update_fnr (run, 0, run->gbl.nr) == -1) { - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } @@ -2429,7 +2429,7 @@ static int run_nextoutfile (qse_awk_rtx_t* run, qse_awk_nde_nextfile_t* nde) if (n == -1) { /* adjust the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } @@ -2481,7 +2481,7 @@ static int run_delete (qse_awk_rtx_t* run, qse_awk_nde_delete_t* nde) if (tmp == QSE_NULL) { /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } @@ -2554,7 +2554,7 @@ static int run_delete (qse_awk_rtx_t* run, qse_awk_nde_delete_t* nde) if (key == QSE_NULL) { /* change the error line */ - run->errlin = var->line; + run->errinf.lin = var->line; return -1; } @@ -2601,7 +2601,7 @@ static int run_delete (qse_awk_rtx_t* run, qse_awk_nde_delete_t* nde) if (tmp == QSE_NULL) { /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } @@ -2616,7 +2616,7 @@ static int run_delete (qse_awk_rtx_t* run, qse_awk_nde_delete_t* nde) qse_awk_rtx_refupval (run, tmp); qse_awk_rtx_refdownval (run, tmp); - run->errlin = var->line; + run->errinf.lin = var->line; return -1; } } @@ -2682,7 +2682,7 @@ static int run_delete (qse_awk_rtx_t* run, qse_awk_nde_delete_t* nde) if (key == QSE_NULL) { - run->errlin = var->line; + run->errinf.lin = var->line; return -1; } @@ -2799,7 +2799,7 @@ static int run_print (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) { qse_awk_rtx_refdownval (run, v); /* change the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } out = vsout.u.cpldup.ptr; @@ -2843,13 +2843,13 @@ static int run_print (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) run, nde->out_type, dst, QSE_STR_PTR(&run->inrec.line), QSE_STR_LEN(&run->inrec.line)); - if (n <= -1 /*&& run->errnum != QSE_AWK_EIOIMPL*/) + if (n <= -1 /*&& run->errinf.num != QSE_AWK_EIOIMPL*/) { if (out != QSE_NULL) QSE_AWK_FREE (run->awk, out); /* adjust the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } } @@ -2875,13 +2875,13 @@ static int run_print (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) run, nde->out_type, dst, run->gbl.ofs.ptr, run->gbl.ofs.len); - if (n <= -1 /*&& run->errnum != QSE_AWK_EIOIMPL*/) + if (n <= -1 /*&& run->errinf.num != QSE_AWK_EIOIMPL*/) { if (out != QSE_NULL) QSE_AWK_FREE (run->awk, out); /* adjust the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } } @@ -2896,14 +2896,14 @@ static int run_print (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) qse_awk_rtx_refupval (run, v); n = qse_awk_rtx_writeio_val (run, nde->out_type, dst, v); - if (n <= -1 /*&& run->errnum != QSE_AWK_EIOIMPL*/) + if (n <= -1 /*&& run->errinf.num != QSE_AWK_EIOIMPL*/) { if (out != QSE_NULL) QSE_AWK_FREE (run->awk, out); qse_awk_rtx_refdownval (run, v); /* adjust the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } @@ -2915,12 +2915,12 @@ static int run_print (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) n = qse_awk_rtx_writeio_str ( run, nde->out_type, dst, run->gbl.ors.ptr, run->gbl.ors.len); - if (n <= -1 /*&& run->errnum != QSE_AWK_EIOIMPL*/) + if (n <= -1 /*&& run->errinf.num != QSE_AWK_EIOIMPL*/) { if (out != QSE_NULL) QSE_AWK_FREE (run->awk, out); /* change the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } @@ -2959,7 +2959,7 @@ static int run_printf (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) if (qse_awk_rtx_valtostr (run, v, &vsout) == QSE_NULL) { qse_awk_rtx_refdownval (run, v); - run->errlin = nde->line; /* change the error line */ + run->errinf.lin = nde->line; /* change the error line */ return -1; } out = vsout.u.cpldup.ptr; @@ -3019,13 +3019,13 @@ static int run_printf (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) /* the remaining arguments are ignored as the format cannot * contain any % characters */ n = qse_awk_rtx_writeio_val (run, nde->out_type, dst, v); - if (n <= -1 /*&& run->errnum != QSE_AWK_EIOIMPL*/) + if (n <= -1 /*&& run->errinf.num != QSE_AWK_EIOIMPL*/) { if (out != QSE_NULL) QSE_AWK_FREE (run->awk, out); qse_awk_rtx_refdownval (run, v); /* change the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } } @@ -3042,7 +3042,7 @@ static int run_printf (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) qse_awk_rtx_refdownval (run, v); /* adjust the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return -1; } } @@ -3051,7 +3051,7 @@ static int run_printf (qse_awk_rtx_t* run, qse_awk_nde_print_t* nde) if (out != QSE_NULL) QSE_AWK_FREE (run->awk, out); /*skip_write:*/ - return 0; + return qse_awk_rtx_flushio (run, nde->out_type, dst); } static int output_formatted ( @@ -3067,7 +3067,7 @@ static int output_formatted ( if (ptr == QSE_NULL) return -1; n = qse_awk_rtx_writeio_str (run, out_type, dst, ptr, len); - if (n <= -1 /*&& run->errnum != QSE_AWK_EIOIMPL*/) return -1; + if (n <= -1 /*&& run->errinf.num != QSE_AWK_EIOIMPL*/) return -1; return 0; } @@ -3085,7 +3085,7 @@ static qse_awk_val_t* eval_expression (qse_awk_rtx_t* run, qse_awk_nde_t* nde) * clears the error number. run_main will * detect this condition and treat it as a * non-error condition.*/ - run->errnum = QSE_AWK_ENOERR; + run->errinf.num = QSE_AWK_ENOERR; return QSE_NULL; } #endif @@ -3140,7 +3140,7 @@ static qse_awk_val_t* eval_expression (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (v == QSE_NULL) { /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -3195,7 +3195,7 @@ static qse_awk_val_t* eval_expression0 (qse_awk_rtx_t* run, qse_awk_nde_t* nde) * clears the error number. run_main will * detect this condition and treat it as a * non-error condition.*/ - run->errnum = QSE_AWK_ENOERR; + run->errinf.num = QSE_AWK_ENOERR; return QSE_NULL; } @@ -3389,7 +3389,7 @@ static qse_awk_val_t* do_assignment_scalar ( if (set_global (run, var->id.idxa, var, val) == -1) { /* adjust error line */ - run->errlin = var->line; + run->errinf.lin = var->line; return QSE_NULL; } } @@ -3481,7 +3481,7 @@ static qse_awk_val_t* do_assignment_map ( if (tmp == QSE_NULL) { /* adjust error line */ - run->errlin = var->line; + run->errinf.lin = var->line; return QSE_NULL; } @@ -3515,7 +3515,7 @@ static qse_awk_val_t* do_assignment_map ( qse_awk_rtx_refdownval (run, tmp); /* change error line */ - run->errlin = var->line; + run->errinf.lin = var->line; return QSE_NULL; } qse_awk_rtx_refdownval (run, tmp); @@ -3608,7 +3608,7 @@ static qse_awk_val_t* do_assignment_pos ( if (qse_awk_rtx_valtostr (run, val, &out) == QSE_NULL) { /* change error line */ - run->errlin = pos->line; + run->errinf.lin = pos->line; return QSE_NULL; } @@ -3714,7 +3714,7 @@ static qse_awk_val_t* eval_binary (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { /* change the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; } qse_awk_rtx_refdownval (run, left); @@ -3734,7 +3734,7 @@ static qse_awk_val_t* eval_binop_lor ( qse_awk_rtx_valtobool(run left) || qse_awk_rtx_valtobool(run,right)); if (res == QSE_NULL) { - run->errlin = left->line; + run->errinf.lin = left->line; return QSE_NULL; } @@ -3783,7 +3783,7 @@ static qse_awk_val_t* eval_binop_land ( qse_awk_rtx_valtobool(run,left) && qse_awk_rtx_valtobool(run,right)); if (res == QSE_NULL) { - run->errlin = left->line; + run->errinf.lin = left->line; return QSE_NULL; } @@ -4812,7 +4812,7 @@ static qse_awk_val_t* eval_binop_match0 ( QSE_AWK_FREE (run->awk, rex_code); /* adjust error line */ - run->errlin = lline; + run->errinf.lin = lline; return QSE_NULL; } } @@ -4852,7 +4852,7 @@ static qse_awk_val_t* eval_binop_match0 ( QSE_AWK_FREE (run->awk, rex_code); /* adjust error line */ - run->errlin = lline; + run->errinf.lin = lline; return QSE_NULL; } @@ -4930,7 +4930,7 @@ static qse_awk_val_t* eval_unary (qse_awk_rtx_t* run, qse_awk_nde_t* nde) exit_func: qse_awk_rtx_refdownval (run, left); - if (res == QSE_NULL) run->errlin = nde->line; + if (res == QSE_NULL) run->errinf.lin = nde->line; return res; } @@ -4970,7 +4970,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -4982,7 +4982,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5001,7 +5001,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) run, QSE_AWK_EOPERAND, nde->line, QSE_NULL); */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5019,7 +5019,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5034,7 +5034,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5046,7 +5046,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5065,7 +5065,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) run, QSE_AWK_EOPERAND, nde->line, QSE_NULL); */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5083,7 +5083,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5145,7 +5145,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5155,7 +5155,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_freeval (run, res, QSE_TRUE); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5167,7 +5167,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5177,7 +5177,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_freeval (run, res, QSE_TRUE); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5196,7 +5196,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) run, QSE_AWK_EOPERAND, nde->line, QSE_NULL); */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5207,7 +5207,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5217,7 +5217,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_freeval (run, res, QSE_TRUE); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5229,7 +5229,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5239,7 +5239,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_freeval (run, res, QSE_TRUE); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5255,7 +5255,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5265,7 +5265,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_freeval (run, res, QSE_TRUE); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5277,7 +5277,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5287,7 +5287,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_freeval (run, res, QSE_TRUE); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5306,7 +5306,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) run, QSE_AWK_EOPERAND, nde->line, QSE_NULL); */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5317,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); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5327,7 +5327,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_freeval (run, res, QSE_TRUE); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5339,7 +5339,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_rtx_refdownval (run, left); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -5349,7 +5349,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_freeval (run, res, QSE_TRUE); /* adjust error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } } @@ -5647,7 +5647,7 @@ static qse_awk_val_t* __eval_call ( if (call->what.fnc.handler != QSE_NULL) { - run->errnum = QSE_AWK_ENOERR; + run->errinf.num = QSE_AWK_ENOERR; /* NOTE: oname is used when the handler is invoked. * name might be differnt from oname if @@ -5659,7 +5659,7 @@ static qse_awk_val_t* __eval_call ( if (n <= -1) { - if (run->errnum == QSE_AWK_ENOERR) + if (run->errinf.num == QSE_AWK_ENOERR) { /* the handler has not set the error. * fix it */ @@ -5670,7 +5670,7 @@ static qse_awk_val_t* __eval_call ( else { /* adjust the error line */ - run->errlin = nde->line; + run->errinf.lin = nde->line; } /* correct the return code just in case */ @@ -5696,7 +5696,7 @@ static qse_awk_val_t* __eval_call ( v = STACK_RETVAL(run); if (n == -1) { - if (run->errnum == QSE_AWK_ENOERR && errhandler != QSE_NULL) + if (run->errinf.num == QSE_AWK_ENOERR && errhandler != QSE_NULL) { /* errhandler is passed only when __eval_call() is * invoked from qse_awk_rtx_call(). Under this @@ -5709,7 +5709,7 @@ static qse_awk_val_t* __eval_call ( * decremented, it can't get the return value * if it turns out to be terminated by exit(). * The return value could be destroyed by then. - * Unlikely, run_bpae_loop() just checks if run->errnum + * Unlikely, run_bpae_loop() just checks if run->errinf.num * is QSE_AWK_ENOERR and gets STACK_RETVAL_GBL(run) * to determine if it is terminated by exit(). * @@ -6020,7 +6020,7 @@ static qse_awk_val_t** get_reference_indexed ( tmp = qse_awk_rtx_makemapval (run); if (tmp == QSE_NULL) { - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -6069,7 +6069,7 @@ static qse_awk_val_t* eval_int (qse_awk_rtx_t* run, qse_awk_nde_t* nde) val = qse_awk_rtx_makeintval (run, ((qse_awk_nde_int_t*)nde)->val); if (val == QSE_NULL) { - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } ((qse_awk_val_int_t*)val)->nde = nde; @@ -6084,7 +6084,7 @@ static qse_awk_val_t* eval_real (qse_awk_rtx_t* run, qse_awk_nde_t* nde) val = qse_awk_rtx_makerealval (run, ((qse_awk_nde_real_t*)nde)->val); if (val == QSE_NULL) { - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } ((qse_awk_val_real_t*)val)->nde = nde; @@ -6101,7 +6101,7 @@ static qse_awk_val_t* eval_str (qse_awk_rtx_t* run, qse_awk_nde_t* nde) ((qse_awk_nde_str_t*)nde)->len); if (val == QSE_NULL) { - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -6118,7 +6118,7 @@ static qse_awk_val_t* eval_rex (qse_awk_rtx_t* run, qse_awk_nde_t* nde) ((qse_awk_nde_rex_t*)nde)->code); if (val == QSE_NULL) { - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -6168,7 +6168,7 @@ static qse_awk_val_t* eval_indexed ( tmp = qse_awk_rtx_makemapval (run); if (tmp == QSE_NULL) { - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -6382,7 +6382,7 @@ static qse_awk_val_t* eval_getline (qse_awk_rtx_t* run, qse_awk_nde_t* nde) qse_str_fini (&buf); if (v == QSE_NULL) { - run->errlin = nde->line; + run->errinf.lin = nde->line; return QSE_NULL; } @@ -6402,7 +6402,7 @@ static qse_awk_val_t* eval_getline (qse_awk_rtx_t* run, qse_awk_nde_t* nde) skip_read: res = qse_awk_rtx_makeintval (run, n); - if (res == QSE_NULL) run->errlin = nde->line; + if (res == QSE_NULL) run->errinf.lin = nde->line; return res; } @@ -6621,7 +6621,7 @@ static qse_char_t* idxnde_to_str ( if (qse_awk_rtx_valtostr (run, idx, &out) == QSE_NULL) { qse_awk_rtx_refdownval (run, idx); - run->errlin = nde->line; /* adjust error line */ + run->errinf.lin = nde->line; /* adjust error line */ return QSE_NULL; }