enhanced the Sed class with a few more methods

This commit is contained in:
2009-05-28 23:00:24 +00:00
parent fb9cdaa1c0
commit 9dfcf671a4
8 changed files with 268 additions and 426 deletions

View File

@ -28,6 +28,10 @@ int Sed::open () throw ()
sed = qse_sed_open (this, QSE_SIZEOF(Sed*));
if (sed == QSE_NULL) return -1;
*(Sed**)QSE_XTN(sed) = this;
dflerrstr = qse_sed_geterrstr (sed);
qse_sed_seterrstr (sed, xerrstr);
return 0;
}
@ -58,17 +62,29 @@ int Sed::execute () throw ()
return qse_sed_exec (sed, xin, xout);
}
const Sed::char_t* Sed::getErrorMessage () const
int Sed::getOption() const throw ()
{
QSE_ASSERT (sed != QSE_NULL);
return qse_sed_getoption (sed);
}
void Sed::setOption (int opt) throw ()
{
QSE_ASSERT (sed != QSE_NULL);
qse_sed_setoption (sed, opt);
}
const Sed::char_t* Sed::getErrorMessage () const throw ()
{
return (sed == QSE_NULL)? QSE_T(""): qse_sed_geterrmsg (sed);
}
Sed::size_t Sed::getErrorLine () const
Sed::size_t Sed::getErrorLine () const throw ()
{
return (sed == QSE_NULL)? 0: qse_sed_geterrlin (sed);
}
Sed::errnum_t Sed::getErrorNumber () const
Sed::errnum_t Sed::getErrorNumber () const throw ()
{
return (sed == QSE_NULL)? QSE_SED_ENOERR: qse_sed_geterrnum (sed);
}
@ -181,6 +197,25 @@ Sed::ssize_t Sed::xout (sed_t* s, io_cmd_t cmd, io_arg_t* arg) throw ()
}
}
const Sed::char_t* Sed::getErrorString (errnum_t num)
{
QSE_ASSERT (dflerrstr != QSE_NULL);
return dflerrstr (sed, num);
}
const Sed::char_t* Sed::xerrstr (sed_t* s, errnum_t num) throw ()
{
Sed* sed = *(Sed**)QSE_XTN(s);
try
{
return sed->getErrorString (num);
}
catch (...)
{
return sed->dflerrstr (s, num);
}
}
/////////////////////////////////
QSE_END_NAMESPACE(QSE)
/////////////////////////////////

View File

@ -52,11 +52,11 @@ static const qse_char_t* dflerrstr (qse_sed_t* sed, qse_sed_errnum_t errnum)
QSE_T("address 1 prohibited for '${0}'"),
QSE_T("address 2 prohibited"),
QSE_T("address 2 missing or invalid"),
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("newline expected"),
QSE_T("backslash expected"),
QSE_T("backslash used as delimiter"),
QSE_T("garbage after backslash"),
QSE_T("semicolon expected"),
QSE_T("empty label name"),
QSE_T("duplicate label name '${0}'"),
QSE_T("label '${0}' not found"),
@ -65,8 +65,8 @@ static const qse_char_t* dflerrstr (qse_sed_t* sed, qse_sed_errnum_t errnum)
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("multiple occurrence specifiers"),
QSE_T("occurrence specifier zero"),
QSE_T("occurrence specifier too large"),
QSE_T("io error with file '${0}'"),
QSE_T("error returned by user io handler")
@ -998,7 +998,7 @@ oops:
return -1;
}
static int command (qse_sed_t* sed)
static int get_command (qse_sed_t* sed)
{
qse_cint_t c;
qse_sed_cmd_t* cmd = sed->cmd.cur;
@ -1304,7 +1304,7 @@ int qse_sed_comp (qse_sed_t* sed, const qse_char_t* sptr, qse_size_t slen)
}
n = command (sed);
n = get_command (sed);
if (n <= -1)
{
free_address (sed, cmd);
@ -1734,7 +1734,8 @@ static int write_str_to_file (
if (n == 0)
{
/* EOF is returned upon opening a write stream.
* it is also an error as it can't write any more */
* it is also an error as it can't write
* a requested string */
sed->e.out.fun (sed, QSE_SED_IO_CLOSE, ap);
ap->handle = QSE_NULL;
SETERR1 (sed, QSE_SED_EIOFIL, cmd->lnum, path, plen);