enhanced error location handling for awk

This commit is contained in:
2009-08-26 03:50:07 +00:00
parent 48aa3f2d34
commit 9253c8644f
15 changed files with 746 additions and 682 deletions

View File

@ -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)
/////////////////////////////////
/////////////////////////////////

View File

@ -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;

View File

@ -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
{

View File

@ -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;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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