added qse_str_del() and codede the D command in sed
This commit is contained in:
@ -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.
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
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);
|
||||
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_COND:
|
||||
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);
|
||||
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:
|
||||
break;
|
||||
}
|
||||
@ -1848,9 +1848,10 @@ static int do_subst (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
||||
);
|
||||
if (n <= -1) return -1;
|
||||
}
|
||||
|
||||
sed->e.subst_done = 1;
|
||||
}
|
||||
|
||||
sed->e.subst_done = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2065,6 +2066,25 @@ static qse_sed_cmd_t* exec_cmd (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
||||
|
||||
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:
|
||||
/* delete the pattern space */
|
||||
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;
|
||||
break;
|
||||
|
||||
case QSE_SED_CMD_SUBSTITUTE:
|
||||
n = do_subst (sed, cmd);
|
||||
if (n <= -1) return QSE_NULL;
|
||||
break;
|
||||
|
||||
case QSE_SED_CMD_TRANSLATE:
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
case QSE_SED_CMD_SUBSTITUTE:
|
||||
n = do_subst (sed, cmd);
|
||||
if (n <= -1) return QSE_NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
if (jumpto == QSE_NULL) jumpto = cmd + 1;
|
||||
|
@ -48,15 +48,15 @@ struct qse_sed_cmd_t
|
||||
{
|
||||
enum
|
||||
{
|
||||
QSE_SED_CMD_QUIT = QSE_T('q'),
|
||||
QSE_SED_CMD_QUIT_QUIET = QSE_T('Q'),
|
||||
QSE_SED_CMD_QUIT = QSE_T('q'),
|
||||
QSE_SED_CMD_QUIT_QUIET = QSE_T('Q'),
|
||||
|
||||
QSE_SED_CMD_APPEND = QSE_T('a'),
|
||||
QSE_SED_CMD_INSERT = QSE_T('i'),
|
||||
QSE_SED_CMD_CHANGE = QSE_T('c'),
|
||||
QSE_SED_CMD_APPEND = QSE_T('a'),
|
||||
QSE_SED_CMD_INSERT = QSE_T('i'),
|
||||
QSE_SED_CMD_CHANGE = QSE_T('c'),
|
||||
|
||||
QSE_SED_CMD_DELETE = QSE_T('d'),
|
||||
QSE_SED_CMD_DD = QSE_T('D'),
|
||||
QSE_SED_CMD_DELETE = QSE_T('d'),
|
||||
QSE_SED_CMD_DELETE_FIRSTLN = QSE_T('D'),
|
||||
|
||||
QSE_SED_CMD_PRINT_LNNUM = QSE_T('='),
|
||||
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_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_FILELN = QSE_T('R'),
|
||||
QSE_SED_CMD_WRITE_FILE = 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_TRANSLATE = QSE_T('y')
|
||||
|
||||
|
Reference in New Issue
Block a user