added partial support for the N~M address

This commit is contained in:
hyung-hwan 2009-05-19 07:20:48 +00:00
parent 37bdcd4fb2
commit ce5a13559c
2 changed files with 31 additions and 20 deletions

View File

@ -54,6 +54,7 @@ enum qse_sed_errnum_t
QSE_SED_EREXMA, /**< regular expression match error */
QSE_SED_EA1PHB, /**< address 1 prohibited */
QSE_SED_EA2PHB, /**< address 2 prohibited */
QSE_SED_EASTEP, /**< invalid step address */
QSE_SED_ENEWLN, /**< a new line is expected */
QSE_SED_EBSEXP, /**< \ is expected */
QSE_SED_EBSDEL, /**< \ used a delimiter */

View File

@ -133,18 +133,16 @@ qse_sed_t* qse_sed_init (qse_sed_t* sed, qse_mmgr_t* mmgr)
void qse_sed_fini (qse_sed_t* sed)
{
qse_sed_cmd_t* c;
qse_str_fini (&sed->e.txt.subst);
qse_str_fini (&sed->e.txt.held);
qse_str_fini (&sed->e.txt.read);
qse_lda_fini (&sed->e.txt.appended);
/* TODO: use different data sturect -> look at qse_sed_init */
qse_sed_cmd_t* c;
for (c = sed->cmd.buf; c != sed->cmd.cur; c++)
{
free_command (sed, c);
}
QSE_MMGR_FREE (sed->mmgr, sed->cmd.buf);
/* TODO: use different data structure -> look at qse_sed_init */
for (c = sed->cmd.buf; c != sed->cmd.cur; c++) free_command (sed, c);
QSE_MMGR_FREE (sed->mmgr, sed->cmd.buf);
qse_map_fini (&sed->labs);
qse_str_fini (&sed->rexbuf);
@ -164,6 +162,7 @@ const qse_char_t* qse_sed_geterrmsg (qse_sed_t* sed)
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"),
@ -308,7 +307,7 @@ static void* compile_rex (qse_sed_t* sed, qse_char_t rxend)
}
if (c == QSE_T('n')) c = QSE_T('\n');
// TODO: support more escaped characters??
/* TODO: support more escaped characters?? */
}
if (qse_str_ccat (&sed->rexbuf, c) == (qse_size_t)-1)
@ -334,7 +333,7 @@ static void* compile_rex (qse_sed_t* sed, qse_char_t rxend)
return code;
}
static qse_sed_a_t* address (qse_sed_t* sed, qse_sed_a_t* a)
static qse_sed_a_t* get_address (qse_sed_t* sed, qse_sed_a_t* a)
{
qse_cint_t c;
@ -459,6 +458,7 @@ do { \
done:
if ((sed->option & QSE_SED_ENSURENL) && c != QSE_T('\n'))
{
/* TODO: support different line end scheme */
ADD (sed, t, QSE_T('\n'), oops);
}
@ -1193,29 +1193,39 @@ static int compile_source (
/* initialize the current command */
QSE_MEMSET (cmd, 0, QSE_SIZEOF(*cmd));
/* process address */
if (address (sed, &cmd->a1) == QSE_NULL) return -1;
/* process the first address */
if (get_address (sed, &cmd->a1) == QSE_NULL) return -1;
c = CURSC (sed);
if (cmd->a1.type != QSE_SED_A_NONE)
{
/* if (cmd->a1.type == QSE_SED_A_LAST)
if (c == QSE_T(',') || c == QSE_T('~'))
{
// TODO: ????
} */
if (c == QSE_T(',') || c == QSE_T(';'))
{
/* maybe an address range */
ADVSCP (sed);
qse_char_t delim = c;
/* TODO: skip white spaces??? */
if (address (sed, &cmd->a2) == QSE_NULL)
/* maybe an address range */
do { c = NXTSC (sed); } while (IS_SPACE(c));
if (get_address (sed, &cmd->a2) == QSE_NULL)
{
QSE_ASSERT (cmd->a2.type == QSE_SED_A_NONE);
free_address (sed, cmd);
return -1;
}
if (delim == QSE_T('~'))
{
if (cmd->a1.type != QSE_SED_A_LINE ||
cmd->a2.type != QSE_SED_A_LINE)
{
sed->errnum = QSE_SED_EASTEP;
free_address(sed, cmd);
return -1;
}
/* TODO; support step... */
}
c = CURSC (sed);
}
else cmd->a2.type = QSE_SED_A_NONE;