added qse_str_del() and codede the D command in sed
This commit is contained in:
parent
f0b916ce81
commit
bd6a54d00d
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: str.h 127 2009-05-07 13:15:04Z hyunghwan.chung $
|
* $Id: str.h 138 2009-05-17 09:35:16Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -539,6 +539,12 @@ qse_size_t qse_str_nccat (
|
|||||||
qse_size_t len
|
qse_size_t len
|
||||||
);
|
);
|
||||||
|
|
||||||
|
qse_size_t qse_str_del (
|
||||||
|
qse_str_t* str,
|
||||||
|
qse_size_t index,
|
||||||
|
qse_size_t size
|
||||||
|
);
|
||||||
|
|
||||||
/****f* Common/qse_strspl
|
/****f* Common/qse_strspl
|
||||||
* NAME
|
* NAME
|
||||||
* qse_strspl - split a string into fields
|
* qse_strspl - split a string into fields
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: str_dyn.c 126 2009-05-05 02:12:38Z hyunghwan.chung $
|
* $Id: str_dyn.c 138 2009-05-17 09:35:16Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -311,3 +311,24 @@ qse_size_t qse_str_nccat (qse_str_t* str, qse_char_t c, qse_size_t len)
|
|||||||
return str->len;
|
return str->len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qse_size_t qse_str_del (qse_str_t* str, qse_size_t index, qse_size_t size)
|
||||||
|
{
|
||||||
|
if (str->ptr != QSE_NULL && index < str->len && size > 0)
|
||||||
|
{
|
||||||
|
qse_size_t nidx = index + size;
|
||||||
|
if (nidx >= str->len)
|
||||||
|
{
|
||||||
|
str->ptr[index] = QSE_T('\0');
|
||||||
|
str->len = index;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qse_strncpy (
|
||||||
|
&str->ptr[index], &str->ptr[nidx],
|
||||||
|
str->len - nidx);
|
||||||
|
str->len -= size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return str->len;
|
||||||
|
}
|
||||||
|
@ -246,6 +246,14 @@ static void free_command (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
|||||||
QSE_MMGR_FREE (sed->mmgr, cmd->u.text.ptr);
|
QSE_MMGR_FREE (sed->mmgr, cmd->u.text.ptr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case QSE_SED_CMD_READ_FILE:
|
||||||
|
case QSE_SED_CMD_READ_FILELN:
|
||||||
|
case QSE_SED_CMD_WRITE_FILE:
|
||||||
|
case QSE_SED_CMD_WRITE_FILELN:
|
||||||
|
if (cmd->u.file.ptr != QSE_NULL)
|
||||||
|
QSE_MMGR_FREE (sed->mmgr, cmd->u.file.ptr);
|
||||||
|
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 != QSE_NULL)
|
if (cmd->u.branch.label.ptr != QSE_NULL)
|
||||||
@ -266,14 +274,6 @@ static void free_command (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
|||||||
QSE_MMGR_FREE (sed->mmgr, cmd->u.transet.ptr);
|
QSE_MMGR_FREE (sed->mmgr, cmd->u.transet.ptr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QSE_SED_CMD_READ_FILE:
|
|
||||||
case QSE_SED_CMD_READ_FILELN:
|
|
||||||
case QSE_SED_CMD_WRITE_FILE:
|
|
||||||
case QSE_SED_CMD_WRITE_FILELN:
|
|
||||||
if (cmd->u.file.ptr != QSE_NULL)
|
|
||||||
QSE_MMGR_FREE (sed->mmgr, cmd->u.file.ptr);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1848,9 +1848,10 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
|||||||
);
|
);
|
||||||
if (n <= -1) return -1;
|
if (n <= -1) return -1;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
sed->e.subst_done = 1;
|
sed->e.subst_done = 1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2065,6 +2066,25 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case QSE_SED_CMD_DELETE_FIRSTLN:
|
||||||
|
{
|
||||||
|
qse_char_t* nl;
|
||||||
|
|
||||||
|
/* delete the first line from the pattern space */
|
||||||
|
nl = qse_strxchr (
|
||||||
|
QSE_STR_PTR(&sed->e.in.line),
|
||||||
|
QSE_STR_LEN(&sed->e.in.line),
|
||||||
|
QSE_T('\n'));
|
||||||
|
if (nl != QSE_NULL)
|
||||||
|
{
|
||||||
|
/* if a new line is found */
|
||||||
|
qse_str_del (&sed->e.in.line, 0,
|
||||||
|
nl - QSE_STR_PTR(&sed->e.in.line) + 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* otherwise clear the entire pattern space below */
|
||||||
|
}
|
||||||
case QSE_SED_CMD_DELETE:
|
case QSE_SED_CMD_DELETE:
|
||||||
/* delete the pattern space */
|
/* delete the pattern space */
|
||||||
qse_str_clear (&sed->e.in.line);
|
qse_str_clear (&sed->e.in.line);
|
||||||
@ -2261,6 +2281,11 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
|||||||
jumpto = cmd->u.branch.target;
|
jumpto = cmd->u.branch.target;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case QSE_SED_CMD_SUBSTITUTE:
|
||||||
|
n = do_subst (sed, cmd);
|
||||||
|
if (n <= -1) return QSE_NULL;
|
||||||
|
break;
|
||||||
|
|
||||||
case QSE_SED_CMD_TRANSLATE:
|
case QSE_SED_CMD_TRANSLATE:
|
||||||
{
|
{
|
||||||
qse_char_t* ptr = QSE_STR_PTR(&sed->e.in.line);
|
qse_char_t* ptr = QSE_STR_PTR(&sed->e.in.line);
|
||||||
@ -2286,11 +2311,6 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case QSE_SED_CMD_SUBSTITUTE:
|
|
||||||
n = do_subst (sed, cmd);
|
|
||||||
if (n <= -1) return QSE_NULL;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jumpto == QSE_NULL) jumpto = cmd + 1;
|
if (jumpto == QSE_NULL) jumpto = cmd + 1;
|
||||||
|
@ -56,7 +56,7 @@ struct qse_sed_cmd_t
|
|||||||
QSE_SED_CMD_CHANGE = QSE_T('c'),
|
QSE_SED_CMD_CHANGE = QSE_T('c'),
|
||||||
|
|
||||||
QSE_SED_CMD_DELETE = QSE_T('d'),
|
QSE_SED_CMD_DELETE = QSE_T('d'),
|
||||||
QSE_SED_CMD_DD = QSE_T('D'),
|
QSE_SED_CMD_DELETE_FIRSTLN = QSE_T('D'),
|
||||||
|
|
||||||
QSE_SED_CMD_PRINT_LNNUM = QSE_T('='),
|
QSE_SED_CMD_PRINT_LNNUM = QSE_T('='),
|
||||||
QSE_SED_CMD_PRINT = QSE_T('p'),
|
QSE_SED_CMD_PRINT = QSE_T('p'),
|
||||||
@ -72,14 +72,14 @@ struct qse_sed_cmd_t
|
|||||||
QSE_SED_CMD_NEXT = QSE_T('n'),
|
QSE_SED_CMD_NEXT = QSE_T('n'),
|
||||||
QSE_SED_CMD_NEXT_APPEND = QSE_T('N'),
|
QSE_SED_CMD_NEXT_APPEND = QSE_T('N'),
|
||||||
|
|
||||||
QSE_SED_CMD_BRANCH = QSE_T('b'),
|
|
||||||
QSE_SED_CMD_BRANCH_COND = QSE_T('t'),
|
|
||||||
|
|
||||||
QSE_SED_CMD_READ_FILE = QSE_T('r'),
|
QSE_SED_CMD_READ_FILE = QSE_T('r'),
|
||||||
QSE_SED_CMD_READ_FILELN = QSE_T('R'),
|
QSE_SED_CMD_READ_FILELN = QSE_T('R'),
|
||||||
QSE_SED_CMD_WRITE_FILE = QSE_T('w'),
|
QSE_SED_CMD_WRITE_FILE = QSE_T('w'),
|
||||||
QSE_SED_CMD_WRITE_FILELN = QSE_T('W'),
|
QSE_SED_CMD_WRITE_FILELN = QSE_T('W'),
|
||||||
|
|
||||||
|
QSE_SED_CMD_BRANCH = QSE_T('b'),
|
||||||
|
QSE_SED_CMD_BRANCH_COND = QSE_T('t'),
|
||||||
|
|
||||||
QSE_SED_CMD_SUBSTITUTE = QSE_T('s'),
|
QSE_SED_CMD_SUBSTITUTE = QSE_T('s'),
|
||||||
QSE_SED_CMD_TRANSLATE = QSE_T('y')
|
QSE_SED_CMD_TRANSLATE = QSE_T('y')
|
||||||
|
|
||||||
|
@ -527,6 +527,29 @@ static int test12 (void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int test13 (void)
|
||||||
|
{
|
||||||
|
qse_char_t a1[] = QSE_T("abcdefghijklmnopqrstuvwxyz");
|
||||||
|
qse_str_t x;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
qse_str_init (&x, QSE_MMGR_GETDFL(), 5);
|
||||||
|
|
||||||
|
for (i = 1; i < 20; i++)
|
||||||
|
{
|
||||||
|
qse_str_cpy (&x, a1);
|
||||||
|
qse_str_del (&x, 10, i);
|
||||||
|
qse_printf (QSE_T("deleleted %d from 10 => %llu [%s]\n"),
|
||||||
|
i,
|
||||||
|
(unsigned long long)QSE_STR_LEN(&x),
|
||||||
|
QSE_STR_PTR(&x));
|
||||||
|
}
|
||||||
|
|
||||||
|
qse_str_fini (&x);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main ()
|
int main ()
|
||||||
{
|
{
|
||||||
setlocale (LC_ALL, "");
|
setlocale (LC_ALL, "");
|
||||||
@ -547,6 +570,7 @@ int main ()
|
|||||||
R (test10);
|
R (test10);
|
||||||
R (test11);
|
R (test11);
|
||||||
R (test12);
|
R (test12);
|
||||||
|
R (test13);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user