enhanced error location handling for awk
This commit is contained in:
		| @ -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) | ||||
| ///////////////////////////////// | ||||
| ///////////////////////////////// | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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 | ||||
| { | ||||
|  | ||||
| @ -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
											
										
									
								
							| @ -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 | ||||
|  | ||||
		Reference in New Issue
	
	Block a user