improved error handling functions in sed

This commit is contained in:
2009-05-22 00:17:17 +00:00
parent a4638abf6d
commit 1893905652
10 changed files with 382 additions and 146 deletions

View File

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

View File

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

View File

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

View File

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