improved error handling functions in sed
This commit is contained in:
		| @ -2,7 +2,7 @@ | ||||
| AM_CPPFLAGS = -I$(top_builddir)/include | ||||
|  | ||||
| lib_LTLIBRARIES = libqsesed.la | ||||
| libqsesed_la_SOURCES = sed.c sed.h | ||||
| libqsesed_la_SOURCES = sed.c err.c sed.h | ||||
| libqsesed_la_LDFLAGS = -version-info 1:0:0 -no-undefined -L../cmn -L../utl | ||||
| libqsesed_la_LIBADD = -lqsecmn -lqseutl | ||||
|  | ||||
|  | ||||
| @ -60,7 +60,7 @@ libqsesed___la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ | ||||
| 	$(CXXFLAGS) $(libqsesed___la_LDFLAGS) $(LDFLAGS) -o $@ | ||||
| @ENABLE_CXX_TRUE@am_libqsesed___la_rpath = -rpath $(libdir) | ||||
| libqsesed_la_DEPENDENCIES = | ||||
| am_libqsesed_la_OBJECTS = sed.lo | ||||
| am_libqsesed_la_OBJECTS = sed.lo err.lo | ||||
| libqsesed_la_OBJECTS = $(am_libqsesed_la_OBJECTS) | ||||
| libqsesed_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ | ||||
| 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ | ||||
| @ -219,7 +219,7 @@ top_builddir = @top_builddir@ | ||||
| top_srcdir = @top_srcdir@ | ||||
| AM_CPPFLAGS = -I$(top_builddir)/include | ||||
| lib_LTLIBRARIES = libqsesed.la $(am__append_1) | ||||
| libqsesed_la_SOURCES = sed.c sed.h | ||||
| libqsesed_la_SOURCES = sed.c err.c sed.h | ||||
| libqsesed_la_LDFLAGS = -version-info 1:0:0 -no-undefined -L../cmn -L../utl | ||||
| libqsesed_la_LIBADD = -lqsecmn -lqseutl | ||||
| @ENABLE_CXX_TRUE@libqsesed___la_SOURCES = Sed.cpp StdSed.cpp | ||||
| @ -298,6 +298,7 @@ distclean-compile: | ||||
|  | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Sed.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/StdSed.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/err.Plo@am__quote@ | ||||
| @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sed.Plo@am__quote@ | ||||
|  | ||||
| .c.o: | ||||
|  | ||||
							
								
								
									
										147
									
								
								qse/lib/sed/err.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								qse/lib/sed/err.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,147 @@ | ||||
| /* | ||||
|  * $Id: err.c 113 2009-03-25 14:53:10Z baconevi $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
|    Licensed under the Apache License, Version 2.0 (the "License"); | ||||
|    you may not use this file except in compliance with the License. | ||||
|    You may obtain a copy of the License at | ||||
|  | ||||
|        http://www.apache.org/licenses/LICENSE-2.0 | ||||
|  | ||||
|    Unless required by applicable law or agreed to in writing, software | ||||
|    distributed under the License is distributed on an "AS IS" BASIS, | ||||
|    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
|    See the License for the specific language governing permissions and | ||||
|    limitations under the License. | ||||
|  */ | ||||
|  | ||||
| #include "sed.h" | ||||
|  | ||||
| static const qse_char_t* geterrstr (int errnum) | ||||
| { | ||||
| 	static const qse_char_t* errstr[] = | ||||
|  	{ | ||||
| 		QSE_T("no error"), | ||||
| 		QSE_T("out of memory"), | ||||
| 		QSE_T("too much text"), | ||||
| 		QSE_T("command ${0} not recognized"), | ||||
| 		QSE_T("command code missing"), | ||||
| 		QSE_T("command ${0} not terminated properly"), | ||||
| 		QSE_T("regular expression build error"), | ||||
| 		QSE_T("regular expression match error"), | ||||
| 		QSE_T("address 1 prohibited"), | ||||
| 		QSE_T("address 2 prohibited"), | ||||
| 		QSE_T("invalid step address"), | ||||
| 		QSE_T("a new line expected"), | ||||
| 		QSE_T("a backslash expected"), | ||||
| 		QSE_T("a backslash used as a delimiter"), | ||||
| 		QSE_T("garbage after a backslash"), | ||||
| 		QSE_T("a semicolon expected"), | ||||
| 		QSE_T("empty label name"), | ||||
| 		QSE_T("duplicate label name ${0}"), | ||||
| 		QSE_T("label ${0} not found"), | ||||
| 		QSE_T("empty file name"), | ||||
| 		QSE_T("illegal file name"), | ||||
| 		QSE_T("strings in translation set not the same length"), | ||||
| 		QSE_T("group brackets not balanced"), | ||||
| 		QSE_T("group nesting too deep"), | ||||
| 		QSE_T("multiple occurrence specifier"), | ||||
| 		QSE_T("occurrence specifier is zero"), | ||||
| 		QSE_T("occurrence specifier too large"), | ||||
| 		QSE_T("error returned by user io handler") | ||||
| 	}; | ||||
|  | ||||
| 	return (errnum >= 0 && errnum < QSE_COUNTOF(errstr))? | ||||
| 		errstr[errnum]: QSE_T("unknown error"); | ||||
| } | ||||
|  | ||||
| #if 0 | ||||
| const qse_char_t* qse_sed_geterrstr (qse_sed_t* sed, qse_sed_errnum_t num) | ||||
| { | ||||
| 	if (sed != QSE_NULL &&  | ||||
| 	    sed->errstr[num] != QSE_NULL) return sed->errstr[num]; | ||||
| 	return geterrstr (num); | ||||
| } | ||||
|  | ||||
| int qse_sed_seterrstr ( | ||||
| 	qse_sed_t* sed, qse_sed_errnum_t num, const qse_char_t* str) | ||||
| { | ||||
| 	qse_char_t* dup; | ||||
|         | ||||
| 	if (str == QSE_NULL) dup = QSE_NULL; | ||||
| 	else | ||||
| 	{ | ||||
| 		dup = QSE_AWK_STRDUP (sed, str); | ||||
| 		if (dup == QSE_NULL) return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (sed->errstr[num] != QSE_NULL)  | ||||
| 		QSE_AWK_FREE (sed, sed->errstr[num]); | ||||
| 	else sed->errstr[num] = dup; | ||||
| 	return 0; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| int qse_sed_geterrnum (qse_sed_t* sed) | ||||
| { | ||||
| 	return sed->errnum; | ||||
| } | ||||
|  | ||||
| qse_size_t qse_sed_geterrlin (qse_sed_t* sed) | ||||
| { | ||||
| 	return sed->errlin; | ||||
| } | ||||
|  | ||||
| const qse_char_t* qse_sed_geterrmsg (qse_sed_t* sed) | ||||
| { | ||||
| 	if (sed->errmsg[0] == QSE_T('\0'))  | ||||
| 		/*return qse_sed_geterrstr (sed, sed->errnum);*/ | ||||
| 		return geterrstr (sed->errnum); | ||||
| 	return sed->errmsg; | ||||
| } | ||||
|  | ||||
| void qse_sed_geterror ( | ||||
| 	qse_sed_t* sed, int* errnum,  | ||||
| 	qse_size_t* errlin, const qse_char_t** errmsg) | ||||
| { | ||||
| 	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->errnum):*/ | ||||
| 			geterrstr (sed->errnum): | ||||
| 			sed->errmsg; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void qse_sed_seterrnum (qse_sed_t* sed, int errnum) | ||||
| { | ||||
| 	sed->errnum = errnum; | ||||
| 	sed->errlin = 0; | ||||
| 	sed->errmsg[0] = QSE_T('\0'); | ||||
| } | ||||
|  | ||||
| void qse_sed_seterrmsg (qse_sed_t* sed,  | ||||
| 	int errnum, qse_size_t errlin, const qse_char_t* errmsg) | ||||
| { | ||||
| 	sed->errnum = errnum; | ||||
| 	sed->errlin = errlin; | ||||
| 	qse_strxcpy (sed->errmsg, QSE_COUNTOF(sed->errmsg), errmsg); | ||||
| } | ||||
|  | ||||
| void qse_sed_seterror ( | ||||
| 	qse_sed_t* sed, int errnum, | ||||
| 	qse_size_t errlin, const qse_cstr_t* errarg) | ||||
| { | ||||
| 	const qse_char_t* errfmt; | ||||
|  | ||||
| 	sed->errnum = errnum; | ||||
| 	sed->errlin = errlin; | ||||
|  | ||||
| 	errfmt = /*qse_sed_geterrstr (sed, errnum);*/ geterrstr (sed->errnum); | ||||
| 	QSE_ASSERT (errfmt != QSE_NULL); | ||||
| 	qse_strxfncpy (sed->errmsg, QSE_COUNTOF(sed->errmsg), errfmt, errarg); | ||||
| } | ||||
|  | ||||
| @ -27,6 +27,16 @@ static void free_command (qse_sed_t* sed, qse_sed_cmd_t* cmd); | ||||
| 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, line, QSE_NULL); } while (0) | ||||
|  | ||||
| #define SETERR1(sed,num,line,argp,argl) \ | ||||
| do { \ | ||||
| 	qse_cstr_t __qse__err__arg__; \ | ||||
| 	__qse__err__arg__.ptr = argp; __qse__err__arg__.len = argl; \ | ||||
| 	qse_sed_seterror (sed, num, line, &__qse__err__arg__); \ | ||||
| } while (0) | ||||
|  | ||||
| qse_sed_t* qse_sed_open (qse_mmgr_t* mmgr, qse_size_t xtn) | ||||
| { | ||||
| 	qse_sed_t* sed; | ||||
| @ -66,14 +76,14 @@ static qse_sed_t* qse_sed_init (qse_sed_t* sed, qse_mmgr_t* mmgr) | ||||
|  | ||||
| 	if (qse_str_init (&sed->rexbuf, mmgr, 0) == QSE_NULL) | ||||
| 	{ | ||||
| 		sed->errnum = QSE_SED_ENOMEM; | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		return QSE_NULL;	 | ||||
| 	}	 | ||||
|  | ||||
| 	if (qse_map_init (&sed->labs, mmgr, 128, 70) == QSE_NULL) | ||||
| 	{ | ||||
| 		qse_str_fini (&sed->rexbuf); | ||||
| 		sed->errnum = QSE_SED_ENOMEM; | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		return QSE_NULL;	 | ||||
| 	} | ||||
| 	qse_map_setcopier (&sed->labs, QSE_MAP_KEY, QSE_MAP_COPIER_INLINE); | ||||
| @ -150,46 +160,6 @@ static void qse_sed_fini (qse_sed_t* sed) | ||||
| 	qse_str_fini (&sed->rexbuf); | ||||
| } | ||||
|  | ||||
| const qse_char_t* qse_sed_geterrmsg (qse_sed_t* sed) | ||||
| { | ||||
| 	static const qse_char_t* errmsg[] = | ||||
| 	{ | ||||
| 		QSE_T("no error"), | ||||
| 		QSE_T("out of memory"), | ||||
| 		QSE_T("too much text"), | ||||
| 		QSE_T("command not recognized"), | ||||
| 		QSE_T("command missing"), | ||||
| 		QSE_T("command garbled"), | ||||
| 		QSE_T("regular expression build error"), | ||||
| 		QSE_T("regular expression match error"), | ||||
| 		QSE_T("address 1 prohibited"), | ||||
| 		QSE_T("address 2 prohibited"), | ||||
| 		QSE_T("invalid step address"), | ||||
| 		QSE_T("a new line expected"), | ||||
| 		QSE_T("a backslash expected"), | ||||
| 		QSE_T("a backslash used as a delimiter"), | ||||
| 		QSE_T("garbage after a backslash"), | ||||
| 		QSE_T("a semicolon expected"), | ||||
| 		QSE_T("label name too long"), | ||||
| 		QSE_T("empty label name"), | ||||
| 		QSE_T("duplicate label name"), | ||||
| 		QSE_T("label not found"), | ||||
| 		QSE_T("empty file name"), | ||||
| 		QSE_T("illegal file name"), | ||||
| 		QSE_T("command not terminated properly"), | ||||
| 		QSE_T("strings in translation set not the same length"), | ||||
| 		QSE_T("group brackets not balanced"), | ||||
| 		QSE_T("group nesting too deep"), | ||||
| 		QSE_T("multiple occurrence specifier"), | ||||
| 		QSE_T("occurrence specifier is zero"), | ||||
| 		QSE_T("occurrence specifier too large"), | ||||
| 		QSE_T("error returned by user io handler") | ||||
| 	}; | ||||
|  | ||||
| 	return (sed->errnum > 0 && sed->errnum < QSE_COUNTOF(errmsg))? | ||||
| 		errmsg[sed->errnum]: QSE_T("unknown error");	 | ||||
| } | ||||
|  | ||||
| void qse_sed_setoption (qse_sed_t* sed, int option) | ||||
| { | ||||
| 	sed->option = option; | ||||
| @ -314,7 +284,7 @@ static void* compile_rex (qse_sed_t* sed, qse_char_t rxend) | ||||
|  | ||||
| 		if (qse_str_ccat (&sed->rexbuf, c) == (qse_size_t)-1) | ||||
| 		{ | ||||
| 			sed->errnum = QSE_SED_ENOMEM; | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			return QSE_NULL; | ||||
| 		} | ||||
| 	}  | ||||
| @ -405,7 +375,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) \ | ||||
| 	{ \ | ||||
| 		sed->errnum = QSE_SED_ENOMEM; \ | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); \ | ||||
| 		goto errlabel; \ | ||||
| 	} \ | ||||
| } while (0) | ||||
| @ -497,7 +467,7 @@ static int get_label (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	t = qse_str_open (sed->mmgr, 0, 32); | ||||
| 	if (t == QSE_NULL)  | ||||
| 	{ | ||||
| 		sed->errnum = QSE_SED_ENOMEM; | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -505,7 +475,7 @@ static int get_label (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	{ | ||||
| 		if (qse_str_ccat (t, c) == (qse_size_t)-1)  | ||||
| 		{ | ||||
| 			sed->errnum = QSE_SED_ENOMEM; | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			goto oops; | ||||
| 		}  | ||||
| 		c = NXTSC (sed); | ||||
| @ -515,15 +485,16 @@ static int get_label (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	if (qse_map_search ( | ||||
| 		&sed->labs, QSE_STR_PTR(t), QSE_STR_LEN(t)) != QSE_NULL) | ||||
| 	{ | ||||
| 		sed->errnum = QSE_SED_ELABDU; | ||||
| 		SETERR1 (sed, QSE_SED_ELABDU, 0,  | ||||
| 			QSE_STR_PTR(t), QSE_STR_LEN(t)); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| 	if (qse_map_insert ( | ||||
| 		&sed->labs, QSE_STR_PTR(t), QSE_STR_LEN(t), cmd, 0) == QSE_NULL) | ||||
| 	{ | ||||
| 		sed->errnum = QSE_SED_ENOMEM; | ||||
| 		goto oops;; | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| 	/* the label can be followed by a command on the same line without  | ||||
| @ -581,7 +552,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)  | ||||
| 	{ | ||||
| 		sed->errnum = QSE_SED_ENOMEM; | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -589,7 +560,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)  | ||||
| 		{ | ||||
| 			sed->errnum = QSE_SED_ENOMEM; | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			goto oops; | ||||
| 		}  | ||||
|  | ||||
| @ -640,7 +611,7 @@ static int get_file (qse_sed_t* sed, qse_xstr_t* xstr) | ||||
| 	t = qse_str_open (sed->mmgr, 0, 32); | ||||
| 	if (t == QSE_NULL)  | ||||
| 	{ | ||||
| 		sed->errnum = QSE_SED_ENOMEM; | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -672,7 +643,7 @@ static int get_file (qse_sed_t* sed, qse_xstr_t* xstr) | ||||
|  | ||||
| 		if (qse_str_ccat (t, c) == (qse_size_t)-1)  | ||||
| 		{ | ||||
| 			sed->errnum = QSE_SED_ENOMEM; | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			goto oops; | ||||
| 		}  | ||||
|  | ||||
| @ -706,7 +677,7 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	if (c == QSE_CHAR_EOF || IS_LINTERM(c)) | ||||
| 	{ | ||||
| 		/* not terminated properly */ | ||||
| 		sed->errnum = QSE_SED_ENOTRM; | ||||
| 		SETERR1 (sed, QSE_SED_ECMDIC, 0, &cmd->type, 1); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -723,7 +694,7 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 		t[i] = qse_str_open (sed->mmgr, 0, 32); | ||||
| 		if (t[i] == QSE_NULL)  | ||||
| 		{ | ||||
| 			sed->errnum = QSE_SED_ENOMEM; | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			goto oops; | ||||
| 		} | ||||
| 	} | ||||
| @ -737,7 +708,7 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 		{ | ||||
| 			if (c == QSE_CHAR_EOF || IS_LINTERM(c)) | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOTRM; | ||||
| 				SETERR1 (sed, QSE_SED_ECMDIC, 0, &cmd->type, 1); | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| @ -746,7 +717,7 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 				c = NXTSC (sed); | ||||
| 				if (c == QSE_CHAR_EOF || IS_LINTERM(c)) | ||||
| 				{ | ||||
| 					sed->errnum = QSE_SED_ENOTRM; | ||||
| 					SETERR1 (sed, QSE_SED_ECMDIC, 0, &cmd->type, 1); | ||||
| 					goto oops; | ||||
| 				} | ||||
| 	 | ||||
| @ -755,7 +726,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) | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOMEM; | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| @ -868,7 +839,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	if (c == QSE_CHAR_EOF || IS_LINTERM(c)) | ||||
| 	{ | ||||
| 		/* translation set terminated prematurely*/ | ||||
| 		sed->errnum = QSE_SED_ENOTRM; | ||||
| 		SETERR1 (sed, QSE_SED_ECMDIC, 0, &cmd->type, 1); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -883,7 +854,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	t = qse_str_open (sed->mmgr, 0, 32); | ||||
| 	if (t == QSE_NULL)  | ||||
| 	{ | ||||
| 		sed->errnum = QSE_SED_ENOMEM; | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		goto oops; | ||||
| 	} | ||||
|  | ||||
| @ -894,7 +865,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
|  | ||||
| 		if (c == QSE_CHAR_EOF || IS_LINTERM(c)) | ||||
| 		{ | ||||
| 			sed->errnum = QSE_SED_ENOTRM; | ||||
| 			SETERR1 (sed, QSE_SED_ECMDIC, 0, &cmd->type, 1); | ||||
| 			goto oops; | ||||
| 		} | ||||
|  | ||||
| @ -903,7 +874,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 			c = NXTSC (sed); | ||||
| 			if (c == QSE_CHAR_EOF || IS_LINTERM(c)) | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOTRM; | ||||
| 				SETERR1 (sed, QSE_SED_ECMDIC, 0, &cmd->type, 1); | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| @ -913,7 +884,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) | ||||
| 		{ | ||||
| 			sed->errnum = QSE_SED_ENOMEM; | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			goto oops; | ||||
| 		} | ||||
|  | ||||
| @ -925,7 +896,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 	{ | ||||
| 		if (c == QSE_CHAR_EOF || IS_LINTERM(c)) | ||||
| 		{ | ||||
| 			sed->errnum = QSE_SED_ENOTRM; | ||||
| 			SETERR1 (sed, QSE_SED_ECMDIC, 0, &cmd->type, 1); | ||||
| 			goto oops; | ||||
| 		} | ||||
|  | ||||
| @ -934,7 +905,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 			c = NXTSC (sed); | ||||
| 			if (c == QSE_CHAR_EOF || IS_LINTERM(c)) | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOTRM; | ||||
| 				SETERR1 (sed, QSE_SED_ECMDIC, 0, &cmd->type, 1); | ||||
| 				goto oops; | ||||
| 			} | ||||
|  | ||||
| @ -981,11 +952,14 @@ restart: | ||||
| 	switch (c) | ||||
| 	{ | ||||
| 		default: | ||||
| 			sed->errnum = QSE_SED_ECMDNR; | ||||
| 		{ | ||||
| 			qse_char_t cc = c; | ||||
| 			SETERR1 (sed, QSE_SED_ECMDNR, 0, &cc, 1); | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| 		case QSE_CHAR_EOF: | ||||
| 			sed->errnum = QSE_SED_ECMDMS; | ||||
| 			SETERR0 (sed, QSE_SED_ECMDMS, 0); | ||||
| 			return -1;	 | ||||
|  | ||||
| 		case QSE_T(':'): | ||||
| @ -1264,7 +1238,7 @@ static int compile_source ( | ||||
| 			{ | ||||
| 				/* TODO: too many commands. change errnum */ | ||||
| 				free_command (sed, cmd); | ||||
| 				sed->errnum = QSE_SED_ENOMEM;  | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0);  | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| @ -1372,7 +1346,7 @@ static int read_file (qse_sed_t* sed, const qse_char_t* path, int line) | ||||
| 				if (qse_str_ccat (&sed->e.txt.read, buf[i]) == (qse_size_t)-1) | ||||
| 				{ | ||||
| 					sed->e.in.fun (sed, QSE_SED_IO_CLOSE, &arg); | ||||
| 					sed->errnum = QSE_SED_ENOMEM; | ||||
| 					SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 					return -1; | ||||
| 				} | ||||
|  | ||||
| @ -1385,7 +1359,7 @@ static int read_file (qse_sed_t* sed, const qse_char_t* path, int line) | ||||
| 			if (qse_str_ncat (&sed->e.txt.read, buf, n) == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				sed->e.in.fun (sed, QSE_SED_IO_CLOSE, &arg); | ||||
| 				sed->errnum = QSE_SED_ENOMEM; | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
| @ -1429,7 +1403,7 @@ static int read_line (qse_sed_t* sed, int append) | ||||
|  | ||||
| 		if (qse_str_ccat (&sed->e.in.line, c) == (qse_size_t)-1) | ||||
| 		{ | ||||
| 			sed->errnum = QSE_SED_ENOMEM; | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			return -1; | ||||
| 		} | ||||
| 		len++;	 | ||||
| @ -1653,7 +1627,7 @@ static int write_str_to_file ( | ||||
| 			path, plen, &arg, QSE_SIZEOF(arg)); | ||||
| 		if (pair == QSE_NULL) | ||||
| 		{ | ||||
| 			sed->errnum = QSE_SED_ENOMEM; | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
| @ -1761,7 +1735,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) | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOMEM; | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				return -1; | ||||
| 			} | ||||
| 			break; | ||||
| @ -1776,7 +1750,7 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
|  | ||||
| 			if (m == (qse_size_t)-1) | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOMEM; | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				return -1; | ||||
| 			} | ||||
| 		} | ||||
| @ -1788,7 +1762,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) | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOMEM; | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| @ -1817,7 +1791,7 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
|  | ||||
| 				if (m == (qse_size_t)-1) | ||||
| 				{ | ||||
| 					sed->errnum = QSE_SED_ENOMEM; | ||||
| 					SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 					return -1; | ||||
| 				} | ||||
| 			} | ||||
| @ -1834,7 +1808,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) | ||||
| 		{ | ||||
| 			sed->errnum = QSE_SED_ENOMEM; | ||||
| 			SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 			return -1; | ||||
| 		} | ||||
| 	} | ||||
| @ -2053,7 +2027,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)  | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOMEM; | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				return QSE_NULL; | ||||
| 			} | ||||
| 			break; | ||||
| @ -2075,7 +2049,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)  | ||||
| 				{ | ||||
| 					sed->errnum = QSE_SED_ENOMEM; | ||||
| 					SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 					return QSE_NULL; | ||||
| 				} | ||||
| 			} | ||||
| @ -2167,7 +2141,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) | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOMEM; | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				return QSE_NULL;	 | ||||
| 			} | ||||
| 			break; | ||||
| @ -2178,7 +2152,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) | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOMEM; | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				return QSE_NULL;	 | ||||
| 			} | ||||
| 			break; | ||||
| @ -2189,7 +2163,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) | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOMEM; | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				return QSE_NULL;	 | ||||
| 			} | ||||
| 			break; | ||||
| @ -2200,7 +2174,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) | ||||
| 			{ | ||||
| 				sed->errnum = QSE_SED_ENOMEM; | ||||
| 				SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 				return QSE_NULL;	 | ||||
| 			} | ||||
| 			break; | ||||
| @ -2308,7 +2282,10 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd) | ||||
| 						&sed->labs, lab->ptr, lab->len); | ||||
| 					if (pair == QSE_NULL) | ||||
| 					{ | ||||
| 						sed->errnum = QSE_SED_ELABNF; | ||||
| 						SETERR1 ( | ||||
| 							sed, QSE_SED_ELABNF, 0, | ||||
| 							lab->ptr, lab->len | ||||
| 						); | ||||
| 						return QSE_NULL; | ||||
| 					} | ||||
|  | ||||
| @ -2384,7 +2361,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) | ||||
| 	{ | ||||
| 		sed->errnum = QSE_SED_ENOMEM; | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| @ -2393,7 +2370,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) | ||||
| 	{ | ||||
| 		sed->errnum = QSE_SED_ENOMEM; | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		return -1; | ||||
| 	} | ||||
| 	*(qse_sed_t**)QSE_XTN(&sed->e.out.files) = sed; | ||||
| @ -2414,7 +2391,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); | ||||
| 		sed->errnum = QSE_SED_ENOMEM; | ||||
| 		SETERR0 (sed, QSE_SED_ENOMEM, 0); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
|  | ||||
| @ -34,6 +34,9 @@ struct qse_sed_t | ||||
| 	QSE_DEFINE_COMMON_FIELDS (sed) | ||||
|  | ||||
| 	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 */ | ||||
|  | ||||
| 	int option;              /**< stores options */ | ||||
|  | ||||
| 	/** source text pointers */ | ||||
| @ -139,46 +142,36 @@ struct qse_sed_adr_t | ||||
| 	} u; | ||||
| }; | ||||
|  | ||||
| #define QSE_SED_CMD_QUIT            QSE_T('q') | ||||
| #define QSE_SED_CMD_QUIT_QUIET      QSE_T('Q') | ||||
| #define QSE_SED_CMD_APPEND          QSE_T('a') | ||||
| #define QSE_SED_CMD_INSERT          QSE_T('i') | ||||
| #define QSE_SED_CMD_CHANGE          QSE_T('c') | ||||
| #define QSE_SED_CMD_DELETE          QSE_T('d') | ||||
| #define QSE_SED_CMD_DELETE_FIRSTLN  QSE_T('D') | ||||
| #define QSE_SED_CMD_PRINT_LNNUM     QSE_T('=') | ||||
| #define QSE_SED_CMD_PRINT           QSE_T('p') | ||||
| #define QSE_SED_CMD_PRINT_FIRSTLN   QSE_T('P') | ||||
| #define QSE_SED_CMD_PRINT_CLEARLY   QSE_T('l') | ||||
| #define QSE_SED_CMD_HOLD            QSE_T('h') | ||||
| #define QSE_SED_CMD_HOLD_APPEND     QSE_T('H') | ||||
| #define QSE_SED_CMD_RELEASE         QSE_T('g') | ||||
| #define QSE_SED_CMD_RELEASE_APPEND  QSE_T('G') | ||||
| #define QSE_SED_CMD_EXCHANGE        QSE_T('x')  | ||||
| #define QSE_SED_CMD_NEXT            QSE_T('n') | ||||
| #define QSE_SED_CMD_NEXT_APPEND     QSE_T('N') | ||||
| #define QSE_SED_CMD_READ_FILE       QSE_T('r') | ||||
| #define QSE_SED_CMD_READ_FILELN     QSE_T('R') | ||||
| #define QSE_SED_CMD_WRITE_FILE      QSE_T('w') | ||||
| #define QSE_SED_CMD_WRITE_FILELN    QSE_T('W') | ||||
| #define QSE_SED_CMD_BRANCH          QSE_T('b')  | ||||
| #define QSE_SED_CMD_BRANCH_COND     QSE_T('t') | ||||
| #define QSE_SED_CMD_SUBSTITUTE      QSE_T('s') | ||||
| #define QSE_SED_CMD_TRANSLATE       QSE_T('y') | ||||
|  | ||||
| struct qse_sed_cmd_t | ||||
| { | ||||
| 	enum | ||||
| 	{ | ||||
| 		QSE_SED_CMD_QUIT           = QSE_T('q'), | ||||
| 		QSE_SED_CMD_QUIT_QUIET     = QSE_T('Q'), | ||||
|  | ||||
| 		QSE_SED_CMD_APPEND         = QSE_T('a'), | ||||
| 		QSE_SED_CMD_INSERT         = QSE_T('i'), | ||||
| 		QSE_SED_CMD_CHANGE         = QSE_T('c'), | ||||
|  | ||||
| 		QSE_SED_CMD_DELETE         = QSE_T('d'), | ||||
| 		QSE_SED_CMD_DELETE_FIRSTLN = QSE_T('D'), | ||||
|  | ||||
| 		QSE_SED_CMD_PRINT_LNNUM    = QSE_T('='), | ||||
| 		QSE_SED_CMD_PRINT          = QSE_T('p'), | ||||
| 		QSE_SED_CMD_PRINT_FIRSTLN  = QSE_T('P'), | ||||
| 		QSE_SED_CMD_PRINT_CLEARLY  = QSE_T('l'), | ||||
|  | ||||
| 		QSE_SED_CMD_HOLD           = QSE_T('h'), | ||||
| 		QSE_SED_CMD_HOLD_APPEND    = QSE_T('H'), | ||||
| 		QSE_SED_CMD_RELEASE        = QSE_T('g'), | ||||
| 		QSE_SED_CMD_RELEASE_APPEND = QSE_T('G'), | ||||
| 		QSE_SED_CMD_EXCHANGE       = QSE_T('x'),  | ||||
|  | ||||
| 		QSE_SED_CMD_NEXT           = QSE_T('n'), | ||||
| 		QSE_SED_CMD_NEXT_APPEND    = QSE_T('N'), | ||||
|  | ||||
| 		QSE_SED_CMD_READ_FILE      = QSE_T('r'), | ||||
| 		QSE_SED_CMD_READ_FILELN    = QSE_T('R'), | ||||
| 		QSE_SED_CMD_WRITE_FILE     = QSE_T('w'), | ||||
| 		QSE_SED_CMD_WRITE_FILELN   = QSE_T('W'), | ||||
|  | ||||
| 		QSE_SED_CMD_BRANCH         = QSE_T('b'),  | ||||
| 		QSE_SED_CMD_BRANCH_COND    = QSE_T('t'), | ||||
|  | ||||
| 		QSE_SED_CMD_SUBSTITUTE     = QSE_T('s'), | ||||
| 		QSE_SED_CMD_TRANSLATE      = QSE_T('y') | ||||
|  | ||||
| 	} type; | ||||
| 	qse_char_t type; | ||||
|  | ||||
| 	int negated; | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user