improved get_subst() for sed. work still in progress
This commit is contained in:
parent
d8a920e263
commit
cf12f0ae23
@ -48,7 +48,10 @@ enum qse_sed_errnum_t
|
|||||||
QSE_SED_ENOTRM, /* not terminated properly */
|
QSE_SED_ENOTRM, /* not terminated properly */
|
||||||
QSE_SED_ETSNSL, /* translation set not the same length*/
|
QSE_SED_ETSNSL, /* translation set not the same length*/
|
||||||
QSE_SED_EGRNBA, /* group brackets not balanced */
|
QSE_SED_EGRNBA, /* group brackets not balanced */
|
||||||
QSE_SED_EGRNTD /* group nested too deeply */
|
QSE_SED_EGRNTD, /* group nested too deeply */
|
||||||
|
QSE_SED_EOCSDU, /* multiple occurrence specifiers */
|
||||||
|
QSE_SED_EOCSZE, /* occurrence specifier to s is zero */
|
||||||
|
QSE_SED_EOCSTL /* occurrence specifier too large */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum qse_sed_option_t
|
enum qse_sed_option_t
|
||||||
|
@ -172,7 +172,10 @@ const qse_char_t* qse_sed_geterrmsg (qse_sed_t* sed)
|
|||||||
QSE_T("command not terminated properly"),
|
QSE_T("command not terminated properly"),
|
||||||
QSE_T("strings in translation set not the same length"),
|
QSE_T("strings in translation set not the same length"),
|
||||||
QSE_T("group brackets not balanced"),
|
QSE_T("group brackets not balanced"),
|
||||||
QSE_T("group nesting too deep")
|
QSE_T("group nesting too deep"),
|
||||||
|
QSE_T("multiple occurrence specifier"),
|
||||||
|
QSE_T("occurrence specifier is zero"),
|
||||||
|
QSE_T("occurrence specifier too large")
|
||||||
};
|
};
|
||||||
|
|
||||||
return (sed->errnum > 0 && sed->errnum < QSE_COUNTOF(errmsg))?
|
return (sed->errnum > 0 && sed->errnum < QSE_COUNTOF(errmsg))?
|
||||||
@ -538,7 +541,7 @@ oops:
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_file_name (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
static int get_file (qse_sed_t* sed, qse_xstr_t* xstr)
|
||||||
{
|
{
|
||||||
qse_cint_t c;
|
qse_cint_t c;
|
||||||
qse_str_t* t = QSE_NULL;
|
qse_str_t* t = QSE_NULL;
|
||||||
@ -604,7 +607,7 @@ static int get_file_name (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
|||||||
qse_str_setlen (t, QSE_STR_LEN(t) - trailing_spaces);
|
qse_str_setlen (t, QSE_STR_LEN(t) - trailing_spaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_str_yield (t, &cmd->u.file, 0);
|
qse_str_yield (t, xstr, 0);
|
||||||
qse_str_close (t);
|
qse_str_close (t);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -680,14 +683,74 @@ static int get_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c = NXTSC (sed);
|
/* skip spaces before options */
|
||||||
|
do { c = NXTSC(sed); } while (IS_SPACE(c));
|
||||||
|
|
||||||
|
/* get options */
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (c == QSE_T('p'))
|
||||||
|
{
|
||||||
|
cmd->u.subst.p = 1;
|
||||||
|
c = NXTSC (sed);
|
||||||
|
}
|
||||||
|
else if (c == QSE_T('i'))
|
||||||
|
{
|
||||||
|
cmd->u.subst.i = 1;
|
||||||
|
c = NXTSC (sed);
|
||||||
|
}
|
||||||
|
else if (c == QSE_T('g'))
|
||||||
|
{
|
||||||
|
cmd->u.subst.g = 1;
|
||||||
|
c = NXTSC (sed);
|
||||||
|
}
|
||||||
|
else if (c >= QSE_T('0') && c <= QSE_T('9'))
|
||||||
|
{
|
||||||
|
unsigned long occ;
|
||||||
|
|
||||||
|
if (cmd->u.subst.occ != 0)
|
||||||
|
{
|
||||||
|
sed->errnum = QSE_SED_EOCSDU;
|
||||||
|
goto oops;
|
||||||
|
}
|
||||||
|
|
||||||
|
occ = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
occ = occ * 10 + (c - QSE_T('0'));
|
||||||
|
if (occ > QSE_TYPE_MAX(unsigned short))
|
||||||
|
{
|
||||||
|
sed->errnum = QSE_SED_EOCSTL;
|
||||||
|
goto oops;
|
||||||
|
}
|
||||||
|
c = NXTSC (sed);
|
||||||
|
}
|
||||||
|
while (c >= QSE_T('0') && c <= QSE_T('9'));
|
||||||
|
|
||||||
|
if (occ == 0)
|
||||||
|
{
|
||||||
|
sed->errnum = QSE_SED_EOCSZE;
|
||||||
|
goto oops;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd->u.subst.occ = occ;
|
||||||
|
}
|
||||||
|
else if (c == QSE_T('w'))
|
||||||
|
{
|
||||||
|
ADVSCP (sed);
|
||||||
|
if (get_file (sed, &cmd->u.subst.file) == -1) return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
while (1);
|
||||||
|
|
||||||
ADVSCP (sed);
|
|
||||||
if (terminate_command (sed) == -1) goto oops;
|
if (terminate_command (sed) == -1) goto oops;
|
||||||
|
|
||||||
qse_str_yield (t[1], &cmd->u.subst.rex, 0);
|
qse_str_yield (t[1], &cmd->u.subst.rex, 0);
|
||||||
qse_str_yield (t[0], &cmd->u.subst.rpl, 0);
|
qse_str_yield (t[0], &cmd->u.subst.rpl, 0);
|
||||||
|
if (cmd->u.subst.g == 0 && cmd->u.subst.occ == 0) cmd->u.subst.occ = 1;
|
||||||
|
|
||||||
qse_str_close (t[1]);
|
qse_str_close (t[1]);
|
||||||
qse_str_close (t[0]);
|
qse_str_close (t[0]);
|
||||||
@ -974,7 +1037,7 @@ qse_printf (QSE_T("cmd->u.branch.target = [%p]\n"), cmd->u.branch.target);
|
|||||||
case QSE_T('W'):
|
case QSE_T('W'):
|
||||||
cmd->type = c;
|
cmd->type = c;
|
||||||
ADVSCP (sed);
|
ADVSCP (sed);
|
||||||
if (get_file_name (sed, cmd) == -1) return -1;
|
if (get_file (sed, &cmd->u.file) == -1) return -1;
|
||||||
|
|
||||||
qse_printf (QSE_T("cmd->u.file= [%.*s]\n"), (int)cmd->u.file.len, cmd->u.file.ptr);
|
qse_printf (QSE_T("cmd->u.file= [%.*s]\n"), (int)cmd->u.file.len, cmd->u.file.ptr);
|
||||||
break;
|
break;
|
||||||
@ -986,6 +1049,12 @@ qse_printf (QSE_T("cmd->u.file= [%.*s]\n"), (int)cmd->u.file.len, cmd->u.file.pt
|
|||||||
if (get_subst (sed, cmd) == -1) return -1;
|
if (get_subst (sed, cmd) == -1) return -1;
|
||||||
qse_printf (QSE_T("rex= [%.*s]\n"), (int)cmd->u.subst.rex.len, cmd->u.subst.rex.ptr);
|
qse_printf (QSE_T("rex= [%.*s]\n"), (int)cmd->u.subst.rex.len, cmd->u.subst.rex.ptr);
|
||||||
qse_printf (QSE_T("rpl= [%.*s]\n"), (int)cmd->u.subst.rpl.len, cmd->u.subst.rpl.ptr);
|
qse_printf (QSE_T("rpl= [%.*s]\n"), (int)cmd->u.subst.rpl.len, cmd->u.subst.rpl.ptr);
|
||||||
|
qse_printf (QSE_T("g=%u p=%u i=%u occ=%d\n"),
|
||||||
|
cmd->u.subst.g,
|
||||||
|
cmd->u.subst.p,
|
||||||
|
cmd->u.subst.i,
|
||||||
|
cmd->u.subst.occ
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QSE_T('y'):
|
case QSE_T('y'):
|
||||||
|
@ -119,9 +119,10 @@ struct qse_sed_cmd_t
|
|||||||
|
|
||||||
/* flags */
|
/* flags */
|
||||||
qse_xstr_t file; /* file name for w */
|
qse_xstr_t file; /* file name for w */
|
||||||
int pos: 16;
|
unsigned short occ;
|
||||||
int p: 1; /* print */
|
unsigned short g: 1; /* global */
|
||||||
int i: 1; /* case insensitive */
|
unsigned short p: 1; /* print */
|
||||||
|
unsigned short i: 1; /* case insensitive */
|
||||||
} subst;
|
} subst;
|
||||||
|
|
||||||
/* translation set for the y command */
|
/* translation set for the y command */
|
||||||
|
Loading…
Reference in New Issue
Block a user