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_EREXMA, /**< regular expression match error */
QSE_SED_EA1PHB, /**< address 1 prohibited */ QSE_SED_EA1PHB, /**< address 1 prohibited */
QSE_SED_EA2PHB, /**< address 2 prohibited */ QSE_SED_EA2PHB, /**< address 2 prohibited */
QSE_SED_EASTEP, /**< invalid step address */
QSE_SED_ENEWLN, /**< a new line is expected */ QSE_SED_ENEWLN, /**< a new line is expected */
QSE_SED_EBSEXP, /**< \ is expected */ QSE_SED_EBSEXP, /**< \ is expected */
QSE_SED_EBSDEL, /**< \ used a delimiter */ 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) 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.subst);
qse_str_fini (&sed->e.txt.held); qse_str_fini (&sed->e.txt.held);
qse_str_fini (&sed->e.txt.read); qse_str_fini (&sed->e.txt.read);
qse_lda_fini (&sed->e.txt.appended); qse_lda_fini (&sed->e.txt.appended);
/* TODO: use different data sturect -> look at qse_sed_init */ /* TODO: use different data structure -> look at qse_sed_init */
qse_sed_cmd_t* c; for (c = sed->cmd.buf; c != sed->cmd.cur; c++) free_command (sed, c);
for (c = sed->cmd.buf; c != sed->cmd.cur; c++) QSE_MMGR_FREE (sed->mmgr, sed->cmd.buf);
{
free_command (sed, c);
}
QSE_MMGR_FREE (sed->mmgr, sed->cmd.buf);
qse_map_fini (&sed->labs); qse_map_fini (&sed->labs);
qse_str_fini (&sed->rexbuf); 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("regular expression match error"),
QSE_T("address 1 prohibited"), QSE_T("address 1 prohibited"),
QSE_T("address 2 prohibited"), QSE_T("address 2 prohibited"),
QSE_T("invalid step address"),
QSE_T("a new line expected"), QSE_T("a new line expected"),
QSE_T("a backslash expected"), QSE_T("a backslash expected"),
QSE_T("a backslash used as a delimiter"), 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'); 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) 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; 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; qse_cint_t c;
@ -459,6 +458,7 @@ do { \
done: done:
if ((sed->option & QSE_SED_ENSURENL) && c != QSE_T('\n')) if ((sed->option & QSE_SED_ENSURENL) && c != QSE_T('\n'))
{ {
/* TODO: support different line end scheme */
ADD (sed, t, QSE_T('\n'), oops); ADD (sed, t, QSE_T('\n'), oops);
} }
@ -1193,29 +1193,39 @@ static int compile_source (
/* initialize the current command */ /* initialize the current command */
QSE_MEMSET (cmd, 0, QSE_SIZEOF(*cmd)); QSE_MEMSET (cmd, 0, QSE_SIZEOF(*cmd));
/* process address */ /* process the first address */
if (address (sed, &cmd->a1) == QSE_NULL) return -1; if (get_address (sed, &cmd->a1) == QSE_NULL) return -1;
c = CURSC (sed); c = CURSC (sed);
if (cmd->a1.type != QSE_SED_A_NONE) if (cmd->a1.type != QSE_SED_A_NONE)
{ {
/* if (cmd->a1.type == QSE_SED_A_LAST) if (c == QSE_T(',') || c == QSE_T('~'))
{ {
// TODO: ???? qse_char_t delim = c;
} */
if (c == QSE_T(',') || c == QSE_T(';'))
{
/* maybe an address range */
ADVSCP (sed);
/* TODO: skip white spaces??? */ /* maybe an address range */
if (address (sed, &cmd->a2) == QSE_NULL) 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); QSE_ASSERT (cmd->a2.type == QSE_SED_A_NONE);
free_address (sed, cmd); free_address (sed, cmd);
return -1; 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); c = CURSC (sed);
} }
else cmd->a2.type = QSE_SED_A_NONE; else cmd->a2.type = QSE_SED_A_NONE;