From 9253c8644f29f6fa3df3c10cba9b07fd44f3b433 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Wed, 26 Aug 2009 03:50:07 +0000 Subject: [PATCH] enhanced error location handling for awk --- qse/cmd/awk/awk.c | 22 +- qse/include/qse/awk/Awk.hpp | 19 +- qse/include/qse/awk/awk.h | 51 +-- qse/lib/awk/Awk.cpp | 56 ++-- qse/lib/awk/awk.c | 12 +- qse/lib/awk/awk.h | 10 +- qse/lib/awk/err.c | 31 +- qse/lib/awk/parse.c | 622 +++++++++++++++++++----------------- qse/lib/awk/run.c | 529 +++++++++++++++--------------- qse/lib/awk/tree.h | 4 +- qse/regress/awk/regress.out | 32 +- qse/samples/awk/awk05.cpp | 12 +- qse/samples/awk/awk06.cpp | 12 +- qse/samples/awk/awk07.cpp | 12 +- qse/samples/awk/awk08.cpp | 4 +- 15 files changed, 746 insertions(+), 682 deletions(-) diff --git a/qse/cmd/awk/awk.c b/qse/cmd/awk/awk.c index e9589f21..a3707d53 100644 --- a/qse/cmd/awk/awk.c +++ b/qse/cmd/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c 256 2009-08-16 13:44:20Z hyunghwan.chung $ + * $Id: awk.c 267 2009-08-25 09:50:07Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -644,20 +644,32 @@ static void freearg (struct arg_t* arg) static void print_awkerr (qse_awk_t* awk) { + const qse_awk_loc_t* loc = qse_awk_geterrloc (awk); + print_err ( - QSE_T("CODE [%d] LINE [%u] %s\n"), + QSE_T("CODE %d LINE %u COLUMN %u %s%s%s- %s\n"), qse_awk_geterrnum(awk), - (unsigned int)qse_awk_geterrlin(awk), + (unsigned int)loc->lin, + (unsigned int)loc->col, + ((loc->fil == QSE_NULL)? QSE_T(""): QSE_T("FILE ")), + ((loc->fil == QSE_NULL)? QSE_T(""): loc->fil), + ((loc->fil == QSE_NULL)? QSE_T(""): QSE_T(" ")), qse_awk_geterrmsg(awk) ); } static void print_rtxerr (qse_awk_rtx_t* rtx) { + const qse_awk_loc_t* loc = qse_awk_rtx_geterrloc (rtx); + print_err ( - QSE_T("CODE [%d] LINE [%u] %s\n"), + QSE_T("CODE %d LINE %u COLUMN %u %s%s%s- %s\n"), qse_awk_rtx_geterrnum(rtx), - (unsigned int)qse_awk_rtx_geterrlin(rtx), + (unsigned int)loc->lin, + (unsigned int)loc->col, + ((loc->fil == QSE_NULL)? QSE_T(""): QSE_T("FILE ")), + ((loc->fil == QSE_NULL)? QSE_T(""): loc->fil), + ((loc->fil == QSE_NULL)? QSE_T(""): QSE_T(" ")), qse_awk_rtx_geterrmsg(rtx) ); } diff --git a/qse/include/qse/awk/Awk.hpp b/qse/include/qse/awk/Awk.hpp index 86499c29..0b83068e 100644 --- a/qse/include/qse/awk/Awk.hpp +++ b/qse/include/qse/awk/Awk.hpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.hpp 259 2009-08-20 11:28:03Z hyunghwan.chung $ + * $Id: Awk.hpp 267 2009-08-25 09:50:07Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -46,6 +46,7 @@ public: /** Defines a primitive handle */ typedef qse_awk_t awk_t; + typedef qse_awk_loc_t loc_t; typedef qse_awk_errnum_t errnum_t; typedef qse_awk_errstr_t errstr_t; typedef qse_awk_errinf_t errinf_t; @@ -224,10 +225,10 @@ public: ErrorNumber getErrorNumber () const; /** - * The Awk::getErrorLine() function returns the line number of the last - * error occurred. + * The Awk::getErrorLocation() function returns the location of the + * last error occurred. */ - size_t getErrorLine () const; + loc_t getErrorLocation () const; /** * The Awk::getErrorMessage() function returns a message describing @@ -241,13 +242,13 @@ public: void setError ( ErrorNumber code, const cstr_t* args = QSE_NULL, - size_t line = 0 + const loc_t* loc = QSE_NULL ); void setErrorWithMessage ( ErrorNumber code, const char_t* msg, - size_t line + const loc_t* loc ); /** clears error information */ @@ -744,19 +745,19 @@ public: bool shouldStop () const; ErrorNumber getErrorNumber () const; - size_t getErrorLine () const; + loc_t getErrorLocation () const; const char_t* getErrorMessage () const; void setError ( ErrorNumber code, const cstr_t* args = QSE_NULL, - size_t line = 0 + const loc_t* loc = QSE_NULL ); void setErrorWithMessage ( ErrorNumber code, const char_t* msg, - size_t line + const loc_t* loc ); /** diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index d139eba8..5795839c 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h 264 2009-08-23 12:56:45Z hyunghwan.chung $ + * $Id: awk.h 267 2009-08-25 09:50:07Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -358,6 +358,7 @@ typedef enum qse_awk_rio_mode_t qse_awk_rio_mode_t; * #QSE_AWK_RIO_OPEN is requested. For other request type, it can refer * to the handle field set previously. */ +typedef struct qse_awk_rio_arg_t qse_awk_rio_arg_t; struct qse_awk_rio_arg_t { qse_awk_rio_mode_t mode; /**< [IN] I/O mode */ @@ -384,7 +385,6 @@ struct qse_awk_rio_arg_t struct qse_awk_rio_arg_t* next; }; -typedef struct qse_awk_rio_arg_t qse_awk_rio_arg_t; /** * The qse_awk_rio_fun_t type defines a runtime I/O handler. @@ -400,6 +400,7 @@ typedef qse_ssize_t (*qse_awk_rio_fun_t) ( /** * The qse_awk_prm_t type defines primitive functions */ +typedef struct qse_awk_prm_t qse_awk_prm_t; struct qse_awk_prm_t { qse_awk_pow_t pow; @@ -436,7 +437,17 @@ struct qse_awk_prm_t ); #endif }; -typedef struct qse_awk_prm_t qse_awk_prm_t; + +/** + * The qse_awk_loc_t type defines a structure to hold location. + */ +typedef struct qse_awk_loc_t qse_awk_loc_t; +struct qse_awk_loc_t +{ + const qse_char_t* fil; /**< file */ + qse_size_t lin; /**< line */ + qse_size_t col; /**< column */ +}; /** * The qse_awk_sio_t type defines a script stream handler set. @@ -508,7 +519,7 @@ struct qse_awk_rcb_t * each statement executed. */ void (*on_statement) ( - qse_awk_rtx_t* rtx, qse_size_t line, void* udd); + qse_awk_rtx_t* rtx, const qse_awk_loc_t* loc, void* udd); /** * A caller may store a custom data pointer into this field. @@ -765,7 +776,6 @@ enum qse_awk_errnum_t }; typedef enum qse_awk_errnum_t qse_awk_errnum_t; - /** * The qse_awk_errinf_t type defines a placeholder for error information. */ @@ -773,7 +783,7 @@ struct qse_awk_errinf_t { qse_awk_errnum_t num; /**< error number */ qse_char_t msg[256]; /**< error message */ - qse_size_t lin; /**< line number where an error occurred */ + qse_awk_loc_t loc; /**< error location */ }; typedef struct qse_awk_errinf_t qse_awk_errinf_t; @@ -1018,11 +1028,10 @@ qse_awk_errnum_t qse_awk_geterrnum ( ); /** - * The qse_awk_geterrlin() function returns the line number where the + * The qse_awk_geterrloc() function returns the location where the * last error has occurred. - * @return line number */ -qse_size_t qse_awk_geterrlin ( +const qse_awk_loc_t* qse_awk_geterrloc ( qse_awk_t* awk /**< awk object */ ); @@ -1065,17 +1074,18 @@ void qse_awk_geterror ( qse_awk_t* awk, qse_awk_errnum_t* errnum, const qse_char_t** errmsg, - qse_size_t* errlin + qse_awk_loc_t* errloc ); /** * The qse_awk_seterror() functon sets error information. */ void qse_awk_seterror ( - qse_awk_t* awk, /**< awk object */ - qse_awk_errnum_t errnum, /**< error number */ - const qse_cstr_t* errarg, /**< argument array for formatting error message */ - qse_size_t errlin /**< line number */ + qse_awk_t* awk, /**< awk object */ + qse_awk_errnum_t errnum, /**< error number */ + const qse_cstr_t* errarg, /**< array of arguments for formatting + * an error message */ + const qse_awk_loc_t* errloc /**< error location */ ); int qse_awk_getoption ( @@ -1528,7 +1538,7 @@ qse_awk_errnum_t qse_awk_rtx_geterrnum ( qse_awk_rtx_t* rtx /**< runtime context */ ); -qse_size_t qse_awk_rtx_geterrlin ( +const qse_awk_loc_t* qse_awk_rtx_geterrloc ( qse_awk_rtx_t* rtx /**< runtime context */ ); @@ -1555,7 +1565,7 @@ void qse_awk_rtx_geterror ( qse_awk_rtx_t* rtx, /**< runtime context */ qse_awk_errnum_t* errnum, /**< error number */ const qse_char_t** errmsg, /**< error message */ - qse_size_t* errlin /**< error line */ + qse_awk_loc_t* errloc /**< error location */ ); void qse_awk_rtx_seterrnum ( @@ -1570,10 +1580,11 @@ void qse_awk_rtx_seterrinf ( ); void qse_awk_rtx_seterror ( - qse_awk_rtx_t* rtx, /**< runtime context */ - qse_awk_errnum_t errnum, /**< error number */ - const qse_cstr_t* errarg, /**< argument array for formatting error message */ - qse_size_t errlin /**< error line */ + qse_awk_rtx_t* rtx, /**< runtime context */ + qse_awk_errnum_t errnum, /**< error number */ + const qse_cstr_t* errarg, /**< array of arguments for formatting + * an error message */ + const qse_awk_loc_t* errloc /**< error line */ ); /** diff --git a/qse/lib/awk/Awk.cpp b/qse/lib/awk/Awk.cpp index b7f61f3c..e78e54b8 100644 --- a/qse/lib/awk/Awk.cpp +++ b/qse/lib/awk/Awk.cpp @@ -1,5 +1,5 @@ /* - * $Id: Awk.cpp 259 2009-08-20 11:28:03Z hyunghwan.chung $ + * $Id: Awk.cpp 267 2009-08-25 09:50:07Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -908,10 +908,10 @@ Awk::ErrorNumber Awk::Run::getErrorNumber () const return (ErrorNumber)qse_awk_rtx_geterrnum (this->rtx); } -Awk::size_t Awk::Run::getErrorLine () const +Awk::loc_t Awk::Run::getErrorLocation () const { QSE_ASSERT (this->rtx != QSE_NULL); - return qse_awk_rtx_geterrlin (this->rtx); + return *qse_awk_rtx_geterrloc (this->rtx); } const Awk::char_t* Awk::Run::getErrorMessage () const @@ -920,21 +920,22 @@ const Awk::char_t* Awk::Run::getErrorMessage () const return qse_awk_rtx_geterrmsg (this->rtx); } -void Awk::Run::setError (ErrorNumber code, const cstr_t* args, size_t line) +void Awk::Run::setError (ErrorNumber code, const cstr_t* args, const loc_t* loc) { QSE_ASSERT (this->rtx != QSE_NULL); - qse_awk_rtx_seterror (this->rtx, (errnum_t)code, args, line); + qse_awk_rtx_seterror (this->rtx, (errnum_t)code, args, loc); } void Awk::Run::setErrorWithMessage ( - ErrorNumber code, const char_t* msg, size_t line) + ErrorNumber code, const char_t* msg, const loc_t* loc) { QSE_ASSERT (this->rtx != QSE_NULL); errinf_t errinf; + QSE_MEMSET (&errinf, 0, QSE_SIZEOF(errinf)); errinf.num = (errnum_t)code; - errinf.lin = line; + if (loc == QSE_NULL) errinf.loc = *loc; qse_strxcpy (errinf.msg, QSE_COUNTOF(errinf.msg), msg); qse_awk_rtx_seterrinf (this->rtx, &errinf); @@ -998,9 +999,8 @@ int Awk::Run::getGlobal (int id, Value& g) const Awk::Awk () : awk (QSE_NULL), functionMap (QSE_NULL), runctx (this) { + QSE_MEMSET (&errinf, 0, QSE_SIZEOF(errinf)); errinf.num = (errnum_t)ERR_NOERR; - errinf.lin = 0; - errinf.msg[0] = QSE_T('\0'); } Awk::operator Awk::awk_t* () const @@ -1027,9 +1027,9 @@ Awk::ErrorNumber Awk::getErrorNumber () const return (ErrorNumber)this->errinf.num; } -Awk::size_t Awk::getErrorLine () const +Awk::loc_t Awk::getErrorLocation () const { - return this->errinf.lin; + return this->errinf.loc; } const Awk::char_t* Awk::getErrorMessage () const @@ -1037,44 +1037,38 @@ const Awk::char_t* Awk::getErrorMessage () const return this->errinf.msg; } -void Awk::setError (ErrorNumber code, const cstr_t* args, size_t line) +void Awk::setError (ErrorNumber code, const cstr_t* args, const loc_t* loc) { if (awk != QSE_NULL) { - qse_awk_seterror (awk, (errnum_t)code, args, line); + qse_awk_seterror (awk, (errnum_t)code, args, loc); retrieveError (); } else { + QSE_MEMSET (&errinf, 0, QSE_SIZEOF(errinf)); errinf.num = (errnum_t)code; - errinf.lin = line; + if (loc != QSE_NULL) errinf.loc = *loc; qse_strxcpy (errinf.msg, QSE_COUNTOF(errinf.msg), QSE_T("not ready to set an error message")); } } -void Awk::setErrorWithMessage (ErrorNumber code, const char_t* msg, size_t line) +void Awk::setErrorWithMessage (ErrorNumber code, const char_t* msg, const loc_t* loc) { - if (awk != QSE_NULL) - { - errinf.num = (errnum_t)code; - errinf.lin = line; - qse_strxcpy (errinf.msg, QSE_COUNTOF(errinf.msg), msg); - qse_awk_seterrinf (awk, &errinf); - } - else - { - errinf.num = (errnum_t)code; - errinf.lin = line; - qse_strxcpy (errinf.msg, QSE_COUNTOF(errinf.msg), msg); - } + QSE_MEMSET (&errinf, 0, QSE_SIZEOF(errinf)); + + errinf.num = (errnum_t)code; + if (loc != QSE_NULL) errinf.loc = *loc; + qse_strxcpy (errinf.msg, QSE_COUNTOF(errinf.msg), msg); + + if (awk != QSE_NULL) qse_awk_seterrinf (awk, &errinf); } void Awk::clearError () { + QSE_MEMSET (&errinf, 0, QSE_SIZEOF(errinf)); errinf.num = (errnum_t)ERR_NOERR; - errinf.lin = 0; - errinf.msg[0] = QSE_T('\0'); } void Awk::retrieveError () @@ -1783,4 +1777,4 @@ int Awk::sprintf (awk_t* awk, char_t* buf, size_t size, ///////////////////////////////// QSE_END_NAMESPACE(QSE) -///////////////////////////////// \ No newline at end of file +///////////////////////////////// diff --git a/qse/lib/awk/awk.c b/qse/lib/awk/awk.c index df789e20..bb655e61 100644 --- a/qse/lib/awk/awk.c +++ b/qse/lib/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c 266 2009-08-24 12:15:56Z hyunghwan.chung $ + * $Id: awk.c 267 2009-08-25 09:50:07Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -183,7 +183,9 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_awk_prm_t* prm) awk->option = QSE_AWK_CLASSIC; awk->errinf.num = QSE_AWK_ENOERR; - awk->errinf.lin = 0; + awk->errinf.loc.lin = 0; + awk->errinf.loc.col = 0; + awk->errinf.loc.fil = QSE_NULL; awk->errstr = qse_awk_dflerrstr; awk->stopall = QSE_FALSE; @@ -322,7 +324,11 @@ int qse_awk_clear (qse_awk_t* awk) awk->tree.chain_size = 0; QSE_ASSERT (awk->sio.inp == &awk->sio.arg); - qse_map_clear (awk->sio.names); + /* this table must not be cleared here as there can be a reference + * to an entry of this table from errinf.fil when qse_awk_parse() + * failed. this table is cleared in qse_awk_parse(). + * qse_map_clear (awk->sio.names); + */ awk->sio.last.c = QSE_CHAR_EOF; awk->sio.last.lin = 0; diff --git a/qse/lib/awk/awk.h b/qse/lib/awk/awk.h index 17c9db32..f08311a3 100644 --- a/qse/lib/awk/awk.h +++ b/qse/lib/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h 265 2009-08-24 01:50:38Z hyunghwan.chung $ + * $Id: awk.h 267 2009-08-25 09:50:07Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -96,14 +96,6 @@ struct qse_awk_tree_t int ok; }; -typedef struct qse_awk_loc_t qse_awk_loc_t; -struct qse_awk_loc_t -{ - const qse_char_t* fil; - qse_size_t lin; - qse_size_t col; -}; - typedef struct qse_awk_tok_t qse_awk_tok_t; struct qse_awk_tok_t { diff --git a/qse/lib/awk/err.c b/qse/lib/awk/err.c index 6396a9a5..e19f0eae 100644 --- a/qse/lib/awk/err.c +++ b/qse/lib/awk/err.c @@ -1,5 +1,5 @@ /* - * $Id: err.c 258 2009-08-19 14:04:15Z hyunghwan.chung $ + * $Id: err.c 267 2009-08-25 09:50:07Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -169,9 +169,9 @@ qse_awk_errnum_t qse_awk_geterrnum (qse_awk_t* awk) return awk->errinf.num; } -qse_size_t qse_awk_geterrlin (qse_awk_t* awk) +const qse_awk_loc_t* qse_awk_geterrloc (qse_awk_t* awk) { - return awk->errinf.lin; + return &awk->errinf.loc; } const qse_char_t* qse_awk_geterrmsg (qse_awk_t* awk) @@ -192,10 +192,10 @@ void qse_awk_geterrinf (qse_awk_t* awk, qse_awk_errinf_t* errinf) void qse_awk_geterror ( qse_awk_t* awk, qse_awk_errnum_t* errnum, - const qse_char_t** errmsg, qse_size_t* errlin) + const qse_char_t** errmsg, qse_awk_loc_t* errloc) { if (errnum != QSE_NULL) *errnum = awk->errinf.num; - if (errlin != QSE_NULL) *errlin = awk->errinf.lin; + if (errloc != QSE_NULL) *errloc = awk->errinf.loc; if (errmsg != QSE_NULL) { *errmsg = (awk->errinf.msg[0] == QSE_T('\0'))? @@ -207,7 +207,7 @@ void qse_awk_geterror ( void qse_awk_seterrnum ( qse_awk_t* awk, qse_awk_errnum_t errnum, const qse_cstr_t* errarg) { - qse_awk_seterror (awk, errnum, errarg, 0); + qse_awk_seterror (awk, errnum, errarg, QSE_NULL); } void qse_awk_seterrinf (qse_awk_t* awk, const qse_awk_errinf_t* errinf) @@ -217,10 +217,11 @@ void qse_awk_seterrinf (qse_awk_t* awk, const qse_awk_errinf_t* errinf) void qse_awk_seterror ( qse_awk_t* awk, qse_awk_errnum_t errnum, const qse_cstr_t* errarg, - qse_size_t errlin) + const qse_awk_loc_t* errloc) { const qse_char_t* errfmt; + QSE_MEMSET (&awk->errinf, 0, QSE_SIZEOF(awk->errinf)); awk->errinf.num = errnum; errfmt = qse_awk_geterrstr(awk)(awk,errnum); @@ -230,7 +231,7 @@ void qse_awk_seterror ( errfmt, errarg ); - awk->errinf.lin = errlin; + if (errloc != QSE_NULL) awk->errinf.loc = *errloc; } qse_awk_errnum_t qse_awk_rtx_geterrnum (qse_awk_rtx_t* rtx) @@ -238,9 +239,9 @@ qse_awk_errnum_t qse_awk_rtx_geterrnum (qse_awk_rtx_t* rtx) return rtx->errinf.num; } -qse_size_t qse_awk_rtx_geterrlin (qse_awk_rtx_t* rtx) +const qse_awk_loc_t* qse_awk_rtx_geterrloc (qse_awk_rtx_t* rtx) { - return rtx->errinf.lin; + return &rtx->errinf.loc; } const qse_char_t* qse_awk_rtx_geterrmsg (qse_awk_rtx_t* rtx) @@ -261,10 +262,10 @@ void qse_awk_rtx_geterrinf (qse_awk_rtx_t* rtx, qse_awk_errinf_t* errinf) void qse_awk_rtx_geterror ( qse_awk_rtx_t* rtx, qse_awk_errnum_t* errnum, - const qse_char_t** errmsg, qse_size_t* errlin) + const qse_char_t** errmsg, qse_awk_loc_t* errloc) { if (errnum != QSE_NULL) *errnum = rtx->errinf.num; - if (errlin != QSE_NULL) *errlin = rtx->errinf.lin; + if (errloc != QSE_NULL) *errloc = rtx->errinf.loc; if (errmsg != QSE_NULL) { *errmsg = (rtx->errinf.msg[0] == QSE_T('\0'))? @@ -285,12 +286,12 @@ 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, const qse_cstr_t* errarg, - qse_size_t errlin) + const qse_awk_loc_t* errloc) { const qse_char_t* errfmt; + QSE_MEMSET (&rtx->errinf, 0, QSE_SIZEOF(rtx->errinf)); rtx->errinf.num = errnum; - rtx->errinf.lin = errlin; errfmt = qse_awk_geterrstr(rtx->awk)(rtx->awk,errnum); QSE_ASSERT (errfmt != QSE_NULL); @@ -298,4 +299,6 @@ void qse_awk_rtx_seterror ( rtx->errinf.msg, QSE_COUNTOF(rtx->errinf.msg), errfmt, errarg ); + + if (errloc != QSE_NULL) rtx->errinf.loc = *errloc; } diff --git a/qse/lib/awk/parse.c b/qse/lib/awk/parse.c index aaea23d3..6ba63de6 100644 --- a/qse/lib/awk/parse.c +++ b/qse/lib/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c 266 2009-08-24 12:15:56Z hyunghwan.chung $ + * $Id: parse.c 267 2009-08-25 09:50:07Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -210,10 +210,10 @@ static qse_awk_nde_t* parse_primary_ident ( qse_awk_t* awk, const qse_awk_loc_t* xloc); static qse_awk_nde_t* parse_hashidx ( - qse_awk_t* awk, qse_char_t* name, qse_size_t name_len, + qse_awk_t* awk, qse_char_t* name, qse_size_t namelen, const qse_awk_loc_t* xloc); static qse_awk_nde_t* parse_fncall ( - qse_awk_t* awk, qse_char_t* name, qse_size_t name_len, + qse_awk_t* awk, qse_char_t* name, qse_size_t namelen, qse_awk_fnc_t* fnc, const qse_awk_loc_t* xloc, int noarg); static int get_token (qse_awk_t* awk); @@ -238,7 +238,7 @@ typedef struct kwent_t kwent_t; struct kwent_t { const qse_char_t* name; - qse_size_t name_len; + qse_size_t namelen; int type; int valid; /* the entry is valid when this option is set */ }; @@ -278,7 +278,7 @@ typedef struct global_t global_t; struct global_t { const qse_char_t* name; - qse_size_t name_len; + qse_size_t namelen; int valid; }; @@ -344,7 +344,7 @@ static global_t gtab[] = do { \ if (qse_str_ccat((tok)->name,(c)) == (qse_size_t)-1) \ { \ - qse_awk_seterror (awk, QSE_AWK_ENOMEM, QSE_NULL, (tok)->loc.lin); \ + qse_awk_seterror (awk, QSE_AWK_ENOMEM, QSE_NULL, &(tok)->loc); \ return -1; \ } \ } while (0) @@ -353,7 +353,7 @@ static global_t gtab[] = do { \ if (qse_str_ncat((tok)->name,(s),(l)) == (qse_size_t)-1) \ { \ - qse_awk_seterror (awk, QSE_AWK_ENOMEM, QSE_NULL, (tok)->loc.lin); \ + qse_awk_seterror (awk, QSE_AWK_ENOMEM, QSE_NULL, &(tok)->loc); \ return -1; \ } \ } while (0) @@ -372,31 +372,30 @@ static global_t gtab[] = #define ISNOERR(awk) ((awk)->errinf.num == QSE_AWK_ENOERR) #define CLRERR(awk) \ - qse_awk_seterror (awk, QSE_AWK_ENOERR, QSE_NULL, 0) + qse_awk_seterror (awk, QSE_AWK_ENOERR, QSE_NULL, QSE_NULL) #define SETERR_TOK(awk,code) \ do { \ qse_cstr_t __ea; \ __ea.len = QSE_STR_LEN((awk)->tok.name); \ __ea.ptr = QSE_STR_PTR((awk)->tok.name); \ - qse_awk_seterror (awk, code, &__ea, (awk)->tok.loc.lin); \ + qse_awk_seterror (awk, code, &__ea, &(awk)->tok.loc); \ } while (0) - #define SETERR_COD(awk,code) \ - qse_awk_seterror (awk, code, QSE_NULL, 0) + qse_awk_seterror (awk, code, QSE_NULL, QSE_NULL) -#define SETERR_LOC(awk,code,line) \ - qse_awk_seterror (awk, code, QSE_NULL, line) +#define SETERR_LOC(awk,code,loc) \ + qse_awk_seterror (awk, code, QSE_NULL, loc) -#define SETERR_ARG_LOC(awk,code,ep,el,line) \ +#define SETERR_ARG_LOC(awk,code,ep,el,loc) \ do { \ qse_cstr_t __ea; \ __ea.len = (el); __ea.ptr = (ep); \ - qse_awk_seterror ((awk), (code), &__ea, (line)); \ + qse_awk_seterror ((awk), (code), &__ea, (loc)); \ } while (0) -#define SETERR_ARG(awk,code,ep,el) SETERR_ARG_LOC(awk,code,ep,el,0) +#define SETERR_ARG(awk,code,ep,el) SETERR_ARG_LOC(awk,code,ep,el,QSE_NULL) static int get_char (qse_awk_t* awk) { @@ -478,7 +477,7 @@ qse_cstr_t* qse_awk_getkw (qse_awk_t* awk, int id, qse_cstr_t* s) qse_map_pair_t* p; s->ptr = kwtab[id].name; - s->len = kwtab[id].name_len; + s->len = kwtab[id].namelen; p = qse_map_search (awk->wtab, s->ptr, s->len); if (p != QSE_NULL) @@ -557,7 +556,7 @@ static int parse (qse_awk_t* awk) QSE_AWK_EFUNNF, QSE_MAP_KPTR(p), QSE_MAP_KLEN(p), - call->line + &call->loc ); goto oops; } @@ -640,6 +639,7 @@ int qse_awk_parse (qse_awk_t* awk, qse_awk_sio_t* sio) QSE_ASSERT (awk->parse.depth.cur.expr == 0); qse_awk_clear (awk); + qse_map_clear (awk->sio.names); awk->sio.inf = sio->in; awk->sio.outf = sio->out; @@ -665,7 +665,7 @@ static int begin_include (qse_awk_t* awk) QSE_AWK_EIONMNL, QSE_STR_PTR(awk->tok.name), qse_strlen(QSE_STR_PTR(awk->tok.name)), - awk->tok.loc.lin + &awk->tok.loc ); return -1; } @@ -679,7 +679,7 @@ static int begin_include (qse_awk_t* awk) ); if (pair == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, awk->ptok.loc.lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, &awk->ptok.loc); goto oops; } @@ -689,7 +689,7 @@ static int begin_include (qse_awk_t* awk) arg = (qse_awk_sio_arg_t*) QSE_MMGR_ALLOC (awk->mmgr, QSE_SIZEOF(*arg)); if (arg == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, awk->ptok.loc.lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, &awk->ptok.loc); goto oops; } @@ -701,7 +701,7 @@ static int begin_include (qse_awk_t* awk) if (op <= -1) { if (ISNOERR(awk)) SETERR_TOK (awk, QSE_AWK_EOPEN); - else awk->errinf.lin = awk->tok.loc.lin; /* adjust error line */ + else awk->errinf.loc = awk->tok.loc; /* adjust error location */ goto oops; } @@ -712,7 +712,7 @@ static int begin_include (qse_awk_t* awk) if (op != 0) { if (ISNOERR(awk)) SETERR_TOK (awk, QSE_AWK_ECLOSE); - else awk->errinf.lin = awk->tok.loc.lin; + else awk->errinf.loc = awk->tok.loc; goto oops; } } @@ -812,7 +812,8 @@ retry: if (awk->parse.depth.max.incl > 0 && awk->parse.depth.cur.incl >= awk->parse.depth.max.incl) { - SETERR_LOC (awk, QSE_AWK_EINCLTD, awk->ptok.loc.lin); + SETERR_LOC ( + awk, QSE_AWK_EINCLTD, &awk->ptok.loc); return QSE_NULL; } @@ -820,7 +821,8 @@ retry: if (!MATCH(awk,TOK_STR)) { - SETERR_LOC (awk, QSE_AWK_EINCLSTR, awk->ptok.loc.lin); + SETERR_LOC ( + awk, QSE_AWK_EINCLSTR, &awk->ptok.loc); return QSE_NULL; } @@ -862,7 +864,7 @@ retry: { /* when QSE_AWK_NEWLINE is set, * BEGIN and { should be located on the same line */ - SETERR_LOC (awk, QSE_AWK_EBLKBEG, awk->ptok.loc.lin); + SETERR_LOC (awk, QSE_AWK_EBLKBEG, &awk->ptok.loc); return QSE_NULL; } @@ -890,7 +892,7 @@ retry: { /* when QSE_AWK_NEWLINE is set, * END and { should be located on the same line */ - SETERR_LOC (awk, QSE_AWK_EBLKEND, awk->ptok.loc.lin); + SETERR_LOC (awk, QSE_AWK_EBLKEND, &awk->ptok.loc); return QSE_NULL; } @@ -968,7 +970,7 @@ retry: { /* blockless pattern */ qse_bool_t newline = MATCH(awk,TOK_NEWLINE); - qse_size_t tline = awk->ptok.loc.lin; + qse_awk_loc_t ploc = awk->ptok.loc; awk->parse.id.block = PARSE_ACTION_BLOCK; if (parse_action_block (awk, ptn, QSE_TRUE) == QSE_NULL) @@ -994,7 +996,7 @@ retry: /* blockless pattern requires QSE_AWK_RIO * to be ON because the implicit block is * "print $0" */ - SETERR_LOC (awk, QSE_AWK_ENOSUP, tline); + SETERR_LOC (awk, QSE_AWK_ENOSUP, &ploc); return QSE_NULL; } } @@ -1023,8 +1025,8 @@ retry: static qse_awk_nde_t* parse_function (qse_awk_t* awk) { qse_char_t* name; - qse_char_t* name_dup; - qse_size_t name_len; + qse_char_t* namedup; + qse_size_t namelen; qse_awk_nde_t* body; qse_awk_fun_t* fun; qse_size_t nargs, g; @@ -1043,50 +1045,54 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) } name = QSE_STR_PTR(awk->tok.name); - name_len = QSE_STR_LEN(awk->tok.name); + namelen = QSE_STR_LEN(awk->tok.name); /* check if it is a builtin function */ - if (qse_awk_getfnc (awk, name, name_len) != QSE_NULL) + if (qse_awk_getfnc (awk, name, namelen) != QSE_NULL) { - SETERR_ARG_LOC (awk, QSE_AWK_EFNCRED, name, name_len, awk->tok.loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFNCRED, name, namelen, &awk->tok.loc); return QSE_NULL; } /* check if it has already been defined as a function */ - if (qse_map_search (awk->tree.funs, name, name_len) != QSE_NULL) + if (qse_map_search (awk->tree.funs, name, namelen) != QSE_NULL) { /* the function is defined previously */ - SETERR_ARG_LOC (awk, QSE_AWK_EFUNRED, name, name_len, awk->tok.loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFUNRED, name, namelen, &awk->tok.loc); return QSE_NULL; } /* check if it conflicts with a named variable */ - if (qse_map_search (awk->parse.named, name, name_len) != QSE_NULL) + if (qse_map_search (awk->parse.named, name, namelen) != QSE_NULL) { - SETERR_ARG_LOC (awk, QSE_AWK_EVARRED, name, name_len, awk->tok.loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EVARRED, name, namelen, &awk->tok.loc); return QSE_NULL; } /* check if it coincides to be a global variable name */ - g = find_global (awk, name, name_len); + g = find_global (awk, name, namelen); if (g != QSE_LDA_NIL) { - SETERR_ARG_LOC (awk, QSE_AWK_EGBLRED, name, name_len, awk->tok.loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EGBLRED, name, namelen, &awk->tok.loc); return QSE_NULL; } /* clone the function name before it is overwritten */ - name_dup = QSE_AWK_STRXDUP (awk, name, name_len); - if (name_dup == QSE_NULL) + namedup = QSE_AWK_STRXDUP (awk, name, namelen); + if (namedup == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, awk->tok.loc.lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, &awk->tok.loc); return QSE_NULL; } /* get the next token */ if (get_token(awk) <= -1) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); return QSE_NULL; } @@ -1094,7 +1100,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (!MATCH(awk,TOK_LPAREN)) { /* a function name is not followed by a left parenthesis */ - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); SETERR_TOK (awk, QSE_AWK_ELPAREN); return QSE_NULL; } @@ -1102,7 +1108,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) /* get the next token */ if (get_token(awk) <= -1) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); return QSE_NULL; } @@ -1115,7 +1121,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) /* no function parameter found. get the next token */ if (get_token(awk) <= -1) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); return QSE_NULL; } } @@ -1123,19 +1129,19 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) { while (1) { - qse_char_t* param; - qse_size_t param_len; + qse_char_t* pa; + qse_size_t pal; if (!MATCH(awk,TOK_IDENT)) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); SETERR_TOK (awk, QSE_AWK_EBADPAR); return QSE_NULL; } - param = QSE_STR_PTR(awk->tok.name); - param_len = QSE_STR_LEN(awk->tok.name); + pa = QSE_STR_PTR(awk->tok.name); + pal = QSE_STR_LEN(awk->tok.name); /* NOTE: the following is not a conflict. * so the parameter is not checked against @@ -1149,41 +1155,41 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) * name or other parameters */ if (((awk->option & QSE_AWK_STRICTNAMING) && qse_strxncmp ( - param, param_len, name_dup, name_len) == 0) || + pa, pal, namedup, namelen) == 0) || qse_lda_search (awk->parse.params, - 0, param, param_len) != QSE_LDA_NIL) + 0, pa, pal) != QSE_LDA_NIL) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); - - SETERR_ARG_LOC (awk, QSE_AWK_EDUPPAR, param, param_len, awk->tok.loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EDUPPAR, + pa, pal, &awk->tok.loc); return QSE_NULL; } /* push the parameter to the parameter list */ if (QSE_LDA_SIZE(awk->parse.params) >= QSE_AWK_MAX_PARAMS) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); - SETERR_LOC (awk, QSE_AWK_EPARTM, awk->tok.loc.lin); + SETERR_LOC (awk, QSE_AWK_EPARTM, &awk->tok.loc); return QSE_NULL; } if (qse_lda_insert ( awk->parse.params, QSE_LDA_SIZE(awk->parse.params), - param, param_len) == QSE_LDA_NIL) + pa, pal) == QSE_LDA_NIL) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); - - SETERR_LOC (awk, QSE_AWK_ENOMEM, awk->tok.loc.lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, &awk->tok.loc); return QSE_NULL; } if (get_token (awk) <= -1) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); return QSE_NULL; } @@ -1192,9 +1198,8 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (!MATCH(awk,TOK_COMMA)) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); - SETERR_TOK (awk, QSE_AWK_ECOMMA); return QSE_NULL; } @@ -1203,7 +1208,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) { if (get_token(awk) <= -1) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); return QSE_NULL; } @@ -1213,7 +1218,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (get_token(awk) <= -1) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); return QSE_NULL; } @@ -1227,7 +1232,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) { if (get_token(awk) <= -1) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); return QSE_NULL; } @@ -1236,7 +1241,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) /* check if the function body starts with a left brace */ if (!MATCH(awk,TOK_LBRACE)) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); SETERR_TOK (awk, QSE_AWK_ELBRACE); @@ -1244,15 +1249,15 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) } if (get_token(awk) <= -1) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); return QSE_NULL; } /* remember the current function name so that the body parser * can know the name of the current function being parsed */ - awk->tree.cur_fun.ptr = name_dup; - awk->tree.cur_fun.len = name_len; + awk->tree.cur_fun.ptr = namedup; + awk->tree.cur_fun.len = namelen; /* actual function body */ { @@ -1266,7 +1271,7 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) if (body == QSE_NULL) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_lda_clear (awk->parse.params); return QSE_NULL; } @@ -1280,10 +1285,9 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) fun = (qse_awk_fun_t*) QSE_AWK_ALLOC (awk, QSE_SIZEOF(qse_awk_fun_t)); if (fun == QSE_NULL) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_awk_clrpt (awk, body); - - SETERR_LOC (awk, QSE_AWK_ENOMEM, awk->tok.loc.lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, &awk->tok.loc); return QSE_NULL; } @@ -1292,17 +1296,16 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) fun->nargs = nargs; fun->body = body; - pair = qse_map_insert (awk->tree.funs, name_dup, name_len, fun, 0); + pair = qse_map_insert (awk->tree.funs, namedup, namelen, fun, 0); if (pair == QSE_NULL) { /* if qse_map_insert() fails for other reasons than memory * shortage, there should be implementaion errors as duplicate * functions are detected earlier in this function */ - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); qse_awk_clrpt (awk, body); QSE_AWK_FREE (awk, fun); - - SETERR_LOC (awk, QSE_AWK_ENOMEM, awk->tok.loc.lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, &awk->tok.loc); return QSE_NULL; } @@ -1310,10 +1313,10 @@ static qse_awk_nde_t* parse_function (qse_awk_t* awk) * of the pair */ fun->name.ptr = QSE_MAP_KPTR(pair); fun->name.len = QSE_MAP_KLEN(pair); - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); /* remove an undefined function call entry from the parse.fun table */ - qse_map_delete (awk->parse.funs, fun->name.ptr, name_len); + qse_map_delete (awk->parse.funs, fun->name.ptr, namelen); return body; } @@ -1387,7 +1390,7 @@ static qse_awk_chain_t* parse_action_block ( if (chain == QSE_NULL) { qse_awk_clrpt (awk, nde); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc.lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, &xloc); return QSE_NULL; } @@ -1470,9 +1473,7 @@ static qse_awk_nde_t* parse_block ( awk->parse.lcls, nlcls, QSE_LDA_SIZE(awk->parse.lcls) - nlcls); if (head != QSE_NULL) qse_awk_clrpt (awk, head); - - /*SETERR_LOC (awk, QSE_AWK_EEOF, awk->ptok.loc.lin);*/ - SETERR_LOC (awk, QSE_AWK_EEOF, awk->tok.loc.lin); + SETERR_LOC (awk, QSE_AWK_EEOF, &awk->tok.loc); return QSE_NULL; } @@ -1533,8 +1534,7 @@ static qse_awk_nde_t* parse_block ( awk->parse.lcls, nlcls, QSE_LDA_SIZE(awk->parse.lcls)-nlcls); qse_awk_clrpt (awk, head); - - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } @@ -1548,7 +1548,7 @@ static qse_awk_nde_t* parse_block ( /* if (head == QSE_NULL) tmp = 0; */ block->type = QSE_AWK_NDE_BLK; - block->line = xloc->lin; + block->loc = *xloc; block->next = QSE_NULL; block->body = head; @@ -1579,7 +1579,7 @@ static qse_awk_nde_t* parse_block_dc ( if (awk->parse.depth.max.block > 0 && awk->parse.depth.cur.block >= awk->parse.depth.max.block) { - SETERR_LOC (awk, QSE_AWK_EBLKNST, xloc->lin); + SETERR_LOC (awk, QSE_AWK_EBLKNST, xloc); return QSE_NULL; } @@ -1609,7 +1609,7 @@ int qse_awk_initgbls (qse_awk_t* awk) awk->parse.gbls, QSE_LDA_SIZE(awk->parse.gbls), (qse_char_t*)gtab[id].name, - gtab[id].name_len); + gtab[id].namelen); if (g == QSE_LDA_NIL) return -1; QSE_ASSERT ((int)g == id); @@ -1639,7 +1639,7 @@ static void adjust_static_globals (qse_awk_t* awk) } else { - QSE_LDA_DLEN(awk->parse.gbls,id) = gtab[id].name_len; + QSE_LDA_DLEN(awk->parse.gbls,id) = gtab[id].namelen; } } } @@ -1716,26 +1716,25 @@ static int add_global ( qse_awk_loc_t* xloc, int disabled) { qse_size_t ngbls; - qse_size_t line = (xloc == QSE_NULL)? 0: xloc->lin; /* check if it is a keyword */ if (classify_ident (awk, name, len) != TOK_IDENT) { - SETERR_ARG_LOC (awk, QSE_AWK_EKWRED, name, len, line); + SETERR_ARG_LOC (awk, QSE_AWK_EKWRED, name, len, xloc); return -1; } /* check if it conflicts with a builtin function name */ if (qse_awk_getfnc (awk, name, len) != QSE_NULL) { - SETERR_ARG_LOC (awk, QSE_AWK_EFNCRED, name, len, line); + SETERR_ARG_LOC (awk, QSE_AWK_EFNCRED, name, len, xloc); return -1; } /* check if it conflicts with a function name */ if (qse_map_search (awk->tree.funs, name, len) != QSE_NULL) { - SETERR_ARG_LOC (awk, QSE_AWK_EFUNRED, name, len, line); + SETERR_ARG_LOC (awk, QSE_AWK_EFUNRED, name, len, xloc); return -1; } @@ -1743,14 +1742,14 @@ static int add_global ( * caught in the function call table */ if (qse_map_search (awk->parse.funs, name, len) != QSE_NULL) { - SETERR_ARG_LOC (awk, QSE_AWK_EFUNRED, name, len, line); + SETERR_ARG_LOC (awk, QSE_AWK_EFUNRED, name, len, xloc); return -1; } /* check if it conflicts with other global variable names */ if (find_global (awk, name, len) != QSE_LDA_NIL) { - SETERR_ARG_LOC (awk, QSE_AWK_EDUPGBL, name, len, line); + SETERR_ARG_LOC (awk, QSE_AWK_EDUPGBL, name, len, xloc); return -1; } @@ -1763,7 +1762,7 @@ static int add_global ( */ if (qse_map_search (awk->parse.named, name, len) != QSE_NULL) { - SETERR_ARG_LOC (awk, QSE_AWK_EVARRED, name, len, line); + SETERR_ARG_LOC (awk, QSE_AWK_EVARRED, name, len, xloc); return -1; } #endif @@ -1771,7 +1770,7 @@ static int add_global ( ngbls = QSE_LDA_SIZE (awk->parse.gbls); if (ngbls >= QSE_AWK_MAX_GBLS) { - SETERR_LOC (awk, QSE_AWK_EGBLTM, line); + SETERR_LOC (awk, QSE_AWK_EGBLTM, xloc); return -1; } @@ -1779,7 +1778,7 @@ static int add_global ( QSE_LDA_SIZE(awk->parse.gbls), (qse_char_t*)name, len) == QSE_LDA_NIL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, line); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return -1; } @@ -1945,7 +1944,9 @@ static qse_awk_t* collect_locals ( * function f() { local length; } */ if (qse_awk_getfnc (awk, lcl.ptr, lcl.len) != QSE_NULL) { - SETERR_ARG_LOC (awk, QSE_AWK_EFNCRED, lcl.ptr, lcl.len, awk->tok.loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFNCRED, + lcl.ptr, lcl.len, &awk->tok.loc); return QSE_NULL; } @@ -1958,7 +1959,9 @@ static qse_awk_t* collect_locals ( awk->parse.params, 0, lcl.ptr, lcl.len); if (n != QSE_LDA_NIL) { - SETERR_ARG_LOC (awk, QSE_AWK_EPARRED, lcl.ptr, lcl.len, awk->tok.loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EPARRED, + lcl.ptr, lcl.len, &awk->tok.loc); return QSE_NULL; } } @@ -1973,7 +1976,9 @@ static qse_awk_t* collect_locals ( awk->tree.cur_fun.ptr, awk->tree.cur_fun.len) == 0) { - SETERR_ARG_LOC (awk, QSE_AWK_EFUNRED, lcl.ptr, lcl.len, awk->tok.loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFUNRED, + lcl.ptr, lcl.len, &awk->tok.loc); return QSE_NULL; } } @@ -1986,7 +1991,9 @@ static qse_awk_t* collect_locals ( lcl.ptr, lcl.len); if (n != QSE_LDA_NIL) { - SETERR_ARG_LOC (awk, QSE_AWK_EDUPLCL, lcl.ptr, lcl.len, awk->tok.loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EDUPLCL, + lcl.ptr, lcl.len, &awk->tok.loc); return QSE_NULL; } @@ -1998,14 +2005,16 @@ static qse_awk_t* collect_locals ( { /* it is a conflict only if it is one of a * static global variable */ - SETERR_ARG_LOC (awk, QSE_AWK_EDUPLCL, lcl.ptr, lcl.len, awk->tok.loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EDUPLCL, + lcl.ptr, lcl.len, &awk->tok.loc); return QSE_NULL; } } if (QSE_LDA_SIZE(awk->parse.lcls) >= QSE_AWK_MAX_LCLS) { - SETERR_LOC (awk, QSE_AWK_ELCLTM, awk->tok.loc.lin); + SETERR_LOC (awk, QSE_AWK_ELCLTM, &awk->tok.loc); return QSE_NULL; } @@ -2014,7 +2023,7 @@ static qse_awk_t* collect_locals ( QSE_LDA_SIZE(awk->parse.lcls), lcl.ptr, lcl.len) == QSE_LDA_NIL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, awk->tok.loc.lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, &awk->tok.loc); return QSE_NULL; } @@ -2129,12 +2138,12 @@ static qse_awk_nde_t* parse_if (qse_awk_t* awk, const qse_awk_loc_t* xloc) qse_awk_clrpt (awk, else_part); qse_awk_clrpt (awk, then_part); qse_awk_clrpt (awk, test); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_IF; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->test = test; nde->then_part = then_part; @@ -2190,12 +2199,12 @@ static qse_awk_nde_t* parse_while (qse_awk_t* awk, const qse_awk_loc_t* xloc) { qse_awk_clrpt (awk, body); qse_awk_clrpt (awk, test); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_WHILE; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->test = test; nde->body = body; @@ -2265,12 +2274,12 @@ static qse_awk_nde_t* parse_for (qse_awk_t* awk, const qse_awk_loc_t* xloc) { qse_awk_clrpt (awk, init); qse_awk_clrpt (awk, body); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde2->type = QSE_AWK_NDE_FOREACH; - nde2->line = xloc->lin; + nde2->loc = *xloc; nde2->next = QSE_NULL; nde2->test = init; nde2->body = body; @@ -2387,12 +2396,12 @@ static qse_awk_nde_t* parse_for (qse_awk_t* awk, const qse_awk_loc_t* xloc) qse_awk_clrpt (awk, test); qse_awk_clrpt (awk, incr); qse_awk_clrpt (awk, body); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_FOR; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->init = init; nde->test = test; @@ -2485,12 +2494,12 @@ static qse_awk_nde_t* parse_dowhile (qse_awk_t* awk, const qse_awk_loc_t* xloc) qse_awk_clrpt (awk, body); qse_awk_clrpt (awk, test); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_DOWHILE; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->test = test; nde->body = body; @@ -2505,7 +2514,7 @@ static qse_awk_nde_t* parse_break (qse_awk_t* awk, const qse_awk_loc_t* xloc) QSE_ASSERT (awk->ptok.type == TOK_BREAK); if (awk->parse.depth.cur.loop <= 0) { - SETERR_LOC (awk, QSE_AWK_EBREAK, xloc->lin); + SETERR_LOC (awk, QSE_AWK_EBREAK, xloc); return QSE_NULL; } @@ -2513,12 +2522,12 @@ static qse_awk_nde_t* parse_break (qse_awk_t* awk, const qse_awk_loc_t* xloc) QSE_AWK_ALLOC (awk, QSE_SIZEOF(qse_awk_nde_break_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_BREAK; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; return (qse_awk_nde_t*)nde; @@ -2531,7 +2540,7 @@ static qse_awk_nde_t* parse_continue (qse_awk_t* awk, const qse_awk_loc_t* xloc) QSE_ASSERT (awk->ptok.type == TOK_CONTINUE); if (awk->parse.depth.cur.loop <= 0) { - SETERR_LOC (awk, QSE_AWK_ECONTINUE, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ECONTINUE, xloc); return QSE_NULL; } @@ -2539,12 +2548,12 @@ static qse_awk_nde_t* parse_continue (qse_awk_t* awk, const qse_awk_loc_t* xloc) QSE_AWK_ALLOC (awk, QSE_SIZEOF(qse_awk_nde_continue_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_CONTINUE; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; return (qse_awk_nde_t*)nde; @@ -2561,12 +2570,12 @@ static qse_awk_nde_t* parse_return (qse_awk_t* awk, const qse_awk_loc_t* xloc) awk, QSE_SIZEOF(qse_awk_nde_return_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_RETURN; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; if (MATCH_TERMINATOR(awk)) @@ -2600,12 +2609,12 @@ static qse_awk_nde_t* parse_exit (qse_awk_t* awk, const qse_awk_loc_t* xloc) QSE_AWK_ALLOC (awk, QSE_SIZEOF(qse_awk_nde_exit_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_EXIT; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; if (MATCH_TERMINATOR(awk)) @@ -2636,12 +2645,12 @@ static qse_awk_nde_t* parse_next (qse_awk_t* awk, const qse_awk_loc_t* xloc) if (awk->parse.id.block == PARSE_BEGIN_BLOCK) { - SETERR_LOC (awk, QSE_AWK_ENEXTBEG, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENEXTBEG, xloc); return QSE_NULL; } if (awk->parse.id.block == PARSE_END_BLOCK) { - SETERR_LOC (awk, QSE_AWK_ENEXTEND, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENEXTEND, xloc); return QSE_NULL; } @@ -2649,11 +2658,11 @@ static qse_awk_nde_t* parse_next (qse_awk_t* awk, const qse_awk_loc_t* xloc) QSE_AWK_ALLOC (awk, QSE_SIZEOF(qse_awk_nde_next_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_NEXT; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; return (qse_awk_nde_t*)nde; @@ -2666,12 +2675,12 @@ static qse_awk_nde_t* parse_nextfile ( if (!out && awk->parse.id.block == PARSE_BEGIN_BLOCK) { - SETERR_LOC (awk, QSE_AWK_ENEXTFBEG, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENEXTFBEG, xloc); return QSE_NULL; } if (!out && awk->parse.id.block == PARSE_END_BLOCK) { - SETERR_LOC (awk, QSE_AWK_ENEXTFEND, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENEXTFEND, xloc); return QSE_NULL; } @@ -2679,12 +2688,12 @@ static qse_awk_nde_t* parse_nextfile ( QSE_AWK_ALLOC (awk, QSE_SIZEOF(qse_awk_nde_nextfile_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_NEXTFILE; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->out = out; @@ -2712,7 +2721,7 @@ static qse_awk_nde_t* parse_delete (qse_awk_t* awk, const qse_awk_loc_t* xloc) { /* a normal identifier is expected */ qse_awk_clrpt (awk, var); - SETERR_LOC (awk, QSE_AWK_EDELETE, dloc.lin); + SETERR_LOC (awk, QSE_AWK_EDELETE, &dloc); return QSE_NULL; } @@ -2720,12 +2729,12 @@ static qse_awk_nde_t* parse_delete (qse_awk_t* awk, const qse_awk_loc_t* xloc) awk, QSE_SIZEOF(qse_awk_nde_delete_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_DELETE; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->var = var; @@ -2754,7 +2763,7 @@ static qse_awk_nde_t* parse_reset (qse_awk_t* awk, const qse_awk_loc_t* xloc) { /* a normal identifier is expected */ qse_awk_clrpt (awk, var); - SETERR_LOC (awk, QSE_AWK_ERESET, rloc.lin); + SETERR_LOC (awk, QSE_AWK_ERESET, &rloc); return QSE_NULL; } @@ -2762,12 +2771,12 @@ static qse_awk_nde_t* parse_reset (qse_awk_t* awk, const qse_awk_loc_t* xloc) awk, QSE_SIZEOF(qse_awk_nde_reset_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_RESET; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->var = var; @@ -2927,7 +2936,7 @@ static qse_awk_nde_t* parse_print ( { if (args != QSE_NULL) qse_awk_clrpt (awk, args); if (out != QSE_NULL) qse_awk_clrpt (awk, out); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } @@ -2938,12 +2947,12 @@ static qse_awk_nde_t* parse_print ( if (type == QSE_AWK_NDE_PRINTF && args == QSE_NULL) { if (out != QSE_NULL) qse_awk_clrpt (awk, out); - SETERR_LOC (awk, QSE_AWK_EPRINTFARG, xloc->lin); + SETERR_LOC (awk, QSE_AWK_EPRINTFARG, xloc); return QSE_NULL; } nde->type = type; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->args = args; nde->out_type = out_type; @@ -3076,7 +3085,7 @@ static qse_awk_nde_t* parse_stmt_nb ( else { if (nde != QSE_NULL) qse_awk_clrpt (awk, nde); - SETERR_LOC (awk, QSE_AWK_ESTMEND, awk->ptok.loc.lin); + SETERR_LOC (awk, QSE_AWK_ESTMEND, &awk->ptok.loc); return QSE_NULL; } @@ -3101,12 +3110,12 @@ static qse_awk_nde_t* parse_stmt ( QSE_AWK_ALLOC (awk, QSE_SIZEOF(qse_awk_nde_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_NULL; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; if (get_token(awk) <= -1) @@ -3223,12 +3232,12 @@ static qse_awk_nde_t* parse_expr_basic ( qse_awk_clrpt (awk, nde); qse_awk_clrpt (awk, n1); qse_awk_clrpt (awk, n2); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } tmp->type = QSE_AWK_NDE_CND; - tmp->line = xloc->lin; + tmp->loc = *xloc; tmp->next = QSE_NULL; tmp->test = nde; tmp->left = n1; @@ -3261,7 +3270,7 @@ static qse_awk_nde_t* parse_expr ( if (!is_var(x) && x->type != QSE_AWK_NDE_POS) { qse_awk_clrpt (awk, x); - SETERR_LOC (awk, QSE_AWK_EASSIGN, xloc->lin); + SETERR_LOC (awk, QSE_AWK_EASSIGN, xloc); return QSE_NULL; } @@ -3288,12 +3297,12 @@ static qse_awk_nde_t* parse_expr ( qse_awk_clrpt (awk, x); qse_awk_clrpt (awk, y); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_ASS; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->opcode = opcode; nde->left = x; @@ -3310,7 +3319,7 @@ static qse_awk_nde_t* parse_expr_dc ( if (awk->parse.depth.max.expr > 0 && awk->parse.depth.cur.expr >= awk->parse.depth.max.expr) { - SETERR_LOC (awk, QSE_AWK_EEXPRNST, xloc->lin); + SETERR_LOC (awk, QSE_AWK_EEXPRNST, xloc); return QSE_NULL; } @@ -3376,12 +3385,12 @@ static qse_awk_nde_t* parse_binary ( { qse_awk_clrpt (awk, right); qse_awk_clrpt (awk, left); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_EXP_BIN; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->opcode = opcode; nde->left = left; @@ -3459,7 +3468,7 @@ static qse_awk_nde_t* parse_in ( { qse_awk_clrpt (awk, right); qse_awk_clrpt (awk, left); - SETERR_LOC (awk, QSE_AWK_ENOTVAR, rloc.lin); + SETERR_LOC (awk, QSE_AWK_ENOTVAR, &rloc); return QSE_NULL; } @@ -3469,12 +3478,12 @@ static qse_awk_nde_t* parse_in ( { qse_awk_clrpt (awk, right); qse_awk_clrpt (awk, left); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_EXP_BIN; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->opcode = QSE_AWK_BINOP_IN; nde->left = left; @@ -3623,12 +3632,12 @@ static qse_awk_nde_t* parse_concat ( { qse_awk_clrpt (awk, left); qse_awk_clrpt (awk, right); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_EXP_BIN; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->opcode = QSE_AWK_BINOP_CONCAT; nde->left = left; @@ -3688,7 +3697,7 @@ static qse_awk_nde_t* parse_unary ( if (awk->parse.depth.max.expr > 0 && awk->parse.depth.cur.expr >= awk->parse.depth.max.expr) { - SETERR_LOC (awk, QSE_AWK_EEXPRNST, xloc->lin); + SETERR_LOC (awk, QSE_AWK_EEXPRNST, xloc); return QSE_NULL; } @@ -3708,12 +3717,12 @@ static qse_awk_nde_t* parse_unary ( { qse_awk_clrpt (awk, left); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_EXP_UNR; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->opcode = opcode; nde->left = left; @@ -3752,7 +3761,7 @@ static qse_awk_nde_t* parse_unary_exp ( if (awk->parse.depth.max.expr > 0 && awk->parse.depth.cur.expr >= awk->parse.depth.max.expr) { - SETERR_LOC (awk, QSE_AWK_EEXPRNST, xloc->lin); + SETERR_LOC (awk, QSE_AWK_EEXPRNST, xloc); return QSE_NULL; } @@ -3771,12 +3780,12 @@ static qse_awk_nde_t* parse_unary_exp ( if (nde == QSE_NULL) { qse_awk_clrpt (awk, left); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_EXP_UNR; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->opcode = opcode; nde->left = left; @@ -3817,7 +3826,7 @@ static qse_awk_nde_t* parse_increment ( /* both prefix and postfix increment operator. * not allowed */ qse_awk_clrpt (awk, left); - SETERR_LOC (awk, QSE_AWK_EPREPST, xloc->lin); + SETERR_LOC (awk, QSE_AWK_EPREPST, xloc); return QSE_NULL; } else if (opcode1 == -1 && opcode2 == -1) @@ -3847,7 +3856,7 @@ static qse_awk_nde_t* parse_increment ( if (!is_var(left) && left->type != QSE_AWK_NDE_POS) { qse_awk_clrpt (awk, left); - SETERR_LOC (awk, QSE_AWK_EINCDECOPR, xloc->lin); + SETERR_LOC (awk, QSE_AWK_EINCDECOPR, xloc); return QSE_NULL; } @@ -3856,12 +3865,12 @@ static qse_awk_nde_t* parse_increment ( if (nde == QSE_NULL) { qse_awk_clrpt (awk, left); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = type; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->opcode = opcode; nde->left = left; @@ -3885,12 +3894,12 @@ static qse_awk_nde_t* parse_primary_nogetline ( awk, QSE_SIZEOF(qse_awk_nde_int_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_INT; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->val = qse_awk_strxtolong (awk, QSE_STR_PTR(awk->tok.name), @@ -3926,12 +3935,12 @@ static qse_awk_nde_t* parse_primary_nogetline ( awk, QSE_SIZEOF(qse_awk_nde_real_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_REAL; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->val = qse_awk_strxtoreal (awk, QSE_STR_PTR(awk->tok.name), @@ -3967,12 +3976,12 @@ static qse_awk_nde_t* parse_primary_nogetline ( awk, QSE_SIZEOF(qse_awk_nde_str_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_STR; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->len = QSE_STR_LEN(awk->tok.name); nde->ptr = QSE_AWK_STRXDUP (awk, @@ -3980,7 +3989,7 @@ static qse_awk_nde_t* parse_primary_nogetline ( if (nde->ptr == QSE_NULL) { QSE_AWK_FREE (awk, nde); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } @@ -4012,12 +4021,12 @@ static qse_awk_nde_t* parse_primary_nogetline ( awk, QSE_SIZEOF(qse_awk_nde_rex_t)); if (nde == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_REX; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->len = QSE_STR_LEN(awk->tok.name); @@ -4027,7 +4036,7 @@ static qse_awk_nde_t* parse_primary_nogetline ( if (nde->ptr == QSE_NULL) { QSE_AWK_FREE (awk, nde); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } @@ -4039,8 +4048,7 @@ static qse_awk_nde_t* parse_primary_nogetline ( { QSE_AWK_FREE (awk, nde->ptr); QSE_AWK_FREE (awk, nde); - - SETERR_LOC (awk, errnum, xloc->lin); + SETERR_LOC (awk, errnum, xloc); return QSE_NULL; } @@ -4072,12 +4080,12 @@ static qse_awk_nde_t* parse_primary_nogetline ( if (nde == QSE_NULL) { qse_awk_clrpt (awk, prim); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_POS; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->val = prim; @@ -4172,12 +4180,12 @@ static qse_awk_nde_t* parse_primary_nogetline ( if (tmp == QSE_NULL) { qse_awk_clrpt (awk, nde); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } tmp->type = QSE_AWK_NDE_GRP; - tmp->line = xloc->lin; + tmp->loc = *xloc; tmp->next = QSE_NULL; tmp->body = nde; @@ -4231,12 +4239,12 @@ static qse_awk_nde_t* parse_primary_nogetline ( { if (var != QSE_NULL) qse_awk_clrpt (awk, var); if (in != QSE_NULL) qse_awk_clrpt (awk, in); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_GETLINE; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->var = var; nde->in_type = (in == QSE_NULL)? @@ -4253,7 +4261,7 @@ static qse_awk_nde_t* parse_primary_nogetline ( awk, QSE_AWK_EEXPRNR, QSE_STR_PTR(awk->ptok.name), QSE_STR_LEN(awk->ptok.name), - awk->ptok.loc.lin + &awk->ptok.loc ); } else SETERR_TOK (awk, QSE_AWK_EEXPRNR); @@ -4328,12 +4336,12 @@ static qse_awk_nde_t* parse_primary ( if (nde == QSE_NULL) { qse_awk_clrpt (awk, left); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_GETLINE; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->var = var; nde->in_type = intype; @@ -4349,31 +4357,31 @@ static qse_awk_nde_t* parse_primary ( static qse_awk_nde_t* parse_primary_ident ( qse_awk_t* awk, const qse_awk_loc_t* xloc) { - qse_char_t* name_dup; - qse_size_t name_len; + qse_char_t* namedup; + qse_size_t namelen; qse_awk_fnc_t* fnc; qse_size_t idxa; QSE_ASSERT (MATCH(awk,TOK_IDENT)); - name_dup = QSE_AWK_STRXDUP (awk, + namedup = QSE_AWK_STRXDUP (awk, QSE_STR_PTR(awk->tok.name), QSE_STR_LEN(awk->tok.name)); - if (name_dup == QSE_NULL) + if (namedup == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } - name_len = QSE_STR_LEN(awk->tok.name); + namelen = QSE_STR_LEN(awk->tok.name); if (get_token(awk) <= -1) { - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); return QSE_NULL; } - /* check if name_dup is an intrinsic function name */ - fnc = qse_awk_getfnc (awk, name_dup, name_len); + /* check if namedup is an intrinsic function name */ + fnc = qse_awk_getfnc (awk, namedup, namelen); if (fnc != QSE_NULL) { qse_awk_nde_t* nde; @@ -4385,33 +4393,33 @@ static qse_awk_nde_t* parse_primary_ident ( /* handles a function that assumes () * when () is missing */ nde = parse_fncall ( - awk, name_dup, name_len, fnc, xloc, 1); + awk, namedup, namelen, fnc, xloc, 1); if (nde == QSE_NULL) - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); return (qse_awk_nde_t*)nde; } /* an intrinsic function should be in the form * of the function call */ - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); SETERR_TOK (awk, QSE_AWK_ELPAREN); return QSE_NULL; } - nde = parse_fncall (awk, name_dup, name_len, fnc, xloc, 0); - if (nde == QSE_NULL) QSE_AWK_FREE (awk, name_dup); + nde = parse_fncall (awk, namedup, namelen, fnc, xloc, 0); + if (nde == QSE_NULL) QSE_AWK_FREE (awk, namedup); return (qse_awk_nde_t*)nde; } - /* now we know that name_dup is a normal identifier. */ + /* now we know that namedup is a normal identifier. */ if (MATCH(awk,TOK_LBRACK)) { qse_awk_nde_t* nde; - nde = parse_hashidx (awk, name_dup, name_len, xloc); - if (nde == QSE_NULL) QSE_AWK_FREE (awk, name_dup); + nde = parse_hashidx (awk, namedup, namelen, xloc); + if (nde == QSE_NULL) QSE_AWK_FREE (awk, namedup); return (qse_awk_nde_t*)nde; } - else if ((idxa = qse_lda_rsearch (awk->parse.lcls, QSE_LDA_SIZE(awk->parse.lcls), name_dup, name_len)) != QSE_LDA_NIL) + else if ((idxa = qse_lda_rsearch (awk->parse.lcls, QSE_LDA_SIZE(awk->parse.lcls), namedup, namelen)) != QSE_LDA_NIL) { /* local variable */ @@ -4420,8 +4428,9 @@ static qse_awk_nde_t* parse_primary_ident ( if (MATCH(awk,TOK_LPAREN)) { /* a local variable is not a function */ - SETERR_ARG_LOC (awk, QSE_AWK_EFUNNAME, name_dup, name_len, xloc->lin); - QSE_AWK_FREE (awk, name_dup); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFUNNAME, namedup, namelen, xloc); + QSE_AWK_FREE (awk, namedup); return QSE_NULL; } @@ -4429,23 +4438,23 @@ static qse_awk_nde_t* parse_primary_ident ( awk, QSE_SIZEOF(qse_awk_nde_var_t)); if (nde == QSE_NULL) { - QSE_AWK_FREE (awk, name_dup); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + QSE_AWK_FREE (awk, namedup); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_LCL; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; /*nde->id.name.ptr = QSE_NULL;*/ - nde->id.name.ptr = name_dup; - nde->id.name.len = name_len; + nde->id.name.ptr = namedup; + nde->id.name.len = namelen; nde->id.idxa = idxa; nde->idx = QSE_NULL; return (qse_awk_nde_t*)nde; } - else if ((idxa = qse_lda_search (awk->parse.params, 0, name_dup, name_len)) != QSE_LDA_NIL) + else if ((idxa = qse_lda_search (awk->parse.params, 0, namedup, namelen)) != QSE_LDA_NIL) { /* parameter */ @@ -4454,8 +4463,9 @@ static qse_awk_nde_t* parse_primary_ident ( if (MATCH(awk,TOK_LPAREN)) { /* a parameter is not a function */ - SETERR_ARG_LOC (awk, QSE_AWK_EFUNNAME, name_dup, name_len, xloc->lin); - QSE_AWK_FREE (awk, name_dup); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFUNNAME, namedup, namelen, xloc); + QSE_AWK_FREE (awk, namedup); return QSE_NULL; } @@ -4463,23 +4473,23 @@ static qse_awk_nde_t* parse_primary_ident ( awk, QSE_SIZEOF(qse_awk_nde_var_t)); if (nde == QSE_NULL) { - QSE_AWK_FREE (awk, name_dup); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + QSE_AWK_FREE (awk, namedup); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_ARG; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; /*nde->id.name = QSE_NULL;*/ - nde->id.name.ptr = name_dup; - nde->id.name.len = name_len; + nde->id.name.ptr = namedup; + nde->id.name.len = namelen; nde->id.idxa = idxa; nde->idx = QSE_NULL; return (qse_awk_nde_t*)nde; } - else if ((idxa = get_global (awk, name_dup, name_len)) != QSE_LDA_NIL) + else if ((idxa = get_global (awk, namedup, namelen)) != QSE_LDA_NIL) { /* global variable */ @@ -4488,8 +4498,9 @@ static qse_awk_nde_t* parse_primary_ident ( if (MATCH(awk,TOK_LPAREN)) { /* a global variable is not a function */ - SETERR_ARG_LOC (awk, QSE_AWK_EFUNNAME, name_dup, name_len, xloc->lin); - QSE_AWK_FREE (awk, name_dup); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFUNNAME, namedup, namelen, xloc); + QSE_AWK_FREE (awk, namedup); return QSE_NULL; } @@ -4497,17 +4508,17 @@ static qse_awk_nde_t* parse_primary_ident ( awk, QSE_SIZEOF(qse_awk_nde_var_t)); if (nde == QSE_NULL) { - QSE_AWK_FREE (awk, name_dup); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + QSE_AWK_FREE (awk, namedup); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } nde->type = QSE_AWK_NDE_GBL; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; /*nde->id.name = QSE_NULL;*/ - nde->id.name.ptr = name_dup; - nde->id.name.len = name_len; + nde->id.name.ptr = namedup; + nde->id.name.len = namelen; nde->id.idxa = idxa; nde->idx = QSE_NULL; @@ -4521,18 +4532,20 @@ static qse_awk_nde_t* parse_primary_ident ( if (awk->option & QSE_AWK_IMPLICIT) { if (qse_map_search (awk->parse.named, - name_dup, name_len) != QSE_NULL) + namedup, namelen) != QSE_NULL) { /* a function call conflicts with a named variable */ - SETERR_ARG_LOC (awk, QSE_AWK_EVARRED, name_dup, name_len, xloc->lin); - QSE_AWK_FREE (awk, name_dup); + SETERR_ARG_LOC ( + awk, QSE_AWK_EVARRED, + namedup, namelen, xloc); + QSE_AWK_FREE (awk, namedup); return QSE_NULL; } } nde = parse_fncall ( - awk, name_dup, name_len, QSE_NULL, xloc, 0); - if (nde == QSE_NULL) QSE_AWK_FREE (awk, name_dup); + awk, namedup, namelen, QSE_NULL, xloc, 0); + if (nde == QSE_NULL) QSE_AWK_FREE (awk, namedup); return (qse_awk_nde_t*)nde; } else @@ -4544,8 +4557,8 @@ static qse_awk_nde_t* parse_primary_ident ( awk, QSE_SIZEOF(qse_awk_nde_var_t)); if (nde == QSE_NULL) { - QSE_AWK_FREE (awk, name_dup); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + QSE_AWK_FREE (awk, namedup); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } @@ -4555,9 +4568,11 @@ static qse_awk_nde_t* parse_primary_ident ( /* the name should not conflict with a function name */ /* check if it is a builtin function */ - if (qse_awk_getfnc (awk, name_dup, name_len) != QSE_NULL) + if (qse_awk_getfnc (awk, namedup, namelen) != QSE_NULL) { - SETERR_ARG_LOC (awk, QSE_AWK_EFNCRED, name_dup, name_len, xloc->lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFNCRED, + namedup, namelen, xloc); goto exit_func; } @@ -4565,31 +4580,36 @@ static qse_awk_nde_t* parse_primary_ident ( if (awk->tree.cur_fun.ptr != QSE_NULL) { iscur = (qse_strxncmp ( - awk->tree.cur_fun.ptr, awk->tree.cur_fun.len, - name_dup, name_len) == 0); + awk->tree.cur_fun.ptr, + awk->tree.cur_fun.len, + namedup, namelen) == 0); } - if (iscur || qse_map_search (awk->tree.funs, name_dup, name_len) != QSE_NULL) + if (iscur || qse_map_search (awk->tree.funs, namedup, namelen) != QSE_NULL) { /* the function is defined previously */ - SETERR_ARG_LOC (awk, QSE_AWK_EFUNRED, name_dup, name_len, xloc->lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFUNRED, + namedup, namelen, xloc); goto exit_func; } if (qse_map_search ( awk->parse.funs, - name_dup, name_len) != QSE_NULL) + namedup, namelen) != QSE_NULL) { /* is it one of the function calls found so far? */ - SETERR_ARG_LOC (awk, QSE_AWK_EFUNRED, name_dup, name_len, xloc->lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFUNRED, + namedup, namelen, xloc); goto exit_func; } nde->type = QSE_AWK_NDE_NAMED; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; - nde->id.name.ptr = name_dup; - nde->id.name.len = name_len; + nde->id.name.ptr = namedup; + nde->id.name.len = namelen; nde->id.idxa = (qse_size_t)-1; nde->idx = QSE_NULL; @@ -4597,9 +4617,9 @@ static qse_awk_nde_t* parse_primary_ident ( * for reference */ if (qse_map_upsert ( awk->parse.named, - name_dup, name_len, QSE_NULL, 0) == QSE_NULL) + namedup, namelen, QSE_NULL, 0) == QSE_NULL) { - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); goto exit_func; } @@ -4607,10 +4627,10 @@ static qse_awk_nde_t* parse_primary_ident ( } /* undefined variable */ - SETERR_ARG_LOC (awk, QSE_AWK_EUNDEF, name_dup, name_len, xloc->lin); + SETERR_ARG_LOC (awk, QSE_AWK_EUNDEF, namedup, namelen, xloc); exit_func: - QSE_AWK_FREE (awk, name_dup); + QSE_AWK_FREE (awk, namedup); QSE_AWK_FREE (awk, nde); return QSE_NULL; @@ -4618,7 +4638,7 @@ static qse_awk_nde_t* parse_primary_ident ( } static qse_awk_nde_t* parse_hashidx ( - qse_awk_t* awk, qse_char_t* name, qse_size_t name_len, + qse_awk_t* awk, qse_char_t* name, qse_size_t namelen, const qse_awk_loc_t* xloc) { qse_awk_nde_t* idx, * tmp, * last; @@ -4679,7 +4699,7 @@ static qse_awk_nde_t* parse_hashidx ( if (nde == QSE_NULL) { qse_awk_clrpt (awk, idx); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } @@ -4688,16 +4708,16 @@ static qse_awk_nde_t* parse_hashidx ( awk->parse.lcls, QSE_LDA_SIZE(awk->parse.lcls), name, - name_len + namelen ); if (idxa != QSE_LDA_NIL) { nde->type = QSE_AWK_NDE_LCLIDX; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; /*nde->id.name = QSE_NULL; */ nde->id.name.ptr = name; - nde->id.name.len = name_len; + nde->id.name.len = namelen; nde->id.idxa = idxa; nde->idx = idx; @@ -4705,15 +4725,15 @@ static qse_awk_nde_t* parse_hashidx ( } /* search the parameter name list */ - idxa = qse_lda_search (awk->parse.params, 0, name, name_len); + idxa = qse_lda_search (awk->parse.params, 0, name, namelen); if (idxa != QSE_LDA_NIL) { nde->type = QSE_AWK_NDE_ARGIDX; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; /*nde->id.name = QSE_NULL; */ nde->id.name.ptr = name; - nde->id.name.len = name_len; + nde->id.name.len = namelen; nde->id.idxa = idxa; nde->idx = idx; @@ -4721,15 +4741,15 @@ static qse_awk_nde_t* parse_hashidx ( } /* gets the global variable index */ - idxa = get_global (awk, name, name_len); + idxa = get_global (awk, name, namelen); if (idxa != QSE_LDA_NIL) { nde->type = QSE_AWK_NDE_GBLIDX; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; /*nde->id.name = QSE_NULL;*/ nde->id.name.ptr = name; - nde->id.name.len = name_len; + nde->id.name.len = namelen; nde->id.idxa = idxa; nde->idx = idx; @@ -4741,9 +4761,10 @@ static qse_awk_nde_t* parse_hashidx ( qse_bool_t iscur = QSE_FALSE; /* check if it is a builtin function */ - if (qse_awk_getfnc (awk, name, name_len) != QSE_NULL) + if (qse_awk_getfnc (awk, name, namelen) != QSE_NULL) { - SETERR_ARG_LOC (awk, QSE_AWK_EFNCRED, name, name_len, xloc->lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFNCRED, name, namelen, xloc); goto exit_func; } @@ -4752,29 +4773,31 @@ static qse_awk_nde_t* parse_hashidx ( { iscur = (qse_strxncmp ( awk->tree.cur_fun.ptr, awk->tree.cur_fun.len, - name, name_len) == 0); + name, namelen) == 0); } - if (iscur || qse_map_search (awk->tree.funs, name, name_len) != QSE_NULL) + if (iscur || qse_map_search (awk->tree.funs, name, namelen) != QSE_NULL) { /* the function is defined previously */ - SETERR_ARG_LOC (awk, QSE_AWK_EFUNRED, name, name_len, xloc->lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFUNRED, name, namelen, xloc); goto exit_func; } if (qse_map_search ( - awk->parse.funs, name, name_len) != QSE_NULL) + awk->parse.funs, name, namelen) != QSE_NULL) { /* is it one of the function calls found so far? */ - SETERR_ARG_LOC (awk, QSE_AWK_EFUNRED, name, name_len, xloc->lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_EFUNRED, name, namelen, xloc); goto exit_func; } nde->type = QSE_AWK_NDE_NAMEDIDX; - nde->line = xloc->lin; + nde->loc = *xloc; nde->next = QSE_NULL; nde->id.name.ptr = name; - nde->id.name.len = name_len; + nde->id.name.len = namelen; nde->id.idxa = (qse_size_t)-1; nde->idx = idx; @@ -4782,7 +4805,7 @@ static qse_awk_nde_t* parse_hashidx ( } /* undefined variable */ - SETERR_ARG_LOC (awk, QSE_AWK_EUNDEF, name, name_len, xloc->lin); + SETERR_ARG_LOC (awk, QSE_AWK_EUNDEF, name, namelen, xloc); exit_func: @@ -4793,7 +4816,7 @@ exit_func: } static qse_awk_nde_t* parse_fncall ( - qse_awk_t* awk, qse_char_t* name, qse_size_t name_len, + qse_awk_t* awk, qse_char_t* name, qse_size_t namelen, qse_awk_fnc_t* fnc, const qse_awk_loc_t* xloc, int noarg) { qse_awk_nde_t* head, * curr, * nde; @@ -4872,19 +4895,19 @@ make_node: if (call == QSE_NULL) { if (head != QSE_NULL) qse_awk_clrpt (awk, head); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } if (fnc != QSE_NULL) { call->type = QSE_AWK_NDE_FNC; - call->line = xloc->lin; + call->loc = *xloc; call->next = QSE_NULL; /*call->what.fnc = fnc; */ call->what.fnc.name.ptr = name; - call->what.fnc.name.len = name_len; + call->what.fnc.name.len = namelen; /* NOTE: oname is the original as in the fnc table. * it would not duplicated here and not freed in @@ -4905,21 +4928,21 @@ make_node: else { call->type = QSE_AWK_NDE_FUN; - call->line = xloc->lin; + call->loc = *xloc; call->next = QSE_NULL; call->what.fun.name.ptr = name; - call->what.fun.name.len = name_len; + call->what.fun.name.len = namelen; call->args = head; call->nargs = nargs; /* store a non-builtin function call into the awk->parse.funs * table */ if (qse_map_upsert ( - awk->parse.funs, name, name_len, call, 0) == QSE_NULL) + awk->parse.funs, name, namelen, call, 0) == QSE_NULL) { QSE_AWK_FREE (awk, call); if (head != QSE_NULL) qse_awk_clrpt (awk, head); - SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc->lin); + SETERR_LOC (awk, QSE_AWK_ENOMEM, xloc); return QSE_NULL; } } @@ -4977,7 +5000,9 @@ static int get_number (qse_awk_t* awk, qse_awk_tok_t* tok) if (c == QSE_T('8') || c == QSE_T('9')) { qse_char_t cc = (qse_char_t)c; - SETERR_ARG_LOC (awk, QSE_AWK_ELXDIG, &cc, 1, awk->tok.loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_ELXDIG, + &cc, 1, &awk->tok.loc); return -1; } @@ -5316,7 +5341,11 @@ static int skip_comment (qse_awk_t* awk) GET_CHAR_TO (awk, c); if (c == QSE_CHAR_EOF) { - SETERR_LOC (awk, QSE_AWK_ECMTNC, awk->sio.inp->lin); + qse_awk_loc_t loc; + loc.lin = awk->sio.inp->lin; + loc.col = awk->sio.inp->col; + loc.fil = awk->sio.inp->name; + SETERR_LOC (awk, QSE_AWK_ECMTNC, &loc); return -1; } @@ -5325,7 +5354,11 @@ static int skip_comment (qse_awk_t* awk) GET_CHAR_TO (awk, c); if (c == QSE_CHAR_EOF) { - SETERR_LOC (awk, QSE_AWK_ECMTNC, awk->sio.inp->lin); + qse_awk_loc_t loc; + loc.lin = awk->sio.inp->lin; + loc.col = awk->sio.inp->col; + loc.fil = awk->sio.inp->name; + SETERR_LOC (awk, QSE_AWK_ECMTNC, &loc); return -1; } @@ -5546,11 +5579,14 @@ retry: { /* not handled yet */ if (c == QSE_T('\0')) - SETERR_ARG_LOC (awk, QSE_AWK_ELXCHR, QSE_T(""), 5, tok->loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_ELXCHR, + QSE_T(""), 5, &tok->loc); else { qse_char_t cc = (qse_char_t)c; - SETERR_ARG_LOC (awk, QSE_AWK_ELXCHR, &cc, 1, tok->loc.lin); + SETERR_ARG_LOC ( + awk, QSE_AWK_ELXCHR, &cc, 1, &tok->loc); } return -1; } @@ -5606,7 +5642,7 @@ static int classify_ident ( mid = (left + right) / 2; kwp = &kwtab[mid]; - n = qse_strxncmp (kwp->name, kwp->name_len, name, len); + n = qse_strxncmp (kwp->name, kwp->namelen, name, len); if (n > 0) { /* if left, right, mid were of qse_size_t, @@ -5641,7 +5677,7 @@ static int classify_ident ( if (kwp->valid != 0 && (awk->option & kwp->valid) != kwp->valid) continue; - pair = qse_map_search (awk->wtab, kwp->name, kwp->name_len); + pair = qse_map_search (awk->wtab, kwp->name, kwp->namelen); if (pair != QSE_NULL) { k = ((qse_cstr_t*)(pair->vptr))->ptr; @@ -5650,7 +5686,7 @@ static int classify_ident ( else { k = kwp->name; - l = kwp->name_len; + l = kwp->namelen; } if (qse_strxncmp (k, l, name, len) == 0) diff --git a/qse/lib/awk/run.c b/qse/lib/awk/run.c index 98e59d62..c4dbc6b6 100644 --- a/qse/lib/awk/run.c +++ b/qse/lib/awk/run.c @@ -1,5 +1,5 @@ /* - * $Id: run.c 262 2009-08-22 05:43:44Z hyunghwan.chung $ + * $Id: run.c 267 2009-08-25 09:50:07Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -73,25 +73,24 @@ struct pafv (idx) < QSE_TYPE_MAX(qse_long_t) && \ (idx) < QSE_TYPE_MAX(qse_size_t)) +#define SETERR_ARGX_LOC(rtx,code,ea,loc) \ + qse_awk_rtx_seterror ((rtx), (code), (ea), (loc)) -#define SETERR_ARGX_LOC(rtx,code,ea,line) \ - qse_awk_rtx_seterror ((rtx), (code), (ea), (line)) +#define CLRERR(rtx) SETERR_ARGX_LOC(rtx,QSE_AWK_ENOERR,QSE_NULL,QSE_NULL) -#define CLRERR(rtx) SETERR_ARGX_LOC(rtx,QSE_AWK_ENOERR,QSE_NULL,0) - -#define SETERR_ARG_LOC(rtx,code,ep,el,line) \ +#define SETERR_ARG_LOC(rtx,code,ep,el,loc) \ do { \ qse_cstr_t __ea; \ __ea.len = (el); __ea.ptr = (ep); \ - qse_awk_rtx_seterror ((rtx), (code), &__ea, (line)); \ + qse_awk_rtx_seterror ((rtx), (code), &__ea, (loc)); \ } while (0) -#define SETERR_ARGX(rtx,code,ea) SETERR_ARGX_LOC(rtx,code,ea,0) -#define SETERR_ARG(rtx,code,ep,el) SETERR_ARG_LOC(rtx,code,ep,el,0) -#define SETERR_LOC(rtx,code,line) SETERR_ARGX_LOC(rtx,code,QSE_NULL,line) -#define SETERR_COD(rtx,code) SETERR_ARGX_LOC(rtx,code,QSE_NULL,0) +#define SETERR_ARGX(rtx,code,ea) SETERR_ARGX_LOC(rtx,code,ea,QSE_NULL) +#define SETERR_ARG(rtx,code,ep,el) SETERR_ARG_LOC(rtx,code,ep,el,QSE_NULL) +#define SETERR_LOC(rtx,code,loc) SETERR_ARGX_LOC(rtx,code,QSE_NULL,loc) +#define SETERR_COD(rtx,code) SETERR_ARGX_LOC(rtx,code,QSE_NULL,QSE_NULL) -#define ADJERR_LOC(rtx,line) do { (rtx)->errinf.lin = line; } while (0) +#define ADJERR_LOC(rtx,l) do { (rtx)->errinf.loc = *(l); } while (0) static qse_size_t push_arg_from_vals ( qse_awk_rtx_t* rtx, qse_awk_nde_call_t* call, void* data); @@ -193,9 +192,6 @@ static qse_awk_val_t* eval_binop_ma ( qse_awk_rtx_t* run, qse_awk_nde_t* left, qse_awk_nde_t* right); static qse_awk_val_t* eval_binop_nm ( qse_awk_rtx_t* run, qse_awk_nde_t* left, qse_awk_nde_t* right); -static qse_awk_val_t* eval_binop_match0 ( - qse_awk_rtx_t* run, qse_awk_val_t* left, qse_awk_val_t* right, - qse_size_t lline, qse_size_t rline, int ret); static qse_awk_val_t* eval_unary (qse_awk_rtx_t* run, qse_awk_nde_t* nde); static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde); @@ -313,7 +309,7 @@ static int set_global ( rtx, QSE_AWK_EMAPTOSCALAR, xstr_to_cstr(&var->id.name), - var->line + &var->loc ); } else @@ -456,7 +452,7 @@ static int set_global ( { /* adjust the error line */ if (var != QSE_NULL) - ADJERR_LOC (rtx, var->line); + ADJERR_LOC (rtx, &var->loc); return -1; } } @@ -1583,13 +1579,13 @@ static int run_pblocks (qse_awk_rtx_t* run) if (run->awk->tree.chain != QSE_NULL) \ { \ if (run->awk->tree.chain->pattern != QSE_NULL) \ - ADJERR_LOC (run, run->awk->tree.chain->pattern->line); \ + ADJERR_LOC (run, &run->awk->tree.chain->pattern->loc); \ else if (run->awk->tree.chain->action != QSE_NULL) \ - ADJERR_LOC (run, run->awk->tree.chain->action->line); \ + ADJERR_LOC (run, &run->awk->tree.chain->action->loc); \ } \ else if (run->awk->tree.end != QSE_NULL) \ { \ - ADJERR_LOC (run, run->awk->tree.end->line); \ + ADJERR_LOC (run, &run->awk->tree.end->loc); \ } run->inrec.buf_pos = 0; @@ -1746,7 +1742,7 @@ static int run_block (qse_awk_rtx_t* rtx, qse_awk_nde_blk_t* nde) if (rtx->depth.max.block > 0 && rtx->depth.cur.block >= rtx->depth.max.block) { - SETERR_LOC (rtx, QSE_AWK_EBLKNST, nde->line); + SETERR_LOC (rtx, QSE_AWK_EBLKNST, &nde->loc); return -1;; } @@ -1776,7 +1772,7 @@ static int run_block0 (qse_awk_rtx_t* rtx, qse_awk_nde_blk_t* nde) if (n == -1) { qse_awk_rtx_refdownval (rtx, rtx->inrec.d0); - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } @@ -1786,7 +1782,7 @@ static int run_block0 (qse_awk_rtx_t* rtx, qse_awk_nde_blk_t* nde) if (n == -1) { qse_awk_rtx_refdownval (rtx, rtx->inrec.d0); - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } @@ -1855,7 +1851,7 @@ static int run_block0 (qse_awk_rtx_t* rtx, qse_awk_nde_blk_t* nde) if ((rtx)->rcb.on_statement != QSE_NULL) \ { \ (rtx)->rcb.on_statement ( \ - rtx, (nde)->line, (rtx)->rcb.udd); \ + rtx, &(nde)->loc, (rtx)->rcb.udd); \ } static int run_statement (qse_awk_rtx_t* rtx, qse_awk_nde_t* nde) @@ -2208,7 +2204,7 @@ static qse_map_walk_t walk_foreach ( w->rtx, QSE_MAP_KPTR(pair), QSE_MAP_KLEN(pair)); if (str == QSE_NULL) { - ADJERR_LOC (w->rtx, w->var->line); + ADJERR_LOC (w->rtx, &w->var->loc); w->ret = -1; return QSE_MAP_WALK_STOP; } @@ -2270,7 +2266,7 @@ static int run_foreach (qse_awk_rtx_t* rtx, qse_awk_nde_foreach_t* nde) if (rv->type != QSE_AWK_VAL_MAP) { qse_awk_rtx_refdownval (rtx, rv); - SETERR_LOC (rtx, QSE_AWK_ENOTMAPIN, test->right->line); + SETERR_LOC (rtx, QSE_AWK_ENOTMAPIN, &test->right->loc); return -1; } map = ((qse_awk_val_map_t*)rv)->map; @@ -2318,7 +2314,7 @@ static int run_return (qse_awk_rtx_t* run, qse_awk_nde_return_t* nde) qse_awk_rtx_refupval (run, val); qse_awk_rtx_refdownval (run, val); - SETERR_LOC (run, QSE_AWK_EMAPNA, nde->line); + SETERR_LOC (run, QSE_AWK_EMAPNA, &nde->loc); return -1; } } @@ -2364,12 +2360,12 @@ static int run_next (qse_awk_rtx_t* run, qse_awk_nde_next_t* nde) * check that explicitly */ if (run->active_block == (qse_awk_nde_blk_t*)run->awk->tree.begin) { - SETERR_LOC (run, QSE_AWK_ERNEXTBEG, nde->line); + SETERR_LOC (run, QSE_AWK_ERNEXTBEG, &nde->loc); return -1; } else if (run->active_block == (qse_awk_nde_blk_t*)run->awk->tree.end) { - SETERR_LOC (run, QSE_AWK_ERNEXTEND, nde->line); + SETERR_LOC (run, QSE_AWK_ERNEXTEND, &nde->loc); return -1; } @@ -2384,19 +2380,19 @@ static int run_nextinfile (qse_awk_rtx_t* rtx, qse_awk_nde_nextfile_t* nde) /* normal nextfile statement */ if (rtx->active_block == (qse_awk_nde_blk_t*)rtx->awk->tree.begin) { - SETERR_LOC (rtx, QSE_AWK_ERNEXTFBEG, nde->line); + SETERR_LOC (rtx, QSE_AWK_ERNEXTFBEG, &nde->loc); return -1; } else if (rtx->active_block == (qse_awk_nde_blk_t*)rtx->awk->tree.end) { - SETERR_LOC (rtx, QSE_AWK_ERNEXTFEND, nde->line); + SETERR_LOC (rtx, QSE_AWK_ERNEXTFEND, &nde->loc); return -1; } n = qse_awk_rtx_nextio_read (rtx, QSE_AWK_IN_CONSOLE, QSE_T("")); if (n == -1) { - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } @@ -2410,7 +2406,7 @@ static int run_nextinfile (qse_awk_rtx_t* rtx, qse_awk_nde_nextfile_t* nde) /* FNR resets to 0, NR remains the same */ if (update_fnr (rtx, 0, rtx->gbl.nr) == -1) { - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } @@ -2429,7 +2425,7 @@ static int run_nextoutfile (qse_awk_rtx_t* rtx, qse_awk_nde_nextfile_t* nde) if (n == -1) { /* adjust the error line */ - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } @@ -2501,7 +2497,7 @@ static int delete_indexed ( if (key == QSE_NULL) { /* change the error line */ - ADJERR_LOC (rtx, var->line); + ADJERR_LOC (rtx, &var->loc); return -1; } @@ -2545,7 +2541,7 @@ static int run_delete (qse_awk_rtx_t* rtx, qse_awk_nde_delete_t* nde) if (tmp == QSE_NULL) { /* adjust error line */ - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } @@ -2555,7 +2551,7 @@ static int run_delete (qse_awk_rtx_t* rtx, qse_awk_nde_delete_t* nde) { qse_awk_rtx_refupval (rtx, tmp); qse_awk_rtx_refdownval (rtx, tmp); - SETERR_LOC (rtx, QSE_AWK_ENOMEM, var->line); + SETERR_LOC (rtx, QSE_AWK_ENOMEM, &var->loc); return -1; } @@ -2575,7 +2571,7 @@ static int run_delete (qse_awk_rtx_t* rtx, qse_awk_nde_delete_t* nde) { SETERR_ARGX_LOC ( rtx, QSE_AWK_ENOTDEL, - xstr_to_cstr(&var->id.name), var->line); + xstr_to_cstr(&var->id.name), &var->loc); return -1; } @@ -2622,7 +2618,7 @@ static int run_delete (qse_awk_rtx_t* rtx, qse_awk_nde_delete_t* nde) tmp = qse_awk_rtx_makemapval (rtx); if (tmp == QSE_NULL) { - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } @@ -2636,7 +2632,7 @@ static int run_delete (qse_awk_rtx_t* rtx, qse_awk_nde_delete_t* nde) { qse_awk_rtx_refupval (rtx, tmp); qse_awk_rtx_refdownval (rtx, tmp); - ADJERR_LOC (rtx, var->line); + ADJERR_LOC (rtx, &var->loc); return -1; } } @@ -2660,7 +2656,7 @@ static int run_delete (qse_awk_rtx_t* rtx, qse_awk_nde_delete_t* nde) { SETERR_ARGX_LOC ( rtx, QSE_AWK_ENOTDEL, - xstr_to_cstr(&var->id.name), var->line); + xstr_to_cstr(&var->id.name), &var->loc); return -1; } @@ -2686,7 +2682,7 @@ static int run_delete (qse_awk_rtx_t* rtx, qse_awk_nde_delete_t* nde) !"should never happen - wrong target for delete", "the delete statement cannot be called with other nodes than the variables such as a named variable, a named indexed variable, etc"); - SETERR_LOC (rtx, QSE_AWK_ERDELETE, var->line); + SETERR_LOC (rtx, QSE_AWK_ERDELETE, &var->loc); return -1; } @@ -2740,7 +2736,7 @@ static int run_reset (qse_awk_rtx_t* rtx, qse_awk_nde_reset_t* nde) !"should never happen - wrong target for reset", "the reset statement can only be called with plain variables"); - SETERR_LOC (rtx, QSE_AWK_ERRESET, var->line); + SETERR_LOC (rtx, QSE_AWK_ERRESET, &var->loc); return -1; } @@ -2777,7 +2773,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) if (qse_awk_rtx_valtostr (rtx, v, &vsout) == QSE_NULL) { qse_awk_rtx_refdownval (rtx, v); - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } out = vsout.u.cpldup.ptr; @@ -2789,7 +2785,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) { /* the destination name is empty */ QSE_AWK_FREE (rtx->awk, out); - SETERR_LOC (rtx, QSE_AWK_EIONMEM, nde->line); + SETERR_LOC (rtx, QSE_AWK_EIONMEM, &nde->loc); return -1; } @@ -2804,7 +2800,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) * in an error message */ SETERR_ARG_LOC ( rtx, QSE_AWK_EIONMNL, - out, qse_strlen(out), nde->line); + out, qse_strlen(out), &nde->loc); /* if so, it skips writing */ QSE_AWK_FREE (rtx->awk, out); @@ -2829,7 +2825,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) { if (out != QSE_NULL) QSE_AWK_FREE (rtx->awk, out); - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } } @@ -2859,7 +2855,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) { if (out != QSE_NULL) QSE_AWK_FREE (rtx->awk, out); - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } } @@ -2881,7 +2877,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) QSE_AWK_FREE (rtx->awk, out); qse_awk_rtx_refdownval (rtx, v); - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } @@ -2896,7 +2892,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) if (n <= -1 /*&& rtx->errinf.num != QSE_AWK_EIOIMPL*/) { if (out != QSE_NULL) QSE_AWK_FREE (rtx->awk, out); - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } @@ -2938,7 +2934,7 @@ static int run_printf (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) if (qse_awk_rtx_valtostr (rtx, v, &vsout) == QSE_NULL) { qse_awk_rtx_refdownval (rtx, v); - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } out = vsout.u.cpldup.ptr; @@ -2950,7 +2946,7 @@ static int run_printf (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) { /* the output destination name is empty. */ QSE_AWK_FREE (rtx->awk, out); - SETERR_LOC (rtx, QSE_AWK_EIONMEM, nde->line); + SETERR_LOC (rtx, QSE_AWK_EIONMEM, &nde->loc); return -1; } @@ -2963,7 +2959,7 @@ static int run_printf (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) * in an error message */ SETERR_ARG_LOC ( rtx, QSE_AWK_EIONMNL, - out, qse_strlen(out), nde->line); + out, qse_strlen(out), &nde->loc); /* the output destination name contains a null * character. */ @@ -3006,7 +3002,7 @@ static int run_printf (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) { if (out != QSE_NULL) QSE_AWK_FREE (rtx->awk, out); qse_awk_rtx_refdownval (rtx, v); - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } } @@ -3021,7 +3017,7 @@ static int run_printf (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde) { if (out != QSE_NULL) QSE_AWK_FREE (rtx->awk, out); qse_awk_rtx_refdownval (rtx, v); - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return -1; } } @@ -3110,7 +3106,7 @@ static qse_awk_val_t* eval_expression (qse_awk_rtx_t* rtx, qse_awk_nde_t* nde) * whose message contains a formatting * character. otherwise, the following way of * setting the error information may not work */ - SETERR_LOC (rtx, errnum, nde->line); + SETERR_LOC (rtx, errnum, &nde->loc); return QSE_NULL; } } @@ -3121,7 +3117,7 @@ static qse_awk_val_t* eval_expression (qse_awk_rtx_t* rtx, qse_awk_nde_t* nde) if (v == QSE_NULL) { /* adjust error line */ - ADJERR_LOC (rtx, nde->line); + ADJERR_LOC (rtx, &nde->loc); return QSE_NULL; } } @@ -3188,7 +3184,7 @@ static qse_awk_val_t* eval_group (qse_awk_rtx_t* rtx, 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"); - SETERR_LOC (rtx, QSE_AWK_EINTERN, nde->line); + SETERR_LOC (rtx, QSE_AWK_EINTERN, &nde->loc); return QSE_NULL; } @@ -3316,7 +3312,7 @@ static qse_awk_val_t* do_assignment ( return ret; exit_on_error: - SETERR_LOC (run, errnum, var->line); + SETERR_LOC (run, errnum, &var->loc); return QSE_NULL; } @@ -3346,14 +3342,14 @@ static qse_awk_val_t* do_assignment_scalar ( * it cannot be changed to a scalar variable */ SETERR_ARGX_LOC ( run, QSE_AWK_EMAPTOSCALAR, - xstr_to_cstr(&var->id.name), var->line); + xstr_to_cstr(&var->id.name), &var->loc); return QSE_NULL; } if (qse_map_upsert (run->named, var->id.name.ptr, var->id.name.len, val, 0) == QSE_NULL) { - SETERR_LOC (run, QSE_AWK_ENOMEM, var->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &var->loc); return QSE_NULL; } @@ -3363,7 +3359,7 @@ static qse_awk_val_t* do_assignment_scalar ( { if (set_global (run, var->id.idxa, var, val) == -1) { - ADJERR_LOC (run, var->line); + ADJERR_LOC (run, &var->loc); return QSE_NULL; } } @@ -3376,7 +3372,7 @@ static qse_awk_val_t* do_assignment_scalar ( * it cannot be changed to a scalar variable */ SETERR_ARGX_LOC ( run, QSE_AWK_EMAPTOSCALAR, - xstr_to_cstr(&var->id.name), var->line); + xstr_to_cstr(&var->id.name), &var->loc); return QSE_NULL; } @@ -3393,7 +3389,7 @@ static qse_awk_val_t* do_assignment_scalar ( * it cannot be changed to a scalar variable */ SETERR_ARGX_LOC ( run, QSE_AWK_EMAPTOSCALAR, - xstr_to_cstr(&var->id.name), var->line); + xstr_to_cstr(&var->id.name), &var->loc); return QSE_NULL; } @@ -3446,7 +3442,7 @@ static qse_awk_val_t* do_assignment_map ( tmp = qse_awk_rtx_makemapval (run); if (tmp == QSE_NULL) { - ADJERR_LOC (run, var->line); + ADJERR_LOC (run, &var->loc); return QSE_NULL; } @@ -3465,7 +3461,7 @@ static qse_awk_val_t* do_assignment_map ( qse_awk_rtx_refupval (run, tmp); qse_awk_rtx_refdownval (run, tmp); - SETERR_LOC (run, QSE_AWK_ENOMEM, var->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &var->loc); return QSE_NULL; } @@ -3477,7 +3473,7 @@ static qse_awk_val_t* do_assignment_map ( if (qse_awk_rtx_setgbl (run, (int)var->id.idxa, tmp) == -1) { qse_awk_rtx_refdownval (run, tmp); - ADJERR_LOC (run, var->line); + ADJERR_LOC (run, &var->loc); return QSE_NULL; } qse_awk_rtx_refdownval (run, tmp); @@ -3500,7 +3496,7 @@ static qse_awk_val_t* do_assignment_map ( else if (map->type != QSE_AWK_VAL_MAP) { /* variable assigned is not a map */ - SETERR_LOC (run, QSE_AWK_ENOTIDX, var->line); + SETERR_LOC (run, QSE_AWK_ENOTIDX, &var->loc); return QSE_NULL; } @@ -3516,7 +3512,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); - SETERR_LOC (run, QSE_AWK_ENOMEM, var->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &var->loc); return QSE_NULL; } @@ -3544,13 +3540,13 @@ static qse_awk_val_t* do_assignment_pos ( if (n == -1) { - SETERR_LOC (run, QSE_AWK_EPOSIDX, pos->line); + SETERR_LOC (run, QSE_AWK_EPOSIDX, &pos->loc); return QSE_NULL; } if (n == 1) lv = (qse_long_t)rv; if (!IS_VALID_POSIDX(lv)) { - SETERR_LOC (run, QSE_AWK_EPOSIDX, pos->line); + SETERR_LOC (run, QSE_AWK_EPOSIDX, &pos->loc); return QSE_NULL; } @@ -3566,7 +3562,7 @@ static qse_awk_val_t* do_assignment_pos ( out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; if (qse_awk_rtx_valtostr (run, val, &out) == QSE_NULL) { - ADJERR_LOC (run, pos->line); + ADJERR_LOC (run, &pos->loc); return QSE_NULL; } @@ -3669,7 +3665,7 @@ static qse_awk_val_t* eval_binary (qse_awk_rtx_t* run, qse_awk_nde_t* nde) QSE_ASSERT (binop_func[exp->opcode] != QSE_NULL); res = binop_func[exp->opcode] (run, left, right); - if (res == QSE_NULL) ADJERR_LOC (run, nde->line); + if (res == QSE_NULL) ADJERR_LOC (run, &nde->loc); qse_awk_rtx_refdownval (run, left); qse_awk_rtx_refdownval (run, right); @@ -3691,7 +3687,7 @@ static qse_awk_val_t* eval_binop_lor ( ); if (res == QSE_NULL) { - ADJERR_LOC (run, left->line); + ADJERR_LOC (run, &left->loc); return QSE_NULL; } @@ -3744,7 +3740,7 @@ static qse_awk_val_t* eval_binop_land ( ); if (res == QSE_NULL) { - ADJERR_LOC (run, left->line); + ADJERR_LOC (run, &left->loc); return QSE_NULL; } @@ -3798,7 +3794,7 @@ static qse_awk_val_t* eval_binop_in ( { /* the compiler should have handled this case */ QSE_ASSERT (!"should never happen - it needs a plain variable"); - SETERR_LOC (run, QSE_AWK_EINTERN, right->line); + SETERR_LOC (run, QSE_AWK_EINTERN, &right->loc); return QSE_NULL; } @@ -3844,7 +3840,7 @@ static qse_awk_val_t* eval_binop_in ( if (str != idxbuf) QSE_AWK_FREE (run->awk, str); qse_awk_rtx_refdownval (run, rv); - SETERR_LOC (run, QSE_AWK_ENOTMAPNILIN, right->line); + SETERR_LOC (run, QSE_AWK_ENOTMAPNILIN, &right->loc); return QSE_NULL; } @@ -4702,6 +4698,126 @@ static qse_awk_val_t* eval_binop_concat ( return res; } +static qse_awk_val_t* eval_binop_match0 ( + qse_awk_rtx_t* rtx, qse_awk_val_t* left, qse_awk_val_t* right, + const qse_awk_loc_t* lloc, const qse_awk_loc_t* rloc, int ret) +{ + qse_awk_val_t* res; + int n; + qse_awk_errnum_t errnum; + void* rex_code; + + if (right->type == QSE_AWK_VAL_REX) + { + rex_code = ((qse_awk_val_rex_t*)right)->code; + } + else if (right->type == QSE_AWK_VAL_STR) + { + rex_code = QSE_AWK_BUILDREX ( + rtx->awk, + ((qse_awk_val_str_t*)right)->ptr, + ((qse_awk_val_str_t*)right)->len, &errnum); + if (rex_code == QSE_NULL) + { + SETERR_LOC (rtx, errnum, rloc); + return QSE_NULL; + } + } + else + { + qse_awk_rtx_valtostr_out_t out; + + out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; + if (qse_awk_rtx_valtostr (rtx, right, &out) == QSE_NULL) + return QSE_NULL; + + rex_code = QSE_AWK_BUILDREX ( + rtx->awk, out.u.cpldup.ptr, out.u.cpldup.len, &errnum); + if (rex_code == QSE_NULL) + { + QSE_AWK_FREE (rtx->awk, out.u.cpldup.ptr); + SETERR_LOC (rtx, errnum, rloc); + return QSE_NULL; + } + + QSE_AWK_FREE (rtx->awk, out.u.cpldup.ptr); + } + + if (left->type == QSE_AWK_VAL_STR) + { + n = QSE_AWK_MATCHREX ( + rtx->awk, rex_code, + ((rtx->gbl.ignorecase)? QSE_REX_MATCH_IGNORECASE: 0), + ((qse_awk_val_str_t*)left)->ptr, + ((qse_awk_val_str_t*)left)->len, + ((qse_awk_val_str_t*)left)->ptr, + ((qse_awk_val_str_t*)left)->len, + QSE_NULL, &errnum); + if (n == -1) + { + if (right->type != QSE_AWK_VAL_REX) + QSE_AWK_FREE (rtx->awk, rex_code); + + SETERR_LOC (rtx, errnum, lloc); + return QSE_NULL; + } + + res = qse_awk_rtx_makeintval (rtx, (n == ret)); + if (res == QSE_NULL) + { + if (right->type != QSE_AWK_VAL_REX) + QSE_AWK_FREE (rtx->awk, rex_code); + + ADJERR_LOC (rtx, lloc); + return QSE_NULL; + } + } + else + { + qse_awk_rtx_valtostr_out_t out; + + out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; + if (qse_awk_rtx_valtostr (rtx, left, &out) == QSE_NULL) + { + if (right->type != QSE_AWK_VAL_REX) + QSE_AWK_FREE (rtx->awk, rex_code); + return QSE_NULL; + } + + n = QSE_AWK_MATCHREX ( + rtx->awk, rex_code, + ((rtx->gbl.ignorecase)? QSE_REX_MATCH_IGNORECASE: 0), + out.u.cpldup.ptr, out.u.cpldup.len, + out.u.cpldup.ptr, out.u.cpldup.len, + QSE_NULL, &errnum); + if (n == -1) + { + QSE_AWK_FREE (rtx->awk, out.u.cpldup.ptr); + if (right->type != QSE_AWK_VAL_REX) + QSE_AWK_FREE (rtx->awk, rex_code); + + SETERR_LOC (rtx, errnum, lloc); + return QSE_NULL; + } + + res = qse_awk_rtx_makeintval (rtx, (n == ret)); + if (res == QSE_NULL) + { + QSE_AWK_FREE (rtx->awk, out.u.cpldup.ptr); + if (right->type != QSE_AWK_VAL_REX) + QSE_AWK_FREE (rtx->awk, rex_code); + + ADJERR_LOC (rtx, lloc); + return QSE_NULL; + } + + QSE_AWK_FREE (rtx->awk, out.u.cpldup.ptr); + } + + if (right->type != QSE_AWK_VAL_REX) QSE_AWK_FREE (rtx->awk, rex_code); + return res; +} + static qse_awk_val_t* eval_binop_ma ( qse_awk_rtx_t* run, qse_awk_nde_t* left, qse_awk_nde_t* right) { @@ -4724,7 +4840,7 @@ static qse_awk_val_t* eval_binop_ma ( qse_awk_rtx_refupval (run, rv); - res = eval_binop_match0 (run, lv, rv, left->line, right->line, 1); + res = eval_binop_match0 (run, lv, rv, &left->loc, &right->loc, 1); qse_awk_rtx_refdownval (run, rv); qse_awk_rtx_refdownval (run, lv); @@ -4754,8 +4870,7 @@ static qse_awk_val_t* eval_binop_nm ( qse_awk_rtx_refupval (run, rv); - res = eval_binop_match0 ( - run, lv, rv, left->line, right->line, 0); + res = eval_binop_match0 (run, lv, rv, &left->loc, &right->loc, 0); qse_awk_rtx_refdownval (run, rv); qse_awk_rtx_refdownval (run, lv); @@ -4763,126 +4878,6 @@ static qse_awk_val_t* eval_binop_nm ( return res; } -static qse_awk_val_t* eval_binop_match0 ( - qse_awk_rtx_t* rtx, qse_awk_val_t* left, qse_awk_val_t* right, - qse_size_t lline, qse_size_t rline, int ret) -{ - qse_awk_val_t* res; - int n; - qse_awk_errnum_t errnum; - void* rex_code; - - if (right->type == QSE_AWK_VAL_REX) - { - rex_code = ((qse_awk_val_rex_t*)right)->code; - } - else if (right->type == QSE_AWK_VAL_STR) - { - rex_code = QSE_AWK_BUILDREX ( - rtx->awk, - ((qse_awk_val_str_t*)right)->ptr, - ((qse_awk_val_str_t*)right)->len, &errnum); - if (rex_code == QSE_NULL) - { - SETERR_LOC (rtx, errnum, rline); - return QSE_NULL; - } - } - else - { - qse_awk_rtx_valtostr_out_t out; - - out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; - if (qse_awk_rtx_valtostr (rtx, right, &out) == QSE_NULL) - return QSE_NULL; - - rex_code = QSE_AWK_BUILDREX ( - rtx->awk, out.u.cpldup.ptr, out.u.cpldup.len, &errnum); - if (rex_code == QSE_NULL) - { - QSE_AWK_FREE (rtx->awk, out.u.cpldup.ptr); - SETERR_LOC (rtx, errnum, rline); - return QSE_NULL; - } - - QSE_AWK_FREE (rtx->awk, out.u.cpldup.ptr); - } - - if (left->type == QSE_AWK_VAL_STR) - { - n = QSE_AWK_MATCHREX ( - rtx->awk, rex_code, - ((rtx->gbl.ignorecase)? QSE_REX_MATCH_IGNORECASE: 0), - ((qse_awk_val_str_t*)left)->ptr, - ((qse_awk_val_str_t*)left)->len, - ((qse_awk_val_str_t*)left)->ptr, - ((qse_awk_val_str_t*)left)->len, - QSE_NULL, &errnum); - if (n == -1) - { - if (right->type != QSE_AWK_VAL_REX) - QSE_AWK_FREE (rtx->awk, rex_code); - - SETERR_LOC (rtx, errnum, lline); - return QSE_NULL; - } - - res = qse_awk_rtx_makeintval (rtx, (n == ret)); - if (res == QSE_NULL) - { - if (right->type != QSE_AWK_VAL_REX) - QSE_AWK_FREE (rtx->awk, rex_code); - - ADJERR_LOC (rtx, lline); - return QSE_NULL; - } - } - else - { - qse_awk_rtx_valtostr_out_t out; - - out.type = QSE_AWK_RTX_VALTOSTR_CPLDUP; - if (qse_awk_rtx_valtostr (rtx, left, &out) == QSE_NULL) - { - if (right->type != QSE_AWK_VAL_REX) - QSE_AWK_FREE (rtx->awk, rex_code); - return QSE_NULL; - } - - n = QSE_AWK_MATCHREX ( - rtx->awk, rex_code, - ((rtx->gbl.ignorecase)? QSE_REX_MATCH_IGNORECASE: 0), - out.u.cpldup.ptr, out.u.cpldup.len, - out.u.cpldup.ptr, out.u.cpldup.len, - QSE_NULL, &errnum); - if (n == -1) - { - QSE_AWK_FREE (rtx->awk, out.u.cpldup.ptr); - if (right->type != QSE_AWK_VAL_REX) - QSE_AWK_FREE (rtx->awk, rex_code); - - SETERR_LOC (rtx, errnum, lline); - return QSE_NULL; - } - - res = qse_awk_rtx_makeintval (rtx, (n == ret)); - if (res == QSE_NULL) - { - QSE_AWK_FREE (rtx->awk, out.u.cpldup.ptr); - if (right->type != QSE_AWK_VAL_REX) - QSE_AWK_FREE (rtx->awk, rex_code); - - ADJERR_LOC (rtx, lline); - return QSE_NULL; - } - - QSE_AWK_FREE (rtx->awk, out.u.cpldup.ptr); - } - - if (right->type != QSE_AWK_VAL_REX) QSE_AWK_FREE (rtx->awk, rex_code); - return res; -} - static qse_awk_val_t* eval_unary (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { qse_awk_val_t* left, * res = QSE_NULL; @@ -4950,7 +4945,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) ADJERR_LOC (run, nde->line); + if (res == QSE_NULL) ADJERR_LOC (run, &nde->loc); return res; } @@ -4969,7 +4964,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) /*exp->left->type > QSE_AWK_NDE_ARGIDX) XXX */ exp->left->type > QSE_AWK_NDE_POS) { - SETERR_LOC (run, QSE_AWK_EOPERAND, nde->line); + SETERR_LOC (run, QSE_AWK_EOPERAND, &nde->loc); return QSE_NULL; } @@ -4988,7 +4983,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -4999,7 +4994,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5013,7 +5008,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (n == -1) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5030,7 +5025,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5044,7 +5039,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5055,7 +5050,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5069,7 +5064,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (n == -1) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5086,7 +5081,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5095,7 +5090,7 @@ static qse_awk_val_t* eval_incpre (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { QSE_ASSERT (!"should never happen - invalid opcode"); qse_awk_rtx_refdownval (run, left); - SETERR_LOC (run, QSE_AWK_EINTERN, nde->line); + SETERR_LOC (run, QSE_AWK_EINTERN, &nde->loc); return QSE_NULL; } @@ -5124,7 +5119,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) /*exp->left->type > QSE_AWK_NDE_ARGIDX) XXX */ exp->left->type > QSE_AWK_NDE_POS) { - SETERR_LOC (run, QSE_AWK_EOPERAND, nde->line); + SETERR_LOC (run, QSE_AWK_EOPERAND, &nde->loc); return QSE_NULL; } @@ -5143,7 +5138,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5152,7 +5147,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); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5163,7 +5158,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5172,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); qse_awk_rtx_freeval (run, res, QSE_TRUE); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5186,7 +5181,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (n == -1) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5196,7 +5191,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5205,7 +5200,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); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5216,7 +5211,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5225,7 +5220,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); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5240,7 +5235,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5249,7 +5244,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); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5260,7 +5255,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5269,7 +5264,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); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5283,7 +5278,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (n == -1) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5293,7 +5288,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5302,7 +5297,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); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5313,7 +5308,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (res == QSE_NULL) { qse_awk_rtx_refdownval (run, left); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); 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_freeval (run, res, QSE_TRUE); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } } @@ -5332,7 +5327,7 @@ static qse_awk_val_t* eval_incpst (qse_awk_rtx_t* run, qse_awk_nde_t* nde) { QSE_ASSERT (!"should never happen - invalid opcode"); qse_awk_rtx_refdownval (run, left); - SETERR_LOC (run, QSE_AWK_EINTERN, nde->line); + SETERR_LOC (run, QSE_AWK_EINTERN, &nde->loc); return QSE_NULL; } @@ -5376,13 +5371,13 @@ static qse_awk_val_t* eval_fnc (qse_awk_rtx_t* run, qse_awk_nde_t* nde) /* intrinsic function */ if (call->nargs < call->what.fnc.arg.min) { - SETERR_LOC (run, QSE_AWK_EARGTF, nde->line); + SETERR_LOC (run, QSE_AWK_EARGTF, &nde->loc); return QSE_NULL; } if (call->nargs > call->what.fnc.arg.max) { - SETERR_LOC (run, QSE_AWK_EARGTM, nde->line); + SETERR_LOC (run, QSE_AWK_EARGTM, &nde->loc); return QSE_NULL; } @@ -5405,7 +5400,7 @@ static qse_awk_val_t* eval_fun_ex ( { SETERR_ARGX_LOC ( rtx, QSE_AWK_EFUNNF, - xstr_to_cstr(&call->what.fun.name), nde->line); + xstr_to_cstr(&call->what.fun.name), &nde->loc); return QSE_NULL; } @@ -5416,7 +5411,7 @@ static qse_awk_val_t* eval_fun_ex ( { /* TODO: is this correct? what if i want to * allow arbitarary numbers of arguments? */ - SETERR_LOC (rtx, QSE_AWK_EARGTM, nde->line); + SETERR_LOC (rtx, QSE_AWK_EARGTM, &nde->loc); return QSE_NULL; } @@ -5522,14 +5517,14 @@ static qse_awk_val_t* __eval_call ( #endif if (__raw_push(run,(void*)run->stack_base) == -1) { - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return QSE_NULL; } if (__raw_push(run,(void*)saved_stack_top) == -1) { __raw_pop (run); - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return QSE_NULL; } @@ -5538,7 +5533,7 @@ static qse_awk_val_t* __eval_call ( { __raw_pop (run); __raw_pop (run); - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return QSE_NULL; } @@ -5548,7 +5543,7 @@ static qse_awk_val_t* __eval_call ( __raw_pop (run); __raw_pop (run); __raw_pop (run); - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return QSE_NULL; } @@ -5572,7 +5567,7 @@ static qse_awk_val_t* __eval_call ( if (__raw_push(run,qse_awk_val_nil) == -1) { UNWIND_RTX_STACK (run, nargs); - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return QSE_NULL; } @@ -5623,12 +5618,12 @@ static qse_awk_val_t* __eval_call ( SETERR_ARGX_LOC ( run, QSE_AWK_EFNCIMPL, xstr_to_cstr(&call->what.fnc.oname), - nde->line + &nde->loc ); } else { - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); } /* correct the return code just in case */ @@ -5728,7 +5723,7 @@ static qse_size_t push_arg_from_vals ( qse_awk_rtx_refdownval (rtx, pafv->args[nargs]); UNWIND_RTX_STACK_ARG (rtx, nargs); - SETERR_LOC (rtx, QSE_AWK_ENOMEM, call->line); + SETERR_LOC (rtx, QSE_AWK_ENOMEM, &call->loc); return (qse_size_t)-1; } @@ -5799,7 +5794,7 @@ static qse_size_t push_arg_from_nde ( qse_awk_rtx_refdownval (rtx, v); UNWIND_RTX_STACK_ARG (rtx, nargs); - SETERR_LOC (rtx, QSE_AWK_ENOMEM, call->line); + SETERR_LOC (rtx, QSE_AWK_ENOMEM, &call->loc); return (qse_size_t)-1; } @@ -5844,7 +5839,7 @@ static int get_reference ( tgt->id.name.len, qse_awk_val_nil, 0); if (pair == QSE_NULL) { - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return -1; } } @@ -5884,7 +5879,7 @@ static int get_reference ( tgt->id.name.len, qse_awk_val_nil, 0); if (pair == QSE_NULL) { - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return -1; } } @@ -5937,13 +5932,13 @@ static int get_reference ( if (n == -1) { - SETERR_LOC (run, QSE_AWK_EPOSIDX, nde->line); + SETERR_LOC (run, QSE_AWK_EPOSIDX, &nde->loc); return -1; } if (n == 1) lv = (qse_long_t)rv; if (!IS_VALID_POSIDX(lv)) { - SETERR_LOC (run, QSE_AWK_EPOSIDX, nde->line); + SETERR_LOC (run, QSE_AWK_EPOSIDX, &nde->loc); return -1; } @@ -5951,7 +5946,7 @@ static int get_reference ( return 0; } - SETERR_LOC (run, QSE_AWK_ENOTREF, nde->line); + SETERR_LOC (run, QSE_AWK_ENOTREF, &nde->loc); return -1; } @@ -5972,7 +5967,7 @@ static qse_awk_val_t** get_reference_indexed ( tmp = qse_awk_rtx_makemapval (run); if (tmp == QSE_NULL) { - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -5982,7 +5977,7 @@ static qse_awk_val_t** get_reference_indexed ( } else if ((*val)->type != QSE_AWK_VAL_MAP) { - SETERR_LOC (run, QSE_AWK_ENOTMAP, nde->line); + SETERR_LOC (run, QSE_AWK_ENOTMAP, &nde->loc); return QSE_NULL; } @@ -6001,7 +5996,7 @@ static qse_awk_val_t** get_reference_indexed ( if (pair == QSE_NULL) { if (str != idxbuf) QSE_AWK_FREE (run->awk, str); - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return QSE_NULL; } @@ -6019,7 +6014,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) { - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } ((qse_awk_val_int_t*)val)->nde = nde; @@ -6034,7 +6029,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) { - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } ((qse_awk_val_real_t*)val)->nde = nde; @@ -6051,7 +6046,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) { - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -6068,7 +6063,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) { - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -6118,7 +6113,7 @@ static qse_awk_val_t* eval_indexed ( tmp = qse_awk_rtx_makemapval (run); if (tmp == QSE_NULL) { - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -6128,7 +6123,7 @@ static qse_awk_val_t* eval_indexed ( } else if ((*val)->type != QSE_AWK_VAL_MAP) { - SETERR_LOC (run, QSE_AWK_ENOTMAP, nde->line); + SETERR_LOC (run, QSE_AWK_ENOTMAP, &nde->loc); return QSE_NULL; } @@ -6157,7 +6152,7 @@ static qse_awk_val_t* eval_namedidx (qse_awk_rtx_t* run, qse_awk_nde_t* nde) tgt->id.name.ptr, tgt->id.name.len, qse_awk_val_nil, 0); if (pair == QSE_NULL) { - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return QSE_NULL; } @@ -6201,14 +6196,14 @@ static qse_awk_val_t* eval_pos (qse_awk_rtx_t* run, qse_awk_nde_t* nde) qse_awk_rtx_refdownval (run, v); if (n == -1) { - SETERR_LOC (run, QSE_AWK_EPOSIDX, nde->line); + SETERR_LOC (run, QSE_AWK_EPOSIDX, &nde->loc); return QSE_NULL; } if (n == 1) lv = (qse_long_t)rv; if (lv < 0) { - SETERR_LOC (run, QSE_AWK_EPOSIDX, nde->line); + SETERR_LOC (run, QSE_AWK_EPOSIDX, &nde->loc); return QSE_NULL; } if (lv == 0) v = run->inrec.d0; @@ -6292,7 +6287,7 @@ static qse_awk_val_t* eval_getline (qse_awk_rtx_t* run, qse_awk_nde_t* nde) if (qse_str_init (&buf, MMGR(run), DEF_BUF_CAPA) == QSE_NULL) { if (in != QSE_NULL) QSE_AWK_FREE (run->awk, in); - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return QSE_NULL; } @@ -6329,7 +6324,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) { - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -6349,7 +6344,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) ADJERR_LOC (run, nde->line); + if (res == QSE_NULL) ADJERR_LOC (run, &nde->loc); return res; } @@ -6568,7 +6563,7 @@ static qse_char_t* idxnde_to_str ( if (qse_awk_rtx_valtostr (run, idx, &out) == QSE_NULL) { qse_awk_rtx_refdownval (run, idx); - ADJERR_LOC (run, nde->line); + ADJERR_LOC (run, &nde->loc); return QSE_NULL; } @@ -6590,7 +6585,7 @@ static qse_char_t* idxnde_to_str ( if (qse_str_init (&idxstr, MMGR(run), DEF_BUF_CAPA) == QSE_NULL) { - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return QSE_NULL; } @@ -6612,7 +6607,7 @@ static qse_char_t* idxnde_to_str ( { qse_awk_rtx_refdownval (run, idx); qse_str_fini (&idxstr); - SETERR_LOC (run, QSE_AWK_ENOMEM, nde->line); + SETERR_LOC (run, QSE_AWK_ENOMEM, &nde->loc); return QSE_NULL; } diff --git a/qse/lib/awk/tree.h b/qse/lib/awk/tree.h index c8aca547..08c52ec1 100644 --- a/qse/lib/awk/tree.h +++ b/qse/lib/awk/tree.h @@ -1,5 +1,5 @@ /* - * $Id: tree.h 236 2009-07-16 08:27:53Z hyunghwan.chung $ + * $Id: tree.h 267 2009-08-25 09:50:07Z hyunghwan.chung $ * Copyright 2006-2009 Chung, Hyung-Hwan. @@ -152,7 +152,7 @@ struct qse_awk_fun_t #define QSE_AWK_NDE_HDR \ qse_awk_nde_type_t type; \ - qse_size_t line; \ + qse_awk_loc_t loc; \ qse_awk_nde_t* next struct qse_awk_nde_t diff --git a/qse/regress/awk/regress.out b/qse/regress/awk/regress.out index 75883b48..0c25ffaa 100644 --- a/qse/regress/awk/regress.out +++ b/qse/regress/awk/regress.out @@ -937,7 +937,7 @@ my hello my hello my hello my hello -ERROR: CODE [15] LINE [6] block nested too deeply +ERROR: CODE 15 LINE 6 COLUMN 1 - block nested too deeply -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --newline=on -o- -f lang-003.awk &1 -------------------------------------------------------------------------------- @@ -956,7 +956,7 @@ BEGIN { -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --newline=on -o- -f lang-004.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [42] LINE [3] function 'a' redefined +ERROR: CODE 42 LINE 3 COLUMN 9 - function 'a' redefined -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --implicit=off --explicit=on --newline=on -o- -f lang-005.awk &1 -------------------------------------------------------------------------------- @@ -984,7 +984,7 @@ BEGIN { -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --implicit=off --explicit=on --newline=on -o- -f lang-006.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [43] LINE [5] global variable 'a' redefined +ERROR: CODE 43 LINE 5 COLUMN 10 - global variable 'a' redefined -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --implicit=on --explicit=on --newline=on -o- -f lang-007.awk &1 -------------------------------------------------------------------------------- @@ -1352,7 +1352,7 @@ BEGIN { printf ("%s\n",10.34); } -ERROR: CODE [103] LINE [3] recursion detected in format conversion +ERROR: CODE 103 LINE 3 COLUMN 2 - recursion detected in format conversion -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --newline=on -o- -f lang-014.awk &1 -------------------------------------------------------------------------------- @@ -1367,7 +1367,7 @@ BEGIN { -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --newline=on -o- -f lang-015.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [15] LINE [3] block nested too deeply +ERROR: CODE 15 LINE 3 COLUMN 50 - block nested too deeply -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --newline=on -o- -f lang-016.awk &1 -------------------------------------------------------------------------------- @@ -1481,27 +1481,27 @@ END { -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --explicit=on --newline=on -o- -f lang-018.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [47] LINE [1] duplicate global variable 'ARGV' +ERROR: CODE 47 LINE 1 COLUMN 8 - duplicate global variable 'ARGV' -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --explicit=on --newline=on -o- -f lang-019.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [49] LINE [1] '+' not a valid parameter name +ERROR: CODE 49 LINE 1 COLUMN 15 - '+' not a valid parameter name -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --explicit=on --newline=on -o- -f lang-020.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [50] LINE [1] '+' not a valid variable name +ERROR: CODE 50 LINE 1 COLUMN 8 - '+' not a valid variable name -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --explicit=on --newline=on -o- -f lang-021.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [50] LINE [3] '+' not a valid variable name +ERROR: CODE 50 LINE 3 COLUMN 8 - '+' not a valid variable name -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --newline=on -o- -f lang-022.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [23] LINE [2] left parenthesis expected in place of '=' +ERROR: CODE 23 LINE 2 COLUMN 9 - left parenthesis expected in place of '=' -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --explicit=on --newline=on -o- -f lang-023.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [28] LINE [5] colon expected in place of ';' +ERROR: CODE 28 LINE 5 COLUMN 20 - colon expected in place of ';' -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --explicit=on --newline=on -o- -f lang-024.awk &1 -------------------------------------------------------------------------------- @@ -1520,7 +1520,7 @@ BEGIN { delete iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiix; } -ERROR: CODE [78] LINE [3] variable 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiix' not deletable +ERROR: CODE 78 LINE 3 COLUMN 9 - variable 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiix' not deletable -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --newline=on -o- -f lang-026.awk &1 -------------------------------------------------------------------------------- @@ -1532,19 +1532,19 @@ BEGIN { } abc -ERROR: CODE [86] LINE [4] map 'abc' not assignable with a scalar +ERROR: CODE 86 LINE 4 COLUMN 2 - map 'abc' not assignable with a scalar -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --newline=on -o- -f lang-027.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [17] LINE [2] invalid character '' +ERROR: CODE 17 LINE 2 COLUMN 1 - invalid character '' -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --newline=on -o- -f lang-028.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [41] LINE [2] intrinsic function 'substr' redefined +ERROR: CODE 41 LINE 2 COLUMN 10 - intrinsic function 'substr' redefined -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --explicit=on --newline=on -o- -f lang-029.awk &1 -------------------------------------------------------------------------------- -ERROR: CODE [42] LINE [9] function 'abc' redefined +ERROR: CODE 42 LINE 9 COLUMN 9 - function 'abc' redefined -------------------------------------------------------------------------------- ../../cmd/awk/qseawk --newline=on -o- -f lang-030.awk &1 -------------------------------------------------------------------------------- diff --git a/qse/samples/awk/awk05.cpp b/qse/samples/awk/awk05.cpp index b7d548ab..a10c9eec 100644 --- a/qse/samples/awk/awk05.cpp +++ b/qse/samples/awk/awk05.cpp @@ -20,10 +20,10 @@ #include #include -static void print_error (unsigned long line, const qse_char_t* msg) +static void print_error (const qse_awk_loc_t& loc, const qse_char_t* msg) { - if (line > 0) - qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu\n"), msg, line); + if (loc.lin > 0 || loc.col > 0) + qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu COLUMN %lu\n"), msg, loc.lin, loc.col); else qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), msg); @@ -61,7 +61,11 @@ static int awk_main (int argc, qse_char_t* argv[]) int ret = awk.open (); if (ret >= 0) ret = run_awk (awk); - if (ret <= -1) print_error (awk.getErrorLine(), awk.getErrorMessage()); + if (ret <= -1) + { + qse_awk_loc_t loc = awk.getErrorLocation(); + print_error (loc, awk.getErrorMessage()); + } awk.close (); return ret; diff --git a/qse/samples/awk/awk06.cpp b/qse/samples/awk/awk06.cpp index fd4781ad..eaf67963 100644 --- a/qse/samples/awk/awk06.cpp +++ b/qse/samples/awk/awk06.cpp @@ -20,10 +20,10 @@ #include #include -static void print_error (unsigned long line, const qse_char_t* msg) +static void print_error (const qse_awk_loc_t& loc, const qse_char_t* msg) { - if (line > 0) - qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu\n"), msg, line); + if (loc.lin > 0 || loc.col > 0) + qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu COLUMN %lu\n"), msg, loc.lin, loc.col); else qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), msg); @@ -88,7 +88,11 @@ static int awk_main (int argc, qse_char_t* argv[]) int ret = awk.open(); if (ret >= 0) ret = run_awk (awk); - if (ret <= -1) print_error (awk.getErrorLine(), awk.getErrorMessage()); + if (ret <= -1) + { + qse_awk_loc_t loc = awk.getErrorLocation(); + print_error (loc, awk.getErrorMessage()); + } awk.close (); return -1; diff --git a/qse/samples/awk/awk07.cpp b/qse/samples/awk/awk07.cpp index 3dbda831..9de3195c 100644 --- a/qse/samples/awk/awk07.cpp +++ b/qse/samples/awk/awk07.cpp @@ -20,10 +20,10 @@ #include #include -static void print_error (unsigned long line, const qse_char_t* msg) +static void print_error (const qse_awk_loc_t& loc, const qse_char_t* msg) { - if (line > 0) - qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu\n"), msg, line); + if (loc.lin > 0 || loc.col > 0) + qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s at LINE %lu COLUMN %lu\n"), msg, loc.lin, loc.col); else qse_fprintf (QSE_STDERR, QSE_T("ERROR: %s\n"), msg); @@ -123,7 +123,11 @@ static int awk_main (int argc, qse_char_t* argv[]) QSE::StdAwk::OPT_RESET); if (ret >= 0) ret = run_awk (awk); - if (ret <= -1) print_error (awk.getErrorLine(), awk.getErrorMessage()); + if (ret <= -1) + { + qse_awk_loc_t loc = awk.getErrorLocation(); + print_error (loc, awk.getErrorMessage()); + } awk.close (); return -1; diff --git a/qse/samples/awk/awk08.cpp b/qse/samples/awk/awk08.cpp index c691acdd..6cbcc497 100644 --- a/qse/samples/awk/awk08.cpp +++ b/qse/samples/awk/awk08.cpp @@ -173,9 +173,11 @@ static void print_error (const qse_char_t* fmt, ...) static void print_error (MyAwk& awk) { + MyAwk::loc_t loc = awk.getErrorLocation(); + print_error ( QSE_T("LINE [%u] %s\n"), - (unsigned)awk.getErrorLine(), + (unsigned)loc.lin, awk.getErrorMessage() ); }