improved sed error handling
This commit is contained in:
		| @ -44,7 +44,7 @@ static qse_ssize_t in ( | ||||
| 						qse_cstr_t errarg; | ||||
| 						errarg.ptr = g_infile; | ||||
| 						errarg.len = qse_strlen(g_infile); | ||||
| 						qse_sed_seterror (sed, QSE_SED_EIOFIL, 0, &errarg); | ||||
| 						qse_sed_seterror (sed, QSE_SED_EIOFIL, &errarg, QSE_NULL); | ||||
| 						return -1; | ||||
| 					} | ||||
| 				} | ||||
| @ -209,13 +209,14 @@ int sed_main (int argc, qse_char_t* argv[]) | ||||
|  | ||||
| 	if (qse_sed_comp (sed, g_script, qse_strlen(g_script)) == -1) | ||||
| 	{ | ||||
| 		qse_size_t errlin = qse_sed_geterrlin(sed); | ||||
| 		if (errlin > 0) | ||||
| 		const qse_sed_loc_t* errloc = qse_sed_geterrloc(sed); | ||||
| 		if (errloc->lin > 0 || errloc->col > 0) | ||||
| 		{ | ||||
| 			qse_fprintf (QSE_STDERR,  | ||||
| 				QSE_T("cannot compile - %s at line %lu\n"), | ||||
| 				QSE_T("cannot compile - %s at line %lu column %lu\n"), | ||||
| 				qse_sed_geterrmsg(sed), | ||||
| 				(unsigned long)errlin | ||||
| 				(unsigned long)errloc->lin, | ||||
| 				(unsigned long)errloc->col | ||||
| 			); | ||||
| 		} | ||||
| 		else | ||||
| @ -230,13 +231,14 @@ int sed_main (int argc, qse_char_t* argv[]) | ||||
|  | ||||
| 	if (qse_sed_exec (sed, in, out) == -1) | ||||
| 	{ | ||||
| 		qse_size_t errlin = qse_sed_geterrlin(sed); | ||||
| 		if (errlin > 0) | ||||
| 		const qse_sed_loc_t* errloc = qse_sed_geterrloc(sed); | ||||
| 		if (errloc->lin > 0 || errloc->col > 0) | ||||
| 		{ | ||||
| 			qse_fprintf (QSE_STDERR,  | ||||
| 				QSE_T("cannot execute - %s at line %lu\n"), | ||||
| 				QSE_T("cannot execute - %s at line %lu column %lu\n"), | ||||
| 				qse_sed_geterrmsg(sed), | ||||
| 				(unsigned long)errlin | ||||
| 				(unsigned long)errloc->lin, | ||||
| 				(unsigned long)errloc->col | ||||
| 			); | ||||
| 		} | ||||
| 		else | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: Sed.hpp 258 2009-08-19 14:04:15Z hyunghwan.chung $ | ||||
|  * $Id: Sed.hpp 269 2009-08-26 03:03:51Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -36,8 +36,10 @@ QSE_BEGIN_NAMESPACE(QSE) | ||||
| class Sed: public Mmgr | ||||
| { | ||||
| public: | ||||
| 	/// Type sed_t type redefines a stream editor type | ||||
| 	/// The sed_t type redefines a stream editor type | ||||
| 	typedef qse_sed_t sed_t; | ||||
| 	/// The loc_t type redefines the location type	 | ||||
| 	typedef qse_sed_loc_t loc_t; | ||||
| 	/// The errnum_t type redefines an error number type | ||||
| 	typedef qse_sed_errnum_t errnum_t;  | ||||
| 	/// The errstr_t type redefines an error formattering string getter type | ||||
| @ -138,11 +140,12 @@ public: | ||||
| 	const char_t* getErrorMessage() const; | ||||
|  | ||||
| 	/** | ||||
| 	 * The getErrorLine() function gets the number of the line where | ||||
| 	 * the last error occurred. It returns 0 if the stream editor has  | ||||
| 	 * not been initialized with the open() function. | ||||
| 	 * The getErrorLocation() function gets the location where | ||||
| 	 * the last error occurred. The line and the column of the ::loc_t  | ||||
| 	 * structure retruend are 0 if the stream editor has not been  | ||||
| 	 * initialized with the open() function. | ||||
| 	 */ | ||||
| 	size_t getErrorLine () const; | ||||
| 	loc_t getErrorLocation () const; | ||||
|  | ||||
| 	/** | ||||
| 	 * The getErrorNumber() function gets the number of the last  | ||||
| @ -155,9 +158,10 @@ public: | ||||
| 	 * The setError() function sets information on an error occurred. | ||||
| 	 */ | ||||
| 	void setError ( | ||||
| 		errnum_t      err,             ///< an error number | ||||
| 		const cstr_t* args = QSE_NULL, ///< strings for formatting an error message | ||||
| 		size_t        lin = 0          ///< a line number | ||||
| 		errnum_t      num,             ///< error number | ||||
| 		const cstr_t* args = QSE_NULL, ///< string array for formatting | ||||
| 		                               ///  an error message | ||||
| 		const loc_t*  loc = QSE_NULL   ///< error location | ||||
| 	); | ||||
|  | ||||
| 	/** | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: sed.h 268 2009-08-25 13:07:54Z hyunghwan.chung $ | ||||
|  * $Id: sed.h 269 2009-08-26 03:03:51Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -304,11 +304,11 @@ qse_sed_errnum_t qse_sed_geterrnum ( | ||||
| ); | ||||
|  | ||||
| /** | ||||
|  * The qse_sed_geterrlin() function gets the number of the line where | ||||
|  * the last error has occurred. | ||||
|  * @return the line number of the last error | ||||
|  * The qse_sed_geterrloc() function gets the location where the last error  | ||||
|  * has occurred. | ||||
|  * @return error location | ||||
|  */ | ||||
| qse_size_t qse_sed_geterrlin ( | ||||
| const qse_sed_loc_t* qse_sed_geterrloc ( | ||||
| 	qse_sed_t* sed /**< stream editor */ | ||||
| ); | ||||
|  | ||||
| @ -321,15 +321,15 @@ const qse_char_t* qse_sed_geterrmsg ( | ||||
| ); | ||||
|  | ||||
| /** | ||||
|  * The qse_sed_geterror() function gets an error number, an error line, and  | ||||
|  * an error message. The information is set to the memory area pointed to by | ||||
|  * each parameter. | ||||
|  * The qse_sed_geterror() function gets an error number, an error location,  | ||||
|  * and an error message. The information is set to the memory area pointed  | ||||
|  * to by each parameter. | ||||
|  */ | ||||
| void qse_sed_geterror ( | ||||
| 	qse_sed_t*         sed,    /**< stream editor */ | ||||
| 	qse_sed_errnum_t*  errnum, /**< pointer to an error number holder */ | ||||
| 	qse_size_t*        errlin, /**< pointer to an error line holder */ | ||||
| 	const qse_char_t** errmsg  /**< pointer to an error message */ | ||||
| 	qse_sed_errnum_t*  errnum, /**< error number */ | ||||
| 	const qse_char_t** errmsg, /**< error message */ | ||||
| 	qse_sed_loc_t*     errloc  /**< error location */ | ||||
| ); | ||||
|  | ||||
| /** | ||||
| @ -347,22 +347,23 @@ void qse_sed_seterrnum ( | ||||
|  * message for a given error number. | ||||
|  */ | ||||
| void qse_sed_seterrmsg ( | ||||
|         qse_sed_t*        sed,    /**< stream editor */ | ||||
| 	qse_sed_errnum_t  errnum, /**< error number */ | ||||
|         const qse_char_t* errmsg, /**< error message */ | ||||
| 	qse_size_t errlin         /**< error line */ | ||||
|         qse_sed_t*        sed,      /**< stream editor */ | ||||
| 	qse_sed_errnum_t  errnum,   /**< error number */ | ||||
|         const qse_char_t* errmsg,   /**< error message */ | ||||
| 	const qse_sed_loc_t* errloc /**< error location */ | ||||
| ); | ||||
|  | ||||
| /** | ||||
|  * The qse_sed_seterror() function sets an error number, an error line, and | ||||
|  * The qse_sed_seterror() function sets an error number, an error location, and | ||||
|  * an error message. An error string is composed of a formatting string | ||||
|  * and an array of formatting parameters. | ||||
|  */ | ||||
| void qse_sed_seterror ( | ||||
| 	qse_sed_t*        sed,    /**< stream editor */ | ||||
| 	qse_sed_errnum_t  errnum, /**< error number */ | ||||
| 	const qse_cstr_t* errarg, /**< argument array for formatting error message */ | ||||
| 	qse_size_t        errlin  /**< error line */ | ||||
| 	qse_sed_t*           sed,    /**< stream editor */ | ||||
| 	qse_sed_errnum_t     errnum, /**< error number */ | ||||
| 	const qse_cstr_t*    errarg, /**< array of arguments for formatting  | ||||
| 	                              *   an error message */ | ||||
| 	const qse_sed_loc_t* errloc  /**< error location */ | ||||
| ); | ||||
|  | ||||
| /** | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: err.c 267 2009-08-25 09:50:07Z hyunghwan.chung $ | ||||
|  * $Id: err.c 269 2009-08-26 03:03:51Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -195,13 +195,13 @@ void qse_awk_geterror ( | ||||
| 	const qse_char_t** errmsg, qse_awk_loc_t* errloc) | ||||
| { | ||||
| 	if (errnum != QSE_NULL) *errnum = awk->errinf.num; | ||||
| 	if (errloc != QSE_NULL) *errloc = awk->errinf.loc; | ||||
| 	if (errmsg != QSE_NULL)  | ||||
| 	{ | ||||
| 		*errmsg = (awk->errinf.msg[0] == QSE_T('\0'))? | ||||
| 			qse_awk_geterrstr(awk)(awk,awk->errinf.num): | ||||
| 			awk->errinf.msg; | ||||
| 	} | ||||
| 	if (errloc != QSE_NULL) *errloc = awk->errinf.loc; | ||||
| } | ||||
|  | ||||
| void qse_awk_seterrnum ( | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: Sed.cpp 257 2009-08-17 12:10:30Z hyunghwan.chung $ | ||||
|  * $Id: Sed.cpp 269 2009-08-26 03:03:51Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -91,9 +91,15 @@ const Sed::char_t* Sed::getErrorMessage () const | ||||
| 	return (sed == QSE_NULL)? QSE_T(""): qse_sed_geterrmsg (sed); | ||||
| } | ||||
|  | ||||
| Sed::size_t Sed::getErrorLine () const | ||||
| Sed::loc_t Sed::getErrorLocation () const | ||||
| { | ||||
| 	return (sed == QSE_NULL)? 0: qse_sed_geterrlin (sed); | ||||
| 	if (sed == QSE_NULL)  | ||||
| 	{ | ||||
| 		loc_t loc; | ||||
| 		loc.lin = 0; loc.col = 0; | ||||
| 		return loc; | ||||
| 	} | ||||
| 	return *qse_sed_geterrloc (sed); | ||||
| } | ||||
|  | ||||
| Sed::errnum_t Sed::getErrorNumber () const | ||||
| @ -101,10 +107,10 @@ Sed::errnum_t Sed::getErrorNumber () const | ||||
| 	return (sed == QSE_NULL)? QSE_SED_ENOERR: qse_sed_geterrnum (sed); | ||||
| } | ||||
|  | ||||
| void Sed::setError (errnum_t err, const cstr_t* args, size_t lin) | ||||
| void Sed::setError (errnum_t err, const cstr_t* args, const loc_t* loc) | ||||
| { | ||||
| 	QSE_ASSERT (sed != QSE_NULL); | ||||
| 	qse_sed_seterror (sed, err, args, lin); | ||||
| 	qse_sed_seterror (sed, err, args, loc); | ||||
| } | ||||
|  | ||||
| Sed::size_t Sed::getConsoleLine () | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: err.c 257 2009-08-17 12:10:30Z hyunghwan.chung $ | ||||
|  * $Id: err.c 269 2009-08-26 03:03:51Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -17,6 +17,7 @@ | ||||
|  */ | ||||
|  | ||||
| #include "sed.h" | ||||
| #include "../cmn/mem.h" | ||||
|  | ||||
| const qse_char_t* qse_sed_dflerrstr (qse_sed_t* sed, qse_sed_errnum_t errnum) | ||||
| { | ||||
| @ -72,9 +73,9 @@ qse_sed_errnum_t qse_sed_geterrnum (qse_sed_t* sed) | ||||
| 	return sed->errnum; | ||||
| } | ||||
|  | ||||
| qse_size_t qse_sed_geterrlin (qse_sed_t* sed) | ||||
| const qse_sed_loc_t* qse_sed_geterrloc (qse_sed_t* sed) | ||||
| { | ||||
| 	return sed->errlin; | ||||
| 	return &sed->errloc; | ||||
| } | ||||
|  | ||||
| const qse_char_t* qse_sed_geterrmsg (qse_sed_t* sed) | ||||
| @ -85,44 +86,47 @@ const qse_char_t* qse_sed_geterrmsg (qse_sed_t* sed) | ||||
|  | ||||
| void qse_sed_geterror ( | ||||
| 	qse_sed_t* sed, qse_sed_errnum_t* errnum,  | ||||
| 	qse_size_t* errlin, const qse_char_t** errmsg) | ||||
| 	const qse_char_t** errmsg, qse_sed_loc_t* errloc) | ||||
| { | ||||
| 	if (errnum != QSE_NULL) *errnum = sed->errnum; | ||||
| 	if (errlin != QSE_NULL) *errlin = sed->errlin; | ||||
| 	if (errmsg != QSE_NULL)  | ||||
| 	{ | ||||
| 		*errmsg = (sed->errmsg[0] == QSE_T('\0'))? | ||||
| 			qse_sed_geterrstr(sed)(sed,sed->errnum): | ||||
| 			sed->errmsg; | ||||
| 	} | ||||
| 	if (errloc != QSE_NULL) *errloc = sed->errloc; | ||||
| } | ||||
|  | ||||
| void qse_sed_seterrnum ( | ||||
| 	qse_sed_t* sed, qse_sed_errnum_t errnum, const qse_cstr_t* errarg) | ||||
| { | ||||
| 	qse_sed_seterror (sed, errnum, errarg, 0); | ||||
| 	qse_sed_seterror (sed, errnum, errarg, QSE_NULL); | ||||
| } | ||||
|  | ||||
| void qse_sed_seterrmsg ( | ||||
| 	qse_sed_t* sed, qse_sed_errnum_t errnum, | ||||
| 	const qse_char_t* errmsg, qse_size_t errlin) | ||||
| 	const qse_char_t* errmsg, const qse_sed_loc_t* errloc) | ||||
| { | ||||
| 	sed->errnum = errnum; | ||||
| 	sed->errlin = errlin; | ||||
| 	qse_strxcpy (sed->errmsg, QSE_COUNTOF(sed->errmsg), errmsg); | ||||
| 	if (errloc != QSE_NULL) sed->errloc = *errloc; | ||||
| 	else QSE_MEMSET (&sed->errloc, 0, QSE_SIZEOF(sed->errloc)); | ||||
| } | ||||
|  | ||||
| void qse_sed_seterror ( | ||||
| 	qse_sed_t* sed, qse_sed_errnum_t errnum, | ||||
| 	const qse_cstr_t* errarg, qse_size_t errlin) | ||||
| 	const qse_cstr_t* errarg, const qse_sed_loc_t* errloc) | ||||
| { | ||||
| 	const qse_char_t* errfmt; | ||||
|  | ||||
| 	sed->errnum = errnum; | ||||
| 	sed->errlin = errlin; | ||||
|  | ||||
| 	errfmt = qse_sed_geterrstr(sed)(sed,sed->errnum); | ||||
| 	QSE_ASSERT (errfmt != QSE_NULL); | ||||
| 	qse_strxfncpy (sed->errmsg, QSE_COUNTOF(sed->errmsg), errfmt, errarg); | ||||
|  | ||||
| 	if (errloc != QSE_NULL) sed->errloc = *errloc; | ||||
| 	else QSE_MEMSET (&sed->errloc, 0, QSE_SIZEOF(sed->errloc)); | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: sed.c 268 2009-08-25 13:07:54Z hyunghwan.chung $ | ||||
|  * $Id: sed.c 269 2009-08-26 03:03:51Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -29,14 +29,14 @@ static void free_all_command_blocks (qse_sed_t* sed); | ||||
| static qse_sed_t* qse_sed_init (qse_sed_t* sed, qse_mmgr_t* mmgr); | ||||
| static void qse_sed_fini (qse_sed_t* sed); | ||||
|  | ||||
| #define SETERR0(sed,num,line) \ | ||||
| do { qse_sed_seterror (sed, num, QSE_NULL, line); } while (0) | ||||
| #define SETERR0(sed,num,loc) \ | ||||
| do { qse_sed_seterror (sed, num, QSE_NULL, loc); } while (0) | ||||
|  | ||||
| #define SETERR1(sed,num,line,argp,argl) \ | ||||
| #define SETERR1(sed,num,argp,argl,loc) \ | ||||
| do { \ | ||||
| 	qse_cstr_t __ea__; \ | ||||
| 	__ea__.ptr = argp; __ea__.len = argl; \ | ||||
| 	qse_sed_seterror (sed, num, &__ea__, line); \ | ||||
| 	qse_sed_seterror (sed, num, &__ea__, loc); \ | ||||
| } while (0) | ||||
|  | ||||
| qse_sed_t* qse_sed_open (qse_mmgr_t* mmgr, qse_size_t xtn) | ||||
| @ -79,14 +79,14 @@ static qse_sed_t* qse_sed_init (qse_sed_t* sed, qse_mmgr_t* mmgr) | ||||
|  | ||||
| 	if (qse_str_init (&sed->tmp.rex, mmgr, 0) == QSE_NULL) | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		return QSE_NULL;	 | ||||
| 	}	 | ||||
|  | ||||
| 	if (qse_str_init (&sed->tmp.lab, mmgr, 0) == QSE_NULL) | ||||
| 	{ | ||||
| 		qse_str_fini (&sed->tmp.lab); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		return QSE_NULL;	 | ||||
| 	}	 | ||||
|  | ||||
| @ -94,7 +94,7 @@ static qse_sed_t* qse_sed_init (qse_sed_t* sed, qse_mmgr_t* mmgr) | ||||
| 	{ | ||||
| 		qse_str_fini (&sed->tmp.lab); | ||||
| 		qse_str_fini (&sed->tmp.rex); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		return QSE_NULL;	 | ||||
| 	} | ||||
| 	qse_map_setcopier (&sed->tmp.labs, QSE_MAP_KEY, QSE_MAP_COPIER_INLINE); | ||||
| @ -243,7 +243,7 @@ static int add_command_block (qse_sed_t* sed) | ||||
| 	b = (qse_sed_cmd_blk_t*) QSE_MMGR_ALLOC (sed->mmgr, QSE_SIZEOF(*b)); | ||||
| 	if (b == QSE_NULL) | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| @ -337,9 +337,9 @@ static void* compile_rex (qse_sed_t* sed, qse_char_t rxend) | ||||
| 		{ | ||||
| 			SETERR1 ( | ||||
| 				sed, QSE_SED_EREXIC,  | ||||
| 				sed->src.loc.lin, | ||||
| 				QSE_STR_PTR(&sed->tmp.rex), | ||||
| 				QSE_STR_LEN(&sed->tmp.rex) | ||||
| 				QSE_STR_LEN(&sed->tmp.rex), | ||||
| 				&sed->src.loc | ||||
| 			); | ||||
| 			return QSE_NULL; | ||||
| 		} | ||||
| @ -353,9 +353,9 @@ static void* compile_rex (qse_sed_t* sed, qse_char_t rxend) | ||||
| 			{ | ||||
| 				SETERR1 ( | ||||
| 					sed, QSE_SED_EREXIC,  | ||||
| 					sed->src.loc.lin, | ||||
| 					QSE_STR_PTR(&sed->tmp.rex), | ||||
| 					QSE_STR_LEN(&sed->tmp.rex) | ||||
| 					QSE_STR_LEN(&sed->tmp.rex), | ||||
| 					&sed->src.loc | ||||
| 				); | ||||
| 				return QSE_NULL; | ||||
| 			} | ||||
| @ -366,7 +366,7 @@ static void* compile_rex (qse_sed_t* sed, qse_char_t rxend) | ||||
|  | ||||
| 		if (qse_str_ccat (&sed->tmp.rex, c) == (qse_size_t)-1) | ||||
| 		{ | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 			return QSE_NULL; | ||||
| 		} | ||||
| 	}  | ||||
| @ -382,9 +382,10 @@ static void* compile_rex (qse_sed_t* sed, qse_char_t rxend) | ||||
| 	if (code == QSE_NULL) | ||||
| 	{ | ||||
| 		SETERR1 ( | ||||
| 			sed, QSE_SED_EREXBL, sed->src.loc.lin, | ||||
| 			sed, QSE_SED_EREXBL, | ||||
| 			QSE_STR_PTR(&sed->tmp.rex), | ||||
| 			QSE_STR_LEN(&sed->tmp.rex) | ||||
| 			QSE_STR_LEN(&sed->tmp.rex), | ||||
| 			&sed->src.loc | ||||
| 		); | ||||
| 		return QSE_NULL; | ||||
| 	} | ||||
| @ -431,7 +432,7 @@ static qse_sed_adr_t* get_address (qse_sed_t* sed, qse_sed_adr_t* a) | ||||
| 		if (c == QSE_CHAR_EOF || c == QSE_T('\n')) | ||||
| 		{ | ||||
| 			SETERR1 (sed, QSE_SED_EREXIC,  | ||||
| 				sed->src.loc.lin, QSE_T(""), 0); | ||||
| 				QSE_T(""), 0, &sed->src.loc); | ||||
| 			return QSE_NULL; | ||||
| 		} | ||||
|  | ||||
| @ -461,7 +462,7 @@ static int get_text (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| do { \ | ||||
| 	if (qse_str_ccat (str, c) == (qse_size_t)-1) \ | ||||
| 	{ \ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); \ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); \ | ||||
| 		goto errlabel; \ | ||||
| 	} \ | ||||
| } while (0) | ||||
| @ -542,7 +543,7 @@ static int get_label (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	if (!IS_LABC(c)) | ||||
| 	{ | ||||
| 		/* label name is empty */ | ||||
| 		SETERR0 (sed, QSE_SED_ELABEM, sed->src.loc.lin); | ||||
| 		SETERR0 (sed, QSE_SED_ELABEM, &sed->src.loc); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| @ -552,7 +553,7 @@ static int get_label (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	{ | ||||
| 		if (qse_str_ccat (&sed->tmp.lab, c) == (qse_size_t)-1)  | ||||
| 		{ | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 			return -1; | ||||
| 		}  | ||||
| 		c = NXTSC (sed); | ||||
| @ -564,8 +565,12 @@ static int get_label (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 		QSE_STR_PTR(&sed->tmp.lab), | ||||
| 		QSE_STR_LEN(&sed->tmp.lab)) != QSE_NULL) | ||||
| 	{ | ||||
| 		SETERR1 (sed, QSE_SED_ELABDU, sed->src.loc.lin,  | ||||
| 			QSE_STR_PTR(&sed->tmp.lab), QSE_STR_LEN(&sed->tmp.lab)); | ||||
| 		SETERR1 ( | ||||
| 			sed, QSE_SED_ELABDU, | ||||
| 			QSE_STR_PTR(&sed->tmp.lab), | ||||
| 			QSE_STR_LEN(&sed->tmp.lab), | ||||
| 			&sed->src.loc | ||||
| 		); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| @ -574,7 +579,7 @@ static int get_label (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 		QSE_STR_PTR(&sed->tmp.lab), QSE_STR_LEN(&sed->tmp.lab), | ||||
| 		cmd, 0) == QSE_NULL) | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| @ -598,7 +603,7 @@ static int terminate_command (qse_sed_t* sed) | ||||
| 	while (IS_SPACE(c)) c = NXTSC (sed); | ||||
| 	if (!IS_CMDTERM(c)) | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_ESCEXP, sed->src.loc.lin); | ||||
| 		SETERR0 (sed, QSE_SED_ESCEXP, &sed->src.loc); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| @ -637,7 +642,7 @@ static int get_branch_target (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	t = qse_str_open (sed->mmgr, 0, 32); | ||||
| 	if (t == QSE_NULL)  | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -645,7 +650,7 @@ static int get_branch_target (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	{ | ||||
| 		if (qse_str_ccat (t, c) == (qse_size_t)-1)  | ||||
| 		{ | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 			goto oops; | ||||
| 		}  | ||||
|  | ||||
| @ -688,14 +693,14 @@ static int get_file (qse_sed_t* sed, qse_xstr_t* xstr) | ||||
|  | ||||
| 	if (IS_CMDTERM(c)) | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_EFILEM, sed->src.loc.lin); | ||||
| 		SETERR0 (sed, QSE_SED_EFILEM, &sed->src.loc); | ||||
| 		goto oops;	 | ||||
| 	} | ||||
|  | ||||
| 	t = qse_str_open (sed->mmgr, 0, 32); | ||||
| 	if (t == QSE_NULL)  | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -704,7 +709,7 @@ static int get_file (qse_sed_t* sed, qse_xstr_t* xstr) | ||||
| 		if (c == QSE_T('\0')) | ||||
| 		{ | ||||
| 			/* the file name should not contain '\0' */ | ||||
| 			SETERR0 (sed, QSE_SED_EFILIL, sed->src.loc.lin); | ||||
| 			SETERR0 (sed, QSE_SED_EFILIL, &sed->src.loc); | ||||
| 			goto oops; | ||||
| 		} | ||||
|  | ||||
| @ -716,7 +721,7 @@ static int get_file (qse_sed_t* sed, qse_xstr_t* xstr) | ||||
| 			c = NXTSC (sed); | ||||
| 			if (c == QSE_T('\0') || c == QSE_CHAR_EOF || IS_LINTERM(c)) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_EFILIL, sed->src.loc.lin); | ||||
| 				SETERR0 (sed, QSE_SED_EFILIL, &sed->src.loc); | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| @ -725,7 +730,7 @@ static int get_file (qse_sed_t* sed, qse_xstr_t* xstr) | ||||
|  | ||||
| 		if (qse_str_ccat (t, c) == (qse_size_t)-1)  | ||||
| 		{ | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, sed->src.loc.lin); | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, &sed->src.loc); | ||||
| 			goto oops; | ||||
| 		}  | ||||
|  | ||||
| @ -754,8 +759,7 @@ do { \ | ||||
| 	if (c == QSE_CHAR_EOF || IS_LINTERM(c)) \ | ||||
| 	{ \ | ||||
| 		SETERR1 (sed, QSE_SED_ECMDIC, \ | ||||
| 			sed->src.loc.lin, \ | ||||
| 			&cmd->type, 1); \ | ||||
| 			&cmd->type, 1, &sed->src.loc); \ | ||||
| 		action; \ | ||||
| 	} \ | ||||
| } while (0) | ||||
| @ -773,7 +777,7 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	if (delim == QSE_T('\\')) | ||||
| 	{ | ||||
| 		/* backspace is an illegal delimiter */ | ||||
| 		SETERR0 (sed, QSE_SED_EBSDEL, sed->src.loc.lin); | ||||
| 		SETERR0 (sed, QSE_SED_EBSDEL, &sed->src.loc); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -783,7 +787,7 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	t[1] = qse_str_open (sed->mmgr, 0, 32); | ||||
| 	if (t[1] == QSE_NULL)  | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -804,7 +808,7 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
|  | ||||
| 			if (qse_str_ccat (t[i], c) == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| @ -839,7 +843,7 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
|  | ||||
| 			if (cmd->u.subst.occ != 0) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_EOCSDU, sed->src.loc.lin); | ||||
| 				SETERR0 (sed, QSE_SED_EOCSDU, &sed->src.loc); | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| @ -850,7 +854,7 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				occ = occ * 10 + (c - QSE_T('0'));  | ||||
| 				if (occ > QSE_TYPE_MAX(unsigned short)) | ||||
| 				{ | ||||
| 					SETERR0 (sed, QSE_SED_EOCSTL, sed->src.loc.lin); | ||||
| 					SETERR0 (sed, QSE_SED_EOCSTL, &sed->src.loc); | ||||
| 					goto oops; | ||||
| 				} | ||||
| 				c = NXTSC (sed);  | ||||
| @ -859,7 +863,7 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
|  | ||||
| 			if (occ == 0) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_EOCSZE, sed->src.loc.lin); | ||||
| 				SETERR0 (sed, QSE_SED_EOCSZE, &sed->src.loc); | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| @ -892,8 +896,10 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	if (cmd->u.subst.rex == QSE_NULL) | ||||
| 	{ | ||||
| 		SETERR1 ( | ||||
| 			sed, QSE_SED_EREXBL, sed->src.loc.lin, | ||||
| 			QSE_STR_PTR(t[0]), QSE_STR_LEN(t[0]) | ||||
| 			sed, QSE_SED_EREXBL, | ||||
| 			QSE_STR_PTR(t[0]),  | ||||
| 			QSE_STR_LEN(t[0]), | ||||
| 			&sed->src.loc | ||||
| 		); | ||||
| 		goto oops; | ||||
| 	}	 | ||||
| @ -922,14 +928,14 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	if (delim == QSE_T('\\')) | ||||
| 	{ | ||||
| 		/* backspace is an illegal delimiter */ | ||||
| 		SETERR0 (sed, QSE_SED_EBSDEL, sed->src.loc.lin); | ||||
| 		SETERR0 (sed, QSE_SED_EBSDEL, &sed->src.loc); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| 	t = qse_str_open (sed->mmgr, 0, 32); | ||||
| 	if (t == QSE_NULL)  | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -950,7 +956,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 		b[0] = c; | ||||
| 		if (qse_str_ncat (t, b, 2) == (qse_size_t)-1) | ||||
| 		{ | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 			goto oops; | ||||
| 		} | ||||
|  | ||||
| @ -972,7 +978,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 		if (pos >= QSE_STR_LEN(t)) | ||||
| 		{ | ||||
| 			/* source and target not the same length */ | ||||
| 			SETERR0 (sed, QSE_SED_ETSNSL, sed->src.loc.lin); | ||||
| 			SETERR0 (sed, QSE_SED_ETSNSL, &sed->src.loc); | ||||
| 			goto oops; | ||||
| 		} | ||||
|  | ||||
| @ -983,7 +989,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	if (pos < QSE_STR_LEN(t)) | ||||
| 	{ | ||||
| 		/* source and target not the same length */ | ||||
| 		SETERR0 (sed, QSE_SED_ETSNSL, sed->src.loc.lin); | ||||
| 		SETERR0 (sed, QSE_SED_ETSNSL, &sed->src.loc); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -1011,13 +1017,13 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 		default: | ||||
| 		{ | ||||
| 			qse_char_t cc = c; | ||||
| 			SETERR1 (sed, QSE_SED_ECMDNR, sed->src.loc.lin, &cc, 1); | ||||
| 			SETERR1 (sed, QSE_SED_ECMDNR, &cc, 1, &sed->src.loc); | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| 		case QSE_CHAR_EOF: | ||||
| 		case QSE_T('\n'): | ||||
| 			SETERR0 (sed, QSE_SED_ECMDMS, sed->src.loc.lin); | ||||
| 			SETERR0 (sed, QSE_SED_ECMDMS, &sed->src.loc); | ||||
| 			return -1;	 | ||||
|  | ||||
| 		case QSE_T(':'): | ||||
| @ -1026,7 +1032,7 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				/* label cannot have an address */ | ||||
| 				SETERR1 ( | ||||
| 					sed, QSE_SED_EA1PHB, | ||||
| 					sed->src.loc.lin, &cmd->type, 1 | ||||
| 					&cmd->type, 1, &sed->src.loc | ||||
| 				); | ||||
| 				return -1; | ||||
| 			} | ||||
| @ -1051,7 +1057,7 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 			if (sed->tmp.grp.level >= QSE_COUNTOF(sed->tmp.grp.cmd)) | ||||
| 			{ | ||||
| 				/* group nesting too deep */ | ||||
| 				SETERR0 (sed, QSE_SED_EGRNTD, sed->src.loc.lin); | ||||
| 				SETERR0 (sed, QSE_SED_EGRNTD, &sed->src.loc); | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| @ -1068,7 +1074,7 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				qse_char_t tmpc = c; | ||||
| 				SETERR1 ( | ||||
| 					sed, QSE_SED_EA1PHB, | ||||
| 					sed->src.loc.lin, &tmpc, 1 | ||||
| 					&tmpc, 1, &sed->src.loc | ||||
| 				); | ||||
| 				return -1; | ||||
| 			} | ||||
| @ -1078,7 +1084,7 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 			if (sed->tmp.grp.level <= 0)  | ||||
| 			{ | ||||
| 				/* group not balanced */ | ||||
| 				SETERR0 (sed, QSE_SED_EGRNBA, sed->src.loc.lin); | ||||
| 				SETERR0 (sed, QSE_SED_EGRNBA, &sed->src.loc); | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| @ -1097,7 +1103,7 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 			{ | ||||
| 				SETERR1 ( | ||||
| 					sed, QSE_SED_EA2PHB, | ||||
| 					sed->src.loc.lin, &cmd->type, 1 | ||||
| 					&cmd->type, 1, &sed->src.loc | ||||
| 				); | ||||
| 				return -1; | ||||
| 			} | ||||
| @ -1114,7 +1120,7 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				qse_char_t tmpc = c; | ||||
| 				SETERR1 ( | ||||
| 					sed, QSE_SED_EA2PHB, | ||||
| 					sed->src.loc.lin, &tmpc, 1 | ||||
| 					&tmpc, 1, &sed->src.loc | ||||
| 				); | ||||
| 				return -1; | ||||
| 			} | ||||
| @ -1127,7 +1133,7 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
|  | ||||
| 			if (c != QSE_T('\\')) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_EBSEXP, sed->src.loc.lin); | ||||
| 				SETERR0 (sed, QSE_SED_EBSEXP, &sed->src.loc); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		 | ||||
| @ -1136,7 +1142,7 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
|  | ||||
| 			if (c != QSE_CHAR_EOF && c != QSE_T('\n')) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_EGBABS, sed->src.loc.lin); | ||||
| 				SETERR0 (sed, QSE_SED_EGBABS, &sed->src.loc); | ||||
| 				return -1; | ||||
| 			} | ||||
| 			 | ||||
| @ -1155,7 +1161,7 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				qse_char_t tmpc = c; | ||||
| 				SETERR1 ( | ||||
| 					sed, QSE_SED_EA2PHB, | ||||
| 					sed->src.loc.lin, &tmpc, 1 | ||||
| 					&tmpc, 1, &sed->src.loc | ||||
| 				); | ||||
| 				return -1; | ||||
| 			} | ||||
| @ -1293,7 +1299,7 @@ int qse_sed_comp (qse_sed_t* sed, const qse_char_t* sptr, qse_size_t slen) | ||||
| 				{ | ||||
| 					if (cmd->a2.type == QSE_SED_ADR_NONE) | ||||
| 					{ | ||||
| 						SETERR0 (sed, QSE_SED_EA2MOI, sed->src.loc.lin); | ||||
| 						SETERR0 (sed, QSE_SED_EA2MOI, &sed->src.loc); | ||||
| 						free_address(sed, cmd); | ||||
| 						return -1; | ||||
| 					} | ||||
| @ -1304,7 +1310,7 @@ int qse_sed_comp (qse_sed_t* sed, const qse_char_t* sptr, qse_size_t slen) | ||||
| 					if (cmd->a1.type != QSE_SED_ADR_LINE ||  | ||||
| 					    cmd->a2.type != QSE_SED_ADR_LINE) | ||||
| 					{ | ||||
| 						SETERR0 (sed, QSE_SED_EA2MOI, sed->src.loc.lin); | ||||
| 						SETERR0 (sed, QSE_SED_EA2MOI, &sed->src.loc); | ||||
| 						free_address(sed, cmd); | ||||
| 						return -1; | ||||
| 					} | ||||
| @ -1349,7 +1355,7 @@ int qse_sed_comp (qse_sed_t* sed, const qse_char_t* sptr, qse_size_t slen) | ||||
|  | ||||
| 	if (sed->tmp.grp.level != 0) | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_EGRNBA, sed->src.loc.lin); | ||||
| 		SETERR0 (sed, QSE_SED_EGRNBA, &sed->src.loc); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| @ -1373,7 +1379,7 @@ static int read_char (qse_sed_t* sed, qse_char_t* c) | ||||
| 			if (n <= -1)  | ||||
| 			{ | ||||
| 				if (sed->errnum == QSE_SED_ENOERR) | ||||
| 					SETERR0 (sed, QSE_SED_EIOUSR, 0); | ||||
| 					SETERR0 (sed, QSE_SED_EIOUSR, QSE_NULL); | ||||
| 				return -1; | ||||
| 			} | ||||
| 	 | ||||
| @ -1413,7 +1419,7 @@ static int read_file ( | ||||
| 	if (n <= -1) | ||||
| 	{ | ||||
| 		/*if (sed->errnum != QSE_SED_ENOERR) | ||||
| 		 *	SETERR0 (sed, QSE_SED_EIOUSR, cmd->loc.lin); | ||||
| 		 *	SETERR0 (sed, QSE_SED_EIOUSR, &cmd->loc); | ||||
| 		 *return -1;*/ | ||||
| 		/* it is ok if it is not able to open a file */ | ||||
| 		return 0;	 | ||||
| @ -1436,8 +1442,8 @@ static int read_file ( | ||||
| 		{ | ||||
| 			sed->e.in.fun (sed, QSE_SED_IO_CLOSE, &arg); | ||||
| 			if (sed->errnum == QSE_SED_ENOERR) | ||||
| 				SETERR1 (sed, QSE_SED_EIOFIL, 0, path, plen); | ||||
| 			sed->errlin = cmd->loc.lin; | ||||
| 				SETERR1 (sed, QSE_SED_EIOFIL, path, plen, &cmd->loc); | ||||
| 			else sed->errloc = cmd->loc; | ||||
| 			return -1; | ||||
| 		} | ||||
| 		if (n == 0) break; | ||||
| @ -1451,7 +1457,7 @@ static int read_file ( | ||||
| 				if (qse_str_ccat (&sed->e.txt.read, buf[i]) == (qse_size_t)-1) | ||||
| 				{ | ||||
| 					sed->e.in.fun (sed, QSE_SED_IO_CLOSE, &arg); | ||||
| 					SETERR0 (sed, QSE_SED_ENOMEM, cmd->loc.lin); | ||||
| 					SETERR0 (sed, QSE_SED_ENOMEM, &cmd->loc); | ||||
| 					return -1; | ||||
| 				} | ||||
|  | ||||
| @ -1464,7 +1470,7 @@ static int read_file ( | ||||
| 			if (qse_str_ncat (&sed->e.txt.read, buf, n) == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				sed->e.in.fun (sed, QSE_SED_IO_CLOSE, &arg); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, cmd->loc.lin); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, &cmd->loc); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
| @ -1508,7 +1514,7 @@ static int read_line (qse_sed_t* sed, int append) | ||||
|  | ||||
| 		if (qse_str_ccat (&sed->e.in.line, c) == (qse_size_t)-1) | ||||
| 		{ | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 			return -1; | ||||
| 		} | ||||
| 		len++;	 | ||||
| @ -1537,7 +1543,7 @@ static int flush (qse_sed_t* sed) | ||||
| 		if (n <= -1) | ||||
| 		{ | ||||
| 			if (sed->errnum == QSE_SED_ENOERR) | ||||
| 				SETERR0 (sed, QSE_SED_EIOUSR, 0); | ||||
| 				SETERR0 (sed, QSE_SED_EIOUSR, QSE_NULL); | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| @ -1545,7 +1551,7 @@ static int flush (qse_sed_t* sed) | ||||
| 		{ | ||||
| 			/* reached the end of file - this is also an error */ | ||||
| 			if (sed->errnum == QSE_SED_ENOERR) | ||||
| 				SETERR0 (sed, QSE_SED_EIOUSR, 0); | ||||
| 				SETERR0 (sed, QSE_SED_EIOUSR, QSE_NULL); | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| @ -1738,7 +1744,7 @@ static int write_str_to_file ( | ||||
| 			(void*)path, plen, &arg, QSE_SIZEOF(arg)); | ||||
| 		if (pair == QSE_NULL) | ||||
| 		{ | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, cmd->loc.lin); | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, &cmd->loc); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
| @ -1752,8 +1758,8 @@ static int write_str_to_file ( | ||||
| 		if (n <= -1) | ||||
| 		{ | ||||
| 			if (sed->errnum == QSE_SED_ENOERR) | ||||
| 				SETERR1 (sed, QSE_SED_EIOFIL, 0, path, plen); | ||||
| 			sed->errlin = cmd->loc.lin; | ||||
| 				SETERR1 (sed, QSE_SED_EIOFIL, path, plen, &cmd->loc); | ||||
| 			else sed->errloc = cmd->loc; | ||||
| 			return -1; | ||||
| 		} | ||||
| 		if (n == 0) | ||||
| @ -1763,7 +1769,7 @@ static int write_str_to_file ( | ||||
| 			 * a requested string */ | ||||
| 			sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap); | ||||
| 			ap->handle = QSE_NULL; | ||||
| 			SETERR1 (sed, QSE_SED_EIOFIL, cmd->loc.lin, path, plen); | ||||
| 			SETERR1 (sed, QSE_SED_EIOFIL, path, plen, &cmd->loc); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
| @ -1779,8 +1785,8 @@ static int write_str_to_file ( | ||||
| 			sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap); | ||||
| 			ap->handle = QSE_NULL; | ||||
| 			if (sed->errnum == QSE_SED_ENOERR) | ||||
| 				SETERR1 (sed, QSE_SED_EIOFIL, 0, path, plen); | ||||
| 			sed->errlin = cmd->loc.lin; | ||||
| 				SETERR1 (sed, QSE_SED_EIOFIL, path, plen, &cmd->loc); | ||||
| 			sed->errloc = cmd->loc; | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| @ -1790,7 +1796,7 @@ static int write_str_to_file ( | ||||
| 			 * it is also an error as it can't write any more */ | ||||
| 			sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap); | ||||
| 			ap->handle = QSE_NULL; | ||||
| 			SETERR1 (sed, QSE_SED_EIOFIL, cmd->loc.lin, path, plen); | ||||
| 			SETERR1 (sed, QSE_SED_EIOFIL, path, plen, &cmd->loc); | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| @ -1849,7 +1855,7 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
|  | ||||
| 		if (n <= -1) | ||||
| 		{ | ||||
| 			SETERR0 (sed, QSE_SED_EREXMA, cmd->loc.lin); | ||||
| 			SETERR0 (sed, QSE_SED_EREXMA, &cmd->loc); | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| @ -1860,7 +1866,7 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				&sed->e.txt.subst, | ||||
| 				cur_ptr, cur_len) == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 				return -1; | ||||
| 			} | ||||
| 			break; | ||||
| @ -1884,7 +1890,7 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
|  | ||||
| 			if (m == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
| @ -1896,7 +1902,7 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				&sed->e.txt.subst, cur_ptr, mat.ptr-cur_ptr); | ||||
| 			if (m == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| @ -1925,7 +1931,7 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
|  | ||||
| 				if (m == (qse_size_t)-1) | ||||
| 				{ | ||||
| 					SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 					SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 					return -1; | ||||
| 				} | ||||
| 			} | ||||
| @ -1945,7 +1951,7 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 			m = qse_str_ncat (&sed->e.txt.subst, cur_ptr, 1); | ||||
| 			if (m == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| @ -1959,7 +1965,7 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 		m = qse_str_ccat (&sed->e.txt.subst, QSE_T('\n')); | ||||
| 		if (m == (qse_size_t)-1) | ||||
| 		{ | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
| @ -2029,7 +2035,7 @@ static int match_a (qse_sed_t* sed, qse_sed_cmd_t* cmd, qse_sed_adr_t* a) | ||||
| 				&match, &errnum); | ||||
| 			if (n <= -1) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_EREXMA, cmd->loc.lin); | ||||
| 				SETERR0 (sed, QSE_SED_EREXMA, &cmd->loc); | ||||
| 				return -1; | ||||
| 			}			 | ||||
|  | ||||
| @ -2186,7 +2192,7 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				QSE_LDA_SIZE(&sed->e.txt.appended),	 | ||||
| 				&cmd->u.text, 0) == (qse_size_t)-1)  | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL; | ||||
| 			} | ||||
| 			break; | ||||
| @ -2208,7 +2214,7 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 					QSE_STR_LEN(&cmd->u.text)); | ||||
| 				if (n == (qse_size_t)-1)  | ||||
| 				{ | ||||
| 					SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 					SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 					return QSE_NULL; | ||||
| 				} | ||||
| 			} | ||||
| @ -2300,7 +2306,7 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				QSE_STR_PTR(&sed->e.in.line), | ||||
| 				QSE_STR_LEN(&sed->e.in.line)) == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL;	 | ||||
| 			} | ||||
| 			break; | ||||
| @ -2311,7 +2317,7 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				QSE_STR_PTR(&sed->e.in.line), | ||||
| 				QSE_STR_LEN(&sed->e.in.line)) == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL;	 | ||||
| 			} | ||||
| 			break; | ||||
| @ -2322,7 +2328,7 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				QSE_STR_PTR(&sed->e.txt.held), | ||||
| 				QSE_STR_LEN(&sed->e.txt.held)) == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL;	 | ||||
| 			} | ||||
| 			break; | ||||
| @ -2333,7 +2339,7 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				QSE_STR_PTR(&sed->e.txt.held), | ||||
| 				QSE_STR_LEN(&sed->e.txt.held)) == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 				return QSE_NULL;	 | ||||
| 			} | ||||
| 			break; | ||||
| @ -2529,7 +2535,7 @@ static int init_command_block_for_exec (qse_sed_t* sed, qse_sed_cmd_blk_t* b) | ||||
| 				{ | ||||
| 					SETERR1 ( | ||||
| 						sed, QSE_SED_ELABNF, | ||||
| 						c->loc.lin, lab->ptr, lab->len | ||||
| 						lab->ptr, lab->len, &c->loc | ||||
| 					); | ||||
| 					return -1; | ||||
| 				} | ||||
| @ -2595,7 +2601,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf) | ||||
| 	qse_str_clear (&sed->e.txt.held); | ||||
| 	if (qse_str_ccat (&sed->e.txt.held, QSE_T('\n')) == (qse_size_t)-1) | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| @ -2604,7 +2610,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf) | ||||
| 	sed->e.out.len = 0; | ||||
| 	if (qse_map_init (&sed->e.out.files, sed->mmgr, 128, 70) == QSE_NULL) | ||||
| 	{ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	*(qse_sed_t**)QSE_XTN(&sed->e.out.files) = sed; | ||||
| @ -2625,7 +2631,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf) | ||||
| 	if (qse_str_init (&sed->e.in.line, QSE_MMGR(sed), 256) == QSE_NULL) | ||||
| 	{ | ||||
| 		qse_map_fini (&sed->e.out.files); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| @ -2636,7 +2642,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf) | ||||
| 	{ | ||||
| 		ret = -1; | ||||
| 		if (sed->errnum == QSE_SED_ENOERR)  | ||||
| 			SETERR0 (sed, QSE_SED_EIOUSR, 0); | ||||
| 			SETERR0 (sed, QSE_SED_EIOUSR, QSE_NULL); | ||||
| 		goto done3; | ||||
| 	} | ||||
| 	if (n == 0)  | ||||
| @ -2653,7 +2659,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf) | ||||
| 	{ | ||||
| 		ret = -1; | ||||
| 		if (sed->errnum == QSE_SED_ENOERR)  | ||||
| 			SETERR0 (sed, QSE_SED_EIOUSR, 0); | ||||
| 			SETERR0 (sed, QSE_SED_EIOUSR, QSE_NULL); | ||||
| 		goto done2; | ||||
| 	} | ||||
| 	if (n == 0)  | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: sed.h 268 2009-08-25 13:07:54Z hyunghwan.chung $ | ||||
|  * $Id: sed.h 269 2009-08-26 03:03:51Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -143,7 +143,7 @@ struct qse_sed_t | ||||
| 	qse_sed_errstr_t errstr; /**< error string getter */ | ||||
| 	qse_sed_errnum_t errnum; /**< stores an error number */ | ||||
| 	qse_char_t errmsg[128];  /**< error message holder */ | ||||
| 	qse_size_t errlin;       /**< no of the line where an error occurred */ | ||||
| 	qse_sed_loc_t errloc;    /**< location of the last error */ | ||||
|  | ||||
| 	int option;              /**< stores options */ | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user