added _instsize into qse_sed_t and removed qse_sed_getxtnstd()

This commit is contained in:
hyung-hwan 2019-06-25 01:21:00 +00:00
parent 5d627bc2a7
commit 74b48b87ec
7 changed files with 132 additions and 125 deletions

View File

@ -173,7 +173,7 @@ const qse_char_t* qse_awk_dflerrstr (qse_awk_t* awk, qse_awk_errnum_t errnum)
errstr[errnum]: QSE_T("unknown error"); errstr[errnum]: QSE_T("unknown error");
} }
qse_awk_errstr_t qse_awk_geterrstr (const qse_awk_t* awk) qse_awk_errstr_t qse_awk_geterrstr (qse_awk_t* awk)
{ {
return awk->errstr; return awk->errstr;
} }
@ -183,23 +183,23 @@ void qse_awk_seterrstr (qse_awk_t* awk, qse_awk_errstr_t errstr)
awk->errstr = errstr; awk->errstr = errstr;
} }
qse_awk_errnum_t qse_awk_geterrnum (const qse_awk_t* awk) qse_awk_errnum_t qse_awk_geterrnum (qse_awk_t* awk)
{ {
return awk->errinf.num; return awk->errinf.num;
} }
const qse_awk_loc_t* qse_awk_geterrloc (const qse_awk_t* awk) const qse_awk_loc_t* qse_awk_geterrloc (qse_awk_t* awk)
{ {
return &awk->errinf.loc; return &awk->errinf.loc;
} }
const qse_char_t* qse_awk_geterrmsg (const qse_awk_t* awk) const qse_char_t* qse_awk_geterrmsg (qse_awk_t* awk)
{ {
return (awk->errinf.msg[0] == QSE_T('\0'))? return (awk->errinf.msg[0] == QSE_T('\0'))?
qse_awk_geterrstr(awk)(awk,awk->errinf.num): awk->errinf.msg; qse_awk_geterrstr(awk)(awk,awk->errinf.num): awk->errinf.msg;
} }
void qse_awk_geterrinf (const qse_awk_t* awk, qse_awk_errinf_t* errinf) void qse_awk_geterrinf (qse_awk_t* awk, qse_awk_errinf_t* errinf)
{ {
QSE_MEMCPY (errinf, &awk->errinf, QSE_SIZEOF(*errinf)); QSE_MEMCPY (errinf, &awk->errinf, QSE_SIZEOF(*errinf));
if (errinf->msg[0] == QSE_T('\0')) if (errinf->msg[0] == QSE_T('\0'))
@ -209,7 +209,7 @@ void qse_awk_geterrinf (const qse_awk_t* awk, qse_awk_errinf_t* errinf)
} }
} }
void qse_awk_geterror (const qse_awk_t* awk, qse_awk_errnum_t* errnum, const qse_char_t** errmsg, qse_awk_loc_t* errloc) void qse_awk_geterror (qse_awk_t* awk, qse_awk_errnum_t* errnum, const qse_char_t** errmsg, qse_awk_loc_t* errloc)
{ {
if (errnum) *errnum = awk->errinf.num; if (errnum) *errnum = awk->errinf.num;
if (errmsg) if (errmsg)
@ -266,23 +266,23 @@ void qse_awk_seterror (qse_awk_t* awk, qse_awk_errnum_t errnum, const qse_cstr_t
} }
qse_awk_errnum_t qse_awk_rtx_geterrnum (const qse_awk_rtx_t* rtx) qse_awk_errnum_t qse_awk_rtx_geterrnum (qse_awk_rtx_t* rtx)
{ {
return rtx->errinf.num; return rtx->errinf.num;
} }
const qse_awk_loc_t* qse_awk_rtx_geterrloc (const qse_awk_rtx_t* rtx) const qse_awk_loc_t* qse_awk_rtx_geterrloc (qse_awk_rtx_t* rtx)
{ {
return &rtx->errinf.loc; return &rtx->errinf.loc;
} }
const qse_char_t* qse_awk_rtx_geterrmsg (const qse_awk_rtx_t* rtx) const qse_char_t* qse_awk_rtx_geterrmsg (qse_awk_rtx_t* rtx)
{ {
return (rtx->errinf.msg[0] == QSE_T('\0')) ? return (rtx->errinf.msg[0] == QSE_T('\0')) ?
qse_awk_geterrstr(rtx->awk)(rtx->awk,rtx->errinf.num): rtx->errinf.msg; qse_awk_geterrstr(rtx->awk)(rtx->awk,rtx->errinf.num): rtx->errinf.msg;
} }
void qse_awk_rtx_geterrinf (const qse_awk_rtx_t* rtx, qse_awk_errinf_t* errinf) void qse_awk_rtx_geterrinf (qse_awk_rtx_t* rtx, qse_awk_errinf_t* errinf)
{ {
QSE_MEMCPY (errinf, &rtx->errinf, QSE_SIZEOF(*errinf)); QSE_MEMCPY (errinf, &rtx->errinf, QSE_SIZEOF(*errinf));
if (errinf->msg[0] == QSE_T('\0')) if (errinf->msg[0] == QSE_T('\0'))
@ -293,7 +293,7 @@ void qse_awk_rtx_geterrinf (const qse_awk_rtx_t* rtx, qse_awk_errinf_t* errinf)
} }
void qse_awk_rtx_geterror ( void qse_awk_rtx_geterror (
const qse_awk_rtx_t* rtx, qse_awk_errnum_t* errnum, qse_awk_rtx_t* rtx, qse_awk_errnum_t* errnum,
const qse_char_t** errmsg, qse_awk_loc_t* errloc) const qse_char_t** errmsg, qse_awk_loc_t* errloc)
{ {
if (errnum != QSE_NULL) *errnum = rtx->errinf.num; if (errnum != QSE_NULL) *errnum = rtx->errinf.num;

View File

@ -33,18 +33,33 @@
QSE_BEGIN_NAMESPACE(QSE) QSE_BEGIN_NAMESPACE(QSE)
///////////////////////////////// /////////////////////////////////
struct xtn_t
{
Sed* sed;
};
#if defined(QSE_HAVE_INLINE)
static QSE_INLINE xtn_t* GET_XTN(qse_sed_t* sed) { return (xtn_t*)((qse_uint8_t*)qse_sed_getxtn(sed) - QSE_SIZEOF(xtn_t)); }
#else
#define GET_XTN(sed) ((xtn_t*)((qse_uint8_t*)qse_sed_getxtn(sed) - QSE_SIZEOF(xtn_t)))
#endif
int Sed::open () int Sed::open ()
{ {
qse_sed_errnum_t errnum; qse_sed_errnum_t errnum;
this->sed = qse_sed_open (this->getMmgr(), QSE_SIZEOF(Sed*), &errnum); this->sed = qse_sed_open(this->getMmgr(), QSE_SIZEOF(xtn_t), &errnum);
if (!this->sed) if (!this->sed)
{ {
this->setError (errnum); this->setError (errnum);
return -1; return -1;
} }
*(Sed**)QSE_XTN(this->sed) = this;
dflerrstr = qse_sed_geterrstr (this->sed); this->sed->_instsize += QSE_SIZEOF(xtn_t);
xtn_t* xtn = GET_XTN(this->sed);
xtn->sed = this;
dflerrstr = qse_sed_geterrstr(this->sed);
qse_sed_seterrstr (sed, xerrstr); qse_sed_seterrstr (sed, xerrstr);
return 0; return 0;
@ -151,23 +166,22 @@ void Sed::setConsoleLine (size_t num)
qse_sed_setlinenum (this->sed, num); qse_sed_setlinenum (this->sed, num);
} }
Sed::ssize_t Sed::sin ( Sed::ssize_t Sed::sin (sed_t* s, io_cmd_t cmd, io_arg_t* arg, char_t* buf, size_t len)
sed_t* s, io_cmd_t cmd, io_arg_t* arg, char_t* buf, size_t len)
{ {
Sed* sed = *(Sed**)QSE_XTN(s); xtn_t* xtn = GET_XTN(s);
Stream::Data iodata (sed, Stream::READ, arg); Stream::Data iodata (xtn->sed, Stream::READ, arg);
try try
{ {
switch (cmd) switch (cmd)
{ {
case QSE_SED_IO_OPEN: case QSE_SED_IO_OPEN:
return sed->sstream->open (iodata); return xtn->sed->sstream->open (iodata);
case QSE_SED_IO_CLOSE: case QSE_SED_IO_CLOSE:
return sed->sstream->close (iodata); return xtn->sed->sstream->close (iodata);
case QSE_SED_IO_READ: case QSE_SED_IO_READ:
return sed->sstream->read (iodata, buf, len); return xtn->sed->sstream->read (iodata, buf, len);
default: default:
return -1; return -1;
} }
@ -178,23 +192,22 @@ Sed::ssize_t Sed::sin (
} }
} }
Sed::ssize_t Sed::xin ( Sed::ssize_t Sed::xin (sed_t* s, io_cmd_t cmd, io_arg_t* arg, char_t* buf, size_t len)
sed_t* s, io_cmd_t cmd, io_arg_t* arg, char_t* buf, size_t len)
{ {
Sed* sed = *(Sed**)QSE_XTN(s); xtn_t* xtn = GET_XTN(s);
Stream::Data iodata (sed, Stream::READ, arg); Stream::Data iodata (xtn->sed, Stream::READ, arg);
try try
{ {
switch (cmd) switch (cmd)
{ {
case QSE_SED_IO_OPEN: case QSE_SED_IO_OPEN:
return sed->iostream->open (iodata); return xtn->sed->iostream->open (iodata);
case QSE_SED_IO_CLOSE: case QSE_SED_IO_CLOSE:
return sed->iostream->close (iodata); return xtn->sed->iostream->close (iodata);
case QSE_SED_IO_READ: case QSE_SED_IO_READ:
return sed->iostream->read (iodata, buf, len); return xtn->sed->iostream->read (iodata, buf, len);
default: default:
return -1; return -1;
} }
@ -205,23 +218,22 @@ Sed::ssize_t Sed::xin (
} }
} }
Sed::ssize_t Sed::xout ( Sed::ssize_t Sed::xout (sed_t* s, io_cmd_t cmd, io_arg_t* arg, char_t* dat, size_t len)
sed_t* s, io_cmd_t cmd, io_arg_t* arg, char_t* dat, size_t len)
{ {
Sed* sed = *(Sed**)QSE_XTN(s); xtn_t* xtn = GET_XTN(s);
Stream::Data iodata (sed, Stream::WRITE, arg); Stream::Data iodata (xtn->sed, Stream::WRITE, arg);
try try
{ {
switch (cmd) switch (cmd)
{ {
case QSE_SED_IO_OPEN: case QSE_SED_IO_OPEN:
return sed->iostream->open (iodata); return xtn->sed->iostream->open (iodata);
case QSE_SED_IO_CLOSE: case QSE_SED_IO_CLOSE:
return sed->iostream->close (iodata); return xtn->sed->iostream->close (iodata);
case QSE_SED_IO_WRITE: case QSE_SED_IO_WRITE:
return sed->iostream->write (iodata, dat, len); return xtn->sed->iostream->write (iodata, dat, len);
default: default:
return -1; return -1;
} }
@ -234,20 +246,20 @@ Sed::ssize_t Sed::xout (
const Sed::char_t* Sed::getErrorString (errnum_t num) const const Sed::char_t* Sed::getErrorString (errnum_t num) const
{ {
QSE_ASSERT (dflerrstr != QSE_NULL); QSE_ASSERT (this->dflerrstr != QSE_NULL);
return dflerrstr (sed, num); return this->dflerrstr (sed, num);
} }
const Sed::char_t* Sed::xerrstr (const sed_t* s, errnum_t num) const Sed::char_t* Sed::xerrstr (sed_t* s, errnum_t num)
{ {
Sed* sed = *(Sed**)QSE_XTN(s); xtn_t* xtn = GET_XTN(s);
try try
{ {
return sed->getErrorString (num); return xtn->sed->getErrorString (num);
} }
catch (...) catch (...)
{ {
return sed->dflerrstr (s, num); return xtn->sed->dflerrstr (s, num);
} }
} }

View File

@ -38,7 +38,7 @@ static qse_sio_t* open_sio (StdSed::Stream::Data& io, const qse_char_t* file, in
{ {
qse_sio_t* sio; qse_sio_t* sio;
sio = qse_sio_open (((StdSed::sed_t*)io)->mmgr, 0, file, flags); sio = qse_sio_open(qse_sed_getmmgr((StdSed::sed_t*)io), 0, file, flags);
if (sio == QSE_NULL) if (sio == QSE_NULL)
{ {
qse_cstr_t ea; qse_cstr_t ea;
@ -59,7 +59,7 @@ static qse_sio_t* open_sio_std (StdSed::Stream::Data& io, qse_sio_std_t std, int
QSE_T("stderr"), QSE_T("stderr"),
}; };
sio = qse_sio_openstd (((StdSed::sed_t*)io)->mmgr, 0, std, flags); sio = qse_sio_openstd(qse_sed_getmmgr((StdSed::sed_t*)io), 0, std, flags);
if (sio == QSE_NULL) if (sio == QSE_NULL)
{ {
qse_cstr_t ea; qse_cstr_t ea;

View File

@ -27,8 +27,7 @@
#include "sed-prv.h" #include "sed-prv.h"
#include "../cmn/mem-prv.h" #include "../cmn/mem-prv.h"
const qse_char_t* qse_sed_dflerrstr ( const qse_char_t* qse_sed_dflerrstr (qse_sed_t* sed, qse_sed_errnum_t errnum)
const qse_sed_t* sed, qse_sed_errnum_t errnum)
{ {
static const qse_char_t* errstr[] = static const qse_char_t* errstr[] =
{ {
@ -76,7 +75,7 @@ const qse_char_t* qse_sed_dflerrstr (
errstr[errnum]: QSE_T("unknown error"); errstr[errnum]: QSE_T("unknown error");
} }
qse_sed_errstr_t qse_sed_geterrstr (const qse_sed_t* sed) qse_sed_errstr_t qse_sed_geterrstr (qse_sed_t* sed)
{ {
return sed->errstr; return sed->errstr;
} }
@ -86,24 +85,24 @@ void qse_sed_seterrstr (qse_sed_t* sed, qse_sed_errstr_t errstr)
sed->errstr = errstr; sed->errstr = errstr;
} }
qse_sed_errnum_t qse_sed_geterrnum (const qse_sed_t* sed) qse_sed_errnum_t qse_sed_geterrnum (qse_sed_t* sed)
{ {
return sed->errnum; return sed->errnum;
} }
const qse_sed_loc_t* qse_sed_geterrloc (const qse_sed_t* sed) const qse_sed_loc_t* qse_sed_geterrloc (qse_sed_t* sed)
{ {
return &sed->errloc; return &sed->errloc;
} }
const qse_char_t* qse_sed_geterrmsg (const qse_sed_t* sed) const qse_char_t* qse_sed_geterrmsg (qse_sed_t* sed)
{ {
return (sed->errmsg[0] == QSE_T('\0'))? return (sed->errmsg[0] == QSE_T('\0'))?
qse_sed_geterrstr(sed)(sed,sed->errnum): sed->errmsg; qse_sed_geterrstr(sed)(sed,sed->errnum): sed->errmsg;
} }
void qse_sed_geterror ( void qse_sed_geterror (
const qse_sed_t* sed, qse_sed_errnum_t* errnum, qse_sed_t* sed, qse_sed_errnum_t* errnum,
const qse_char_t** errmsg, qse_sed_loc_t* errloc) const qse_char_t** errmsg, qse_sed_loc_t* errloc)
{ {
if (errnum != QSE_NULL) *errnum = sed->errnum; if (errnum != QSE_NULL) *errnum = sed->errnum;

View File

@ -72,12 +72,12 @@ struct qse_sed_unknown_cid_t
*/ */
struct qse_sed_t struct qse_sed_t
{ {
qse_mmgr_t* mmgr; QSE_SED_HDR;
qse_sed_errstr_t errstr; /**< error string getter */
qse_sed_errnum_t errnum; /**< stores an error number */ qse_sed_errnum_t errnum; /**< stores an error number */
qse_char_t errmsg[128]; /**< error message holder */ qse_char_t errmsg[128]; /**< error message holder */
qse_sed_loc_t errloc; /**< location of the last error */ qse_sed_loc_t errloc; /**< location of the last error */
qse_sed_errstr_t errstr; /**< error string getter */
struct struct
{ {
@ -236,7 +236,7 @@ void qse_sed_fini (
); );
const qse_char_t* qse_sed_dflerrstr ( const qse_char_t* qse_sed_dflerrstr (
const qse_sed_t* sed, qse_sed_t* sed,
qse_sed_errnum_t errnum qse_sed_errnum_t errnum
); );

View File

@ -70,7 +70,7 @@ qse_sed_t* qse_sed_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_sed_errnum_t*
sed = (qse_sed_t*) QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_sed_t) + xtnsize); sed = (qse_sed_t*) QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_sed_t) + xtnsize);
if (sed) if (sed)
{ {
if (qse_sed_init (sed, mmgr) <= -1) if (qse_sed_init(sed, mmgr) <= -1)
{ {
if (errnum) *errnum = qse_sed_geterrnum(sed); if (errnum) *errnum = qse_sed_geterrnum(sed);
QSE_MMGR_FREE (mmgr, sed); QSE_MMGR_FREE (mmgr, sed);
@ -91,13 +91,14 @@ void qse_sed_close (qse_sed_t* sed)
if (ecb->close) ecb->close (sed); if (ecb->close) ecb->close (sed);
qse_sed_fini (sed); qse_sed_fini (sed);
QSE_MMGR_FREE (sed->mmgr, sed); QSE_MMGR_FREE (sed->_mmgr, sed);
} }
int qse_sed_init (qse_sed_t* sed, qse_mmgr_t* mmgr) int qse_sed_init (qse_sed_t* sed, qse_mmgr_t* mmgr)
{ {
QSE_MEMSET (sed, 0, QSE_SIZEOF(*sed)); QSE_MEMSET (sed, 0, QSE_SIZEOF(*sed));
sed->mmgr = mmgr; sed->_instsize = QSE_SIZEOF(*sed);
sed->_mmgr = mmgr;
sed->errstr = qse_sed_dflerrstr; sed->errstr = qse_sed_dflerrstr;
if (qse_str_init (&sed->tmp.rex, mmgr, 0) <= -1) goto oops_1; if (qse_str_init (&sed->tmp.rex, mmgr, 0) <= -1) goto oops_1;
@ -144,7 +145,7 @@ void qse_sed_fini (qse_sed_t* sed)
free_all_cids (sed); free_all_cids (sed);
if (sed->e.cutf.flds != sed->e.cutf.sflds) if (sed->e.cutf.flds != sed->e.cutf.sflds)
QSE_MMGR_FREE (sed->mmgr, sed->e.cutf.flds); qse_sed_freemem (sed, sed->e.cutf.flds);
qse_str_fini (&sed->e.txt.scratch); qse_str_fini (&sed->e.txt.scratch);
qse_str_fini (&sed->e.txt.hold); qse_str_fini (&sed->e.txt.hold);
@ -155,16 +156,6 @@ void qse_sed_fini (qse_sed_t* sed)
qse_str_fini (&sed->tmp.rex); qse_str_fini (&sed->tmp.rex);
} }
qse_mmgr_t* qse_sed_getmmgr (qse_sed_t* sed)
{
return sed->mmgr;
}
void* qse_sed_getxtn (qse_sed_t* sed)
{
return QSE_XTN (sed);
}
int qse_sed_setopt (qse_sed_t* sed, qse_sed_opt_t id, const void* value) int qse_sed_setopt (qse_sed_t* sed, qse_sed_opt_t id, const void* value)
{ {
switch (id) switch (id)
@ -234,7 +225,7 @@ static void* build_rex (
if ((sed->opt.trait & QSE_SED_EXTENDEDREX) == 0) opt |= QSE_REX_NOBOUND; if ((sed->opt.trait & QSE_SED_EXTENDEDREX) == 0) opt |= QSE_REX_NOBOUND;
rex = qse_buildrex ( rex = qse_buildrex (
sed->mmgr, sed->opt.depth.rex.build, qse_sed_getmmgr(sed), sed->opt.depth.rex.build,
opt, str->ptr, str->len, QSE_NULL opt, str->ptr, str->len, QSE_NULL
); );
if (rex == QSE_NULL) if (rex == QSE_NULL)
@ -253,27 +244,27 @@ static void* build_rex (
if (ignorecase) xopt |= REG_ICASE; if (ignorecase) xopt |= REG_ICASE;
if (sed->opt.trait & QSE_SED_EXTENDEDREX) xopt |= REG_EXTENDED; if (sed->opt.trait & QSE_SED_EXTENDEDREX) xopt |= REG_EXTENDED;
rex = QSE_MMGR_ALLOC (sed->mmgr, QSE_SIZEOF(*rex)); rex = qse_sed_allocmem(sed, QSE_SIZEOF(*rex));
if (rex == QSE_NULL) if (rex == QSE_NULL)
{ {
SETERR0 (sed, QSE_SED_ENOMEM, loc); SETERR0 (sed, QSE_SED_ENOMEM, loc);
return QSE_NULL; return QSE_NULL;
} }
strz = qse_strxdup (str->ptr, str->len, sed->mmgr); strz = qse_strxdup (str->ptr, str->len, qse_sed_getmmgr(sed));
if (strz == QSE_NULL) if (strz == QSE_NULL)
{ {
QSE_MMGR_FREE (sed->mmgr, rex); qse_sed_freemem (sed, rex);
SETERR0 (sed, QSE_SED_ENOMEM, loc); SETERR0 (sed, QSE_SED_ENOMEM, loc);
return QSE_NULL; return QSE_NULL;
} }
xopt = regcomp (rex, strz, xopt); xopt = regcomp (rex, strz, xopt);
QSE_MMGR_FREE (sed->mmgr, strz); qse_sed_freemem (sed, strz);
if (xopt != 0) if (xopt != 0)
{ {
QSE_MMGR_FREE (sed->mmgr, rex); qse_sed_freemem (sed, rex);
SETERR1 (sed, QSE_SED_EREXBL, str->ptr, str->len, loc); SETERR1 (sed, QSE_SED_EREXBL, str->ptr, str->len, loc);
return QSE_NULL; return QSE_NULL;
} }
@ -284,7 +275,7 @@ static void* build_rex (
qse_tre_t* tre; qse_tre_t* tre;
int opt = 0; int opt = 0;
tre = qse_tre_open (sed->mmgr, 0); tre = qse_tre_open(qse_sed_getmmgr(sed), 0);
if (tre == QSE_NULL) if (tre == QSE_NULL)
{ {
SETERR0 (sed, QSE_SED_ENOMEM, loc); SETERR0 (sed, QSE_SED_ENOMEM, loc);
@ -313,10 +304,10 @@ static void* build_rex (
static QSE_INLINE void free_rex (qse_sed_t* sed, void* rex) static QSE_INLINE void free_rex (qse_sed_t* sed, void* rex)
{ {
#if defined(USE_REX) #if defined(USE_REX)
qse_freerex (sed->mmgr, rex); qse_freerex (qse_sed_getmmgr(sed), rex);
#elif defined(QSE_CHAR_IS_MCHAR) && defined(USE_REGEX) #elif defined(QSE_CHAR_IS_MCHAR) && defined(USE_REGEX)
regfree (rex); regfree (rex);
QSE_MMGR_FREE (sed->mmgr, rex); qse_sed_freemem (sed, rex);
#else #else
qse_tre_close (rex); qse_tre_close (rex);
#endif #endif
@ -335,14 +326,14 @@ static int matchtre (
if (opt & QSE_TRE_NOTBOL) xopt |= REG_NOTBOL; if (opt & QSE_TRE_NOTBOL) xopt |= REG_NOTBOL;
strz = qse_strxdup (str->ptr, str->len, sed->mmgr); strz = qse_strxdup(str->ptr, str->len, qse_sed_getmmgr(sed));
if (strz == QSE_NULL) if (strz == QSE_NULL)
{ {
SETERR0 (sed, QSE_SED_ENOMEM, loc); SETERR0 (sed, QSE_SED_ENOMEM, loc);
return -1; return -1;
} }
xopt = regexec ((regex_t*)tre, strz, QSE_COUNTOF(match), match, xopt); xopt = regexec ((regex_t*)tre, strz, QSE_COUNTOF(match), match, xopt);
QSE_MMGR_FREE (sed->mmgr, strz); qse_sed_freemem (sed, strz);
if (xopt == REG_NOMATCH) return 0; if (xopt == REG_NOMATCH) return 0;
#else #else
@ -573,7 +564,7 @@ static void free_all_command_blocks (qse_sed_t* sed)
qse_sed_cmd_blk_t* nxt = b->next; qse_sed_cmd_blk_t* nxt = b->next;
while (b->len > 0) free_command (sed, &b->buf[--b->len]); while (b->len > 0) free_command (sed, &b->buf[--b->len]);
if (b != &sed->cmd.fb) QSE_MMGR_FREE (sed->mmgr, b); if (b != &sed->cmd.fb) qse_sed_freemem (sed, b);
b = nxt; b = nxt;
} }
@ -594,7 +585,7 @@ static void free_command (qse_sed_t* sed, qse_sed_cmd_t* cmd)
case QSE_SED_CMD_INSERT: case QSE_SED_CMD_INSERT:
case QSE_SED_CMD_CHANGE: case QSE_SED_CMD_CHANGE:
if (cmd->u.text.ptr) if (cmd->u.text.ptr)
QSE_MMGR_FREE (sed->mmgr, cmd->u.text.ptr); qse_sed_freemem (sed, cmd->u.text.ptr);
break; break;
case QSE_SED_CMD_READ_FILE: case QSE_SED_CMD_READ_FILE:
@ -602,27 +593,27 @@ static void free_command (qse_sed_t* sed, qse_sed_cmd_t* cmd)
case QSE_SED_CMD_WRITE_FILE: case QSE_SED_CMD_WRITE_FILE:
case QSE_SED_CMD_WRITE_FILELN: case QSE_SED_CMD_WRITE_FILELN:
if (cmd->u.file.ptr) if (cmd->u.file.ptr)
QSE_MMGR_FREE (sed->mmgr, cmd->u.file.ptr); qse_sed_freemem (sed, cmd->u.file.ptr);
break; break;
case QSE_SED_CMD_BRANCH: case QSE_SED_CMD_BRANCH:
case QSE_SED_CMD_BRANCH_COND: case QSE_SED_CMD_BRANCH_COND:
if (cmd->u.branch.label.ptr) if (cmd->u.branch.label.ptr)
QSE_MMGR_FREE (sed->mmgr, cmd->u.branch.label.ptr); qse_sed_freemem (sed, cmd->u.branch.label.ptr);
break; break;
case QSE_SED_CMD_SUBSTITUTE: case QSE_SED_CMD_SUBSTITUTE:
if (cmd->u.subst.file.ptr) if (cmd->u.subst.file.ptr)
QSE_MMGR_FREE (sed->mmgr, cmd->u.subst.file.ptr); qse_sed_freemem (sed, cmd->u.subst.file.ptr);
if (cmd->u.subst.rpl.ptr) if (cmd->u.subst.rpl.ptr)
QSE_MMGR_FREE (sed->mmgr, cmd->u.subst.rpl.ptr); qse_sed_freemem (sed, cmd->u.subst.rpl.ptr);
if (cmd->u.subst.rex && cmd->u.subst.rex != EMPTY_REX) if (cmd->u.subst.rex && cmd->u.subst.rex != EMPTY_REX)
free_rex (sed, cmd->u.subst.rex); free_rex (sed, cmd->u.subst.rex);
break; break;
case QSE_SED_CMD_TRANSLATE: case QSE_SED_CMD_TRANSLATE:
if (cmd->u.transet.ptr) if (cmd->u.transet.ptr)
QSE_MMGR_FREE (sed->mmgr, cmd->u.transet.ptr); qse_sed_freemem (sed, cmd->u.transet.ptr);
break; break;
case QSE_SED_CMD_CUT: case QSE_SED_CMD_CUT:
@ -642,7 +633,7 @@ static void free_all_cids (qse_sed_t* sed)
while (sed->src.cid) while (sed->src.cid)
{ {
qse_sed_cid_t* next = sed->src.cid->next; qse_sed_cid_t* next = sed->src.cid->next;
QSE_MMGR_FREE (sed->mmgr, sed->src.cid); qse_sed_freemem (sed, sed->src.cid);
sed->src.cid = next; sed->src.cid = next;
} }
} }
@ -1023,7 +1014,7 @@ do { \
qse_cint_t c; qse_cint_t c;
qse_str_t* t = QSE_NULL; qse_str_t* t = QSE_NULL;
t = qse_str_open (sed->mmgr, 0, 128); t = qse_str_open(qse_sed_getmmgr(sed), 0, 128);
if (t == QSE_NULL) goto oops; if (t == QSE_NULL) goto oops;
c = CURSC (sed); c = CURSC (sed);
@ -1208,7 +1199,7 @@ static int get_branch_target (qse_sed_t* sed, qse_sed_cmd_t* cmd)
return terminate_command (sed); return terminate_command (sed);
} }
t = qse_str_open (sed->mmgr, 0, 32); t = qse_str_open(qse_sed_getmmgr(sed), 0, 32);
if (t == QSE_NULL) if (t == QSE_NULL)
{ {
SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL);
@ -1266,7 +1257,7 @@ static int get_file (qse_sed_t* sed, qse_cstr_t* xstr)
goto oops; goto oops;
} }
t = qse_str_open (sed->mmgr, 0, 32); t = qse_str_open(qse_sed_getmmgr(sed), 0, 32);
if (t == QSE_NULL) if (t == QSE_NULL)
{ {
SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL);
@ -1366,15 +1357,15 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd)
t[0] = &sed->tmp.rex; t[0] = &sed->tmp.rex;
qse_str_clear (t[0]); qse_str_clear (t[0]);
t[1] = qse_str_open (sed->mmgr, 0, 32); t[1] = qse_str_open(qse_sed_getmmgr(sed), 0, 32);
if (t[1] == QSE_NULL) if (t[1] == QSE_NULL)
{ {
SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL);
goto oops; goto oops;
} }
if (pickup_rex (sed, delim, 0, cmd, t[0]) <= -1) goto oops; if (pickup_rex(sed, delim, 0, cmd, t[0]) <= -1) goto oops;
if (pickup_rex (sed, delim, 1, cmd, t[1]) <= -1) goto oops; if (pickup_rex(sed, delim, 1, cmd, t[1]) <= -1) goto oops;
/* skip spaces before options */ /* skip spaces before options */
do { NXTSC_GOTO (sed, c, oops); } while (IS_SPACE(c)); do { NXTSC_GOTO (sed, c, oops); } while (IS_SPACE(c));
@ -1488,7 +1479,7 @@ static int get_transet (qse_sed_t* sed, qse_sed_cmd_t* cmd)
goto oops; goto oops;
} }
t = qse_str_open (sed->mmgr, 0, 32); t = qse_str_open(qse_sed_getmmgr(sed), 0, 32);
if (t == QSE_NULL) if (t == QSE_NULL)
{ {
SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL);
@ -1592,7 +1583,7 @@ static void free_all_cut_selector_blocks (qse_sed_t* sed, qse_sed_cmd_t* cmd)
for (b = cmd->u.cut.fb; b; b = next) for (b = cmd->u.cut.fb; b; b = next)
{ {
next = b->next; next = b->next;
QSE_MMGR_FREE (sed->mmgr, b); qse_sed_freemem (sed, b);
} }
cmd->u.cut.lb = QSE_NULL; cmd->u.cut.lb = QSE_NULL;
@ -2662,7 +2653,7 @@ static int link_append (qse_sed_t* sed, qse_sed_cmd_t* cmd)
qse_sed_app_t* app; qse_sed_app_t* app;
/* otherwise, link it using a linked list */ /* otherwise, link it using a linked list */
app = QSE_MMGR_ALLOC (sed->mmgr, QSE_SIZEOF(*app)); app = qse_sed_allocmem(sed, QSE_SIZEOF(*app));
if (app == QSE_NULL) if (app == QSE_NULL)
{ {
SETERR0 (sed, QSE_SED_ENOMEM, &cmd->loc); SETERR0 (sed, QSE_SED_ENOMEM, &cmd->loc);
@ -2690,7 +2681,7 @@ static void free_appends (qse_sed_t* sed)
while (app) while (app)
{ {
next = app->next; next = app->next;
QSE_MMGR_FREE (sed->mmgr, app); qse_sed_freemem (sed, app);
app = next; app = next;
} }
@ -2829,7 +2820,7 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd)
#if defined(USE_REX) #if defined(USE_REX)
n = qse_matchrex ( n = qse_matchrex (
sed->mmgr, qse_sed_getmmgr(sed),
sed->opt.depth.rex.match, sed->opt.depth.rex.match,
rex, opt, rex, opt,
&str, &cur, &mat, &errnum &str, &cur, &mat, &errnum
@ -3292,7 +3283,7 @@ static int match_a (qse_sed_t* sed, qse_sed_cmd_t* cmd, qse_sed_adr_t* a)
} }
#if defined(USE_REX) #if defined(USE_REX)
n = qse_matchrex ( n = qse_matchrex (
sed->mmgr, qse_sed_getmmgr(sed),
sed->opt.depth.rex.match, sed->opt.depth.rex.match,
rex, 0, rex, 0,
&line, &line, &line, &line,
@ -3868,7 +3859,7 @@ static int init_command_block_for_exec (qse_sed_t* sed, qse_sed_cmd_blk_t* b)
c->u.branch.target = QSE_MAP_VPTR(pair); c->u.branch.target = QSE_MAP_VPTR(pair);
/* free resolved label name */ /* free resolved label name */
QSE_MMGR_FREE (sed->mmgr, lab->ptr); qse_sed_freemem (sed, lab->ptr);
lab->ptr = QSE_NULL; lab->ptr = QSE_NULL;
lab->len = 0; lab->len = 0;
} }
@ -3980,7 +3971,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_impl_t inf, qse_sed_io_impl_t outf)
sed->e.out.eof = 0; sed->e.out.eof = 0;
sed->e.out.len = 0; sed->e.out.len = 0;
if (qse_map_init ( if (qse_map_init (
&sed->e.out.files, sed->mmgr, &sed->e.out.files, qse_sed_getmmgr(sed),
128, 70, QSE_SIZEOF(qse_char_t), 1) <= -1) 128, 70, QSE_SIZEOF(qse_char_t), 1) <= -1)
{ {
SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL);
@ -3994,7 +3985,7 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_impl_t inf, qse_sed_io_impl_t outf)
sed->e.in.len = 0; sed->e.in.len = 0;
sed->e.in.pos = 0; sed->e.in.pos = 0;
sed->e.in.num = 0; sed->e.in.num = 0;
if (qse_str_init (&sed->e.in.line, sed->mmgr, 256) <= -1) if (qse_str_init (&sed->e.in.line, qse_sed_getmmgr(sed), 256) <= -1)
{ {
qse_map_fini (&sed->e.out.files); qse_map_fini (&sed->e.out.files);
SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL); SETERR0 (sed, QSE_SED_ENOMEM, QSE_NULL);
@ -4132,8 +4123,7 @@ const qse_char_t* qse_sed_setcompid (qse_sed_t* sed, const qse_char_t* id)
if (id == QSE_NULL) id = QSE_T(""); if (id == QSE_NULL) id = QSE_T("");
len = qse_strlen (id); len = qse_strlen (id);
cid = QSE_MMGR_ALLOC (sed->mmgr, cid = qse_sed_allocmem(sed, QSE_SIZEOF(*cid) + ((len + 1) * QSE_SIZEOF(*id)));
QSE_SIZEOF(*cid) + ((len + 1) * QSE_SIZEOF(*id)));
if (cid == QSE_NULL) if (cid == QSE_NULL)
{ {
/* mark that an error has occurred */ /* mark that an error has occurred */
@ -4175,15 +4165,14 @@ void qse_sed_pushecb (qse_sed_t* sed, qse_sed_ecb_t* ecb)
void* qse_sed_allocmem (qse_sed_t* sed, qse_size_t size) void* qse_sed_allocmem (qse_sed_t* sed, qse_size_t size)
{ {
void* ptr = QSE_MMGR_ALLOC (sed->mmgr, size); void* ptr = QSE_MMGR_ALLOC(qse_sed_getmmgr(sed), size);
if (ptr == QSE_NULL) if (ptr == QSE_NULL) qse_sed_seterrnum (sed, QSE_SED_ENOMEM, QSE_NULL);
qse_sed_seterrnum (sed, QSE_SED_ENOMEM, QSE_NULL);
return ptr; return ptr;
} }
void* qse_sed_callocmem (qse_sed_t* sed, qse_size_t size) void* qse_sed_callocmem (qse_sed_t* sed, qse_size_t size)
{ {
void* ptr = QSE_MMGR_ALLOC (sed->mmgr, size); void* ptr = QSE_MMGR_ALLOC(qse_sed_getmmgr(sed), size);
if (ptr) QSE_MEMSET (ptr, 0, size); if (ptr) QSE_MEMSET (ptr, 0, size);
else qse_sed_seterrnum (sed, QSE_SED_ENOMEM, QSE_NULL); else qse_sed_seterrnum (sed, QSE_SED_ENOMEM, QSE_NULL);
return ptr; return ptr;
@ -4191,14 +4180,14 @@ void* qse_sed_callocmem (qse_sed_t* sed, qse_size_t size)
void* qse_sed_reallocmem (qse_sed_t* sed, void* ptr, qse_size_t size) void* qse_sed_reallocmem (qse_sed_t* sed, void* ptr, qse_size_t size)
{ {
void* nptr = QSE_MMGR_REALLOC (sed->mmgr, ptr, size); void* nptr = QSE_MMGR_REALLOC(qse_sed_getmmgr(sed), ptr, size);
if (nptr == QSE_NULL) qse_sed_seterrnum (sed, QSE_SED_ENOMEM, QSE_NULL); if (nptr == QSE_NULL) qse_sed_seterrnum (sed, QSE_SED_ENOMEM, QSE_NULL);
return nptr; return nptr;
} }
void qse_sed_freemem (qse_sed_t* sed, void* ptr) void qse_sed_freemem (qse_sed_t* sed, void* ptr)
{ {
QSE_MMGR_FREE (sed->mmgr, ptr); QSE_MMGR_FREE (qse_sed_getmmgr(sed), ptr);
} }

View File

@ -61,6 +61,11 @@ struct xtn_t
} e; } e;
}; };
#if defined(QSE_HAVE_INLINE)
static QSE_INLINE xtn_t* GET_XTN(qse_sed_t* sed) { return (xtn_t*)((qse_uint8_t*)qse_sed_getxtn(sed) - QSE_SIZEOF(xtn_t)); }
#else
#define GET_XTN(sed) ((xtn_t*)((qse_uint8_t*)qse_sed_getxtn(sed) - QSE_SIZEOF(xtn_t)))
#endif
static int int_to_str (qse_size_t val, qse_char_t* buf, qse_size_t buflen) static int int_to_str (qse_size_t val, qse_char_t* buf, qse_size_t buflen)
{ {
@ -107,12 +112,14 @@ qse_sed_t* qse_sed_openstd (qse_size_t xtnsize, qse_sed_errnum_t* errnum)
qse_sed_t* qse_sed_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_sed_errnum_t* errnum) qse_sed_t* qse_sed_openstdwithmmgr (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_sed_errnum_t* errnum)
{ {
return qse_sed_open (mmgr, QSE_SIZEOF(xtn_t) + xtnsize, errnum); qse_sed_t* sed;
}
void* qse_sed_getxtnstd (qse_sed_t* sed) sed = qse_sed_open (mmgr, QSE_SIZEOF(xtn_t) + xtnsize, errnum);
{ if (!sed) return QSE_NULL;
return (void*)((xtn_t*)QSE_XTN(sed) + 1);
sed->_instsize += QSE_SIZEOF(xtn_t);
return sed;
} }
static int verify_iostd_in (qse_sed_t* sed, qse_sed_iostd_t in[]) static int verify_iostd_in (qse_sed_t* sed, qse_sed_iostd_t in[])
@ -145,7 +152,7 @@ static qse_sio_t* open_sio_file (qse_sed_t* sed, const qse_char_t* file, int fla
{ {
qse_sio_t* sio; qse_sio_t* sio;
sio = qse_sio_open (sed->mmgr, 0, file, flags); sio = qse_sio_open(qse_sed_getmmgr(sed), 0, file, flags);
if (sio == QSE_NULL) if (sio == QSE_NULL)
{ {
qse_cstr_t ea; qse_cstr_t ea;
@ -173,7 +180,7 @@ static qse_sio_t* open_sio_std (qse_sed_t* sed, qse_sio_std_t std, int flags)
{ {
qse_sio_t* sio; qse_sio_t* sio;
sio = qse_sio_openstd (sed->mmgr, 0, std, flags); sio = qse_sio_openstd(qse_sed_getmmgr(sed), 0, std, flags);
if (sio == QSE_NULL) if (sio == QSE_NULL)
{ {
qse_cstr_t ea; qse_cstr_t ea;
@ -214,7 +221,7 @@ static void close_main_stream (
static int open_input_stream ( static int open_input_stream (
qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_sed_iostd_t* io, xtn_in_t* base) qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_sed_iostd_t* io, xtn_in_t* base)
{ {
xtn_t* xtn = (xtn_t*) QSE_XTN (sed); xtn_t* xtn = GET_XTN(sed);
QSE_ASSERT (io != QSE_NULL); QSE_ASSERT (io != QSE_NULL);
switch (io->type) switch (io->type)
@ -295,7 +302,7 @@ static int open_input_stream (
static int open_output_stream (qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_sed_iostd_t* io) static int open_output_stream (qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_sed_iostd_t* io)
{ {
xtn_t* xtn = (xtn_t*) QSE_XTN (sed); xtn_t* xtn = GET_XTN(sed);
QSE_ASSERT (io != QSE_NULL); QSE_ASSERT (io != QSE_NULL);
switch (io->type) switch (io->type)
@ -334,7 +341,7 @@ static int open_output_stream (qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_sed_io
case QSE_SED_IOSTD_STR: case QSE_SED_IOSTD_STR:
/* don't store anything to arg->handle */ /* don't store anything to arg->handle */
xtn->e.out.memstr = qse_str_open (sed->mmgr, 0, 512); xtn->e.out.memstr = qse_str_open(qse_sed_getmmgr(sed), 0, 512);
if (xtn->e.out.memstr == QSE_NULL) if (xtn->e.out.memstr == QSE_NULL)
{ {
qse_sed_seterrnum (sed, QSE_SED_ENOMEM, QSE_NULL); qse_sed_seterrnum (sed, QSE_SED_ENOMEM, QSE_NULL);
@ -362,7 +369,7 @@ static qse_ssize_t read_input_stream (
qse_sed_t* sed, qse_sed_io_arg_t* arg, qse_sed_t* sed, qse_sed_io_arg_t* arg,
qse_char_t* buf, qse_size_t len, xtn_in_t* base) qse_char_t* buf, qse_size_t len, xtn_in_t* base)
{ {
xtn_t* xtn = (xtn_t*) QSE_XTN (sed); xtn_t* xtn = GET_XTN(sed);
qse_sed_iostd_t* io, * next; qse_sed_iostd_t* io, * next;
void* old, * new; void* old, * new;
qse_ssize_t n = 0; qse_ssize_t n = 0;
@ -485,7 +492,7 @@ static qse_ssize_t s_in (
qse_sed_t* sed, qse_sed_io_cmd_t cmd, qse_sed_io_arg_t* arg, qse_sed_t* sed, qse_sed_io_cmd_t cmd, qse_sed_io_arg_t* arg,
qse_char_t* buf, qse_size_t len) qse_char_t* buf, qse_size_t len)
{ {
xtn_t* xtn = (xtn_t*) QSE_XTN (sed); xtn_t* xtn = GET_XTN(sed);
switch (cmd) switch (cmd)
{ {
@ -523,7 +530,7 @@ static qse_ssize_t x_in (
qse_char_t* buf, qse_size_t len) qse_char_t* buf, qse_size_t len)
{ {
qse_sio_t* sio; qse_sio_t* sio;
xtn_t* xtn = (xtn_t*) QSE_XTN (sed); xtn_t* xtn = GET_XTN(sed);
switch (cmd) switch (cmd)
{ {
@ -623,7 +630,7 @@ static qse_ssize_t x_out (
qse_sed_t* sed, qse_sed_io_cmd_t cmd, qse_sed_io_arg_t* arg, qse_sed_t* sed, qse_sed_io_cmd_t cmd, qse_sed_io_arg_t* arg,
qse_char_t* dat, qse_size_t len) qse_char_t* dat, qse_size_t len)
{ {
xtn_t* xtn = (xtn_t*) QSE_XTN (sed); xtn_t* xtn = GET_XTN(sed);
qse_sio_t* sio; qse_sio_t* sio;
switch (cmd) switch (cmd)
@ -769,7 +776,7 @@ static qse_ssize_t x_out (
int qse_sed_compstd (qse_sed_t* sed, qse_sed_iostd_t in[], qse_size_t* count) int qse_sed_compstd (qse_sed_t* sed, qse_sed_iostd_t in[], qse_size_t* count)
{ {
xtn_t* xtn = (xtn_t*) QSE_XTN (sed); xtn_t* xtn = GET_XTN(sed);
int ret; int ret;
if (in == QSE_NULL) if (in == QSE_NULL)
@ -795,7 +802,7 @@ int qse_sed_execstd (
qse_sed_t* sed, qse_sed_iostd_t in[], qse_sed_iostd_t* out) qse_sed_t* sed, qse_sed_iostd_t in[], qse_sed_iostd_t* out)
{ {
int n; int n;
xtn_t* xtn = (xtn_t*) QSE_XTN (sed); xtn_t* xtn = GET_XTN(sed);
if (in && verify_iostd_in (sed, in) <= -1) return -1; if (in && verify_iostd_in (sed, in) <= -1) return -1;