made qse_sed_setexectracer() selectable at compile-time

This commit is contained in:
2011-10-07 23:09:48 +00:00
parent 915ef99f07
commit 5d774c198f
8 changed files with 135 additions and 38 deletions

View File

@ -586,6 +586,9 @@ static void free_command (qse_sed_t* sed, qse_sed_cmd_t* cmd)
static void free_all_cids (qse_sed_t* sed)
{
if (sed->src.cid == (qse_sed_cid_t*)&sed->src.unknown_cid)
sed->src.cid = sed->src.cid->next;
while (sed->src.cid)
{
qse_sed_cid_t* next = sed->src.cid->next;
@ -3542,7 +3545,9 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf)
while (!sed->e.stopreq)
{
#ifdef QSE_ENABLE_SEDTRACER
if (sed->e.tracer) sed->e.tracer (sed, QSE_SED_EXEC_READ, QSE_NULL);
#endif
n = read_line (sed, 0);
if (n <= -1) { ret = -1; goto done; }
@ -3561,7 +3566,9 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf)
while (c != &sed->cmd.over)
{
#ifdef QSE_ENABLE_SEDTRACER
if (sed->e.tracer) sed->e.tracer (sed, QSE_SED_EXEC_MATCH, c);
#endif
n = match_address (sed, c);
if (n <= -1) { ret = -1; goto done; }
@ -3573,7 +3580,9 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf)
continue;
}
#ifdef QSE_ENABLE_SEDTRACER
if (sed->e.tracer) sed->e.tracer (sed, QSE_SED_EXEC_EXEC, c);
#endif
j = exec_cmd (sed, c);
if (j == QSE_NULL) { ret = -1; goto done; }
if (j == &sed->cmd.quit_quiet) goto done;
@ -3590,7 +3599,9 @@ int qse_sed_exec (qse_sed_t* sed, qse_sed_io_fun_t inf, qse_sed_io_fun_t outf)
}
}
#ifdef QSE_ENABLE_SEDTRACER
if (sed->e.tracer) sed->e.tracer (sed, QSE_SED_EXEC_WRITE, QSE_NULL);
#endif
if (emit_output (sed, 0) <= -1) { ret = -1; goto done; }
}
@ -3635,14 +3646,29 @@ const qse_char_t* qse_sed_setcompid (qse_sed_t* sed, const qse_char_t* id)
qse_sed_cid_t* cid;
qse_size_t len;
if (sed->src.cid == (qse_sed_cid_t*)&sed->src.unknown_cid)
{
/* if an error has occurred in a previously, you can't set it
* any more */
return (const qse_char_t*)(sed->src.cid + 1);
}
len = qse_strlen (id);
cid = QSE_MMGR_ALLOC (sed->mmgr, QSE_SIZEOF(*cid) + ((len + 1) * QSE_SIZEOF(*id)));
if (cid == QSE_NULL) return QSE_NULL;
cid = QSE_MMGR_ALLOC (sed->mmgr,
QSE_SIZEOF(*cid) + ((len + 1) * QSE_SIZEOF(*id)));
if (cid == QSE_NULL)
{
/* mark that an error has occurred */
sed->src.unknown_cid.buf[0] = QSE_T('\0');
cid = (qse_sed_cid_t*)&sed->src.unknown_cid;
}
else
{
qse_strcpy ((qse_char_t*)(cid + 1), id);
}
cid->next = sed->src.cid;
sed->src.cid = cid;
qse_strcpy ((qse_char_t*)(cid + 1), id);
return (const qse_char_t*)(cid + 1);
}
@ -3656,6 +3682,7 @@ void qse_sed_setlinenum (qse_sed_t* sed, qse_size_t num)
sed->e.in.num = num;
}
#ifdef QSE_ENABLE_SEDTRACER
qse_sed_exec_tracer_t qse_sed_getexectracer (qse_sed_t* sed)
{
return sed->e.tracer;
@ -3665,4 +3692,5 @@ void qse_sed_setexectracer (qse_sed_t* sed, qse_sed_exec_tracer_t tracer)
{
sed->e.tracer = tracer;
}
#endif

View File

@ -61,6 +61,13 @@ struct qse_sed_cid_t
qse_sed_cid_t* next;
};
typedef struct qse_sed_unknown_cid_t qse_sed_unknown_cid_t;
struct qse_sed_unknown_cid_t
{
qse_sed_cid_t* next;
qse_char_t buf[1];
};
/**
* The qse_sed_t type defines a stream editor
*/
@ -94,7 +101,9 @@ struct qse_sed_t
qse_char_t buf[1024];
int eof;
qse_sed_cid_t* cid;
qse_sed_cid_t* cid;
qse_sed_unknown_cid_t unknown_cid;
qse_sed_loc_t loc; /**< location */
qse_cint_t cc; /**< last character read */
const qse_char_t* ptr; /**< beginning of the source text */
@ -197,8 +206,10 @@ struct qse_sed_t
/** stop requested */
int stopreq;
#ifdef QSE_ENABLE_SEDTRACER
/** trace function */
qse_sed_exec_tracer_t tracer;
#endif
} e;
};