mirror of
https://github.com/sheumann/hush.git
synced 2024-10-11 10:23:41 +00:00
* editors/sed.c (parse_edit_cmd): Rewrite.
* testsuite/sed/sed-splits-edit-commands-on-command-line: New.
This commit is contained in:
parent
d299563257
commit
5ed78adca5
@ -3,6 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Copyright (C) 1999,2000,2001 by Lineo, inc. and Mark Whitley
|
* Copyright (C) 1999,2000,2001 by Lineo, inc. and Mark Whitley
|
||||||
* Copyright (C) 1999,2000,2001 by Mark Whitley <markw@codepoet.org>
|
* Copyright (C) 1999,2000,2001 by Mark Whitley <markw@codepoet.org>
|
||||||
|
* Copyright (C) 2002 Matt Kraai
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -296,9 +297,7 @@ static void move_back(char *str, int offset)
|
|||||||
|
|
||||||
static int parse_edit_cmd(struct sed_cmd *sed_cmd, const char *editstr)
|
static int parse_edit_cmd(struct sed_cmd *sed_cmd, const char *editstr)
|
||||||
{
|
{
|
||||||
int idx = 0;
|
int i, j;
|
||||||
int slashes_eaten = 0;
|
|
||||||
char *ptr; /* shorthand */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* the string that gets passed to this function should look like this:
|
* the string that gets passed to this function should look like this:
|
||||||
@ -326,44 +325,24 @@ static int parse_edit_cmd(struct sed_cmd *sed_cmd, const char *editstr)
|
|||||||
error_msg_and_die("bad format in edit expression");
|
error_msg_and_die("bad format in edit expression");
|
||||||
|
|
||||||
/* store the edit line text */
|
/* store the edit line text */
|
||||||
/* make editline big enough to accomodate the extra '\n' we will tack on
|
|
||||||
* to the end */
|
|
||||||
sed_cmd->editline = xmalloc(strlen(&editstr[3]) + 2);
|
sed_cmd->editline = xmalloc(strlen(&editstr[3]) + 2);
|
||||||
strcpy(sed_cmd->editline, &editstr[3]);
|
for (i = 3, j = 0; editstr[i] != '\0' && strchr("\r\n", editstr[i]) == NULL;
|
||||||
ptr = sed_cmd->editline;
|
i++, j++) {
|
||||||
|
if (editstr[i] == '\\' && strchr("\n\r", editstr[i+1]) != NULL) {
|
||||||
/* now we need to go through * and: s/\\[\r\n]$/\n/g on the edit line */
|
sed_cmd->editline[j] = '\n';
|
||||||
while (ptr[idx]) {
|
i++;
|
||||||
while (ptr[idx] != '\\' || (ptr[idx+1] != '\n' && ptr[idx+1] != '\r')) {
|
} else
|
||||||
idx++;
|
sed_cmd->editline[j] = editstr[i];
|
||||||
if (!ptr[idx]) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* move the newline over the '\' before it (effectively eats the '\') */
|
|
||||||
move_back(&ptr[idx], 1);
|
|
||||||
slashes_eaten++;
|
|
||||||
/* substitue \r for \n if needed */
|
|
||||||
if (ptr[idx] == '\r')
|
|
||||||
ptr[idx] = '\n';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
|
||||||
/* figure out if we need to add a newline */
|
/* figure out if we need to add a newline */
|
||||||
if (ptr[idx-1] != '\n') {
|
if (sed_cmd->editline[j-1] != '\n')
|
||||||
ptr[idx] = '\n';
|
sed_cmd->editline[j++] = '\n';
|
||||||
idx++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* terminate string */
|
/* terminate string */
|
||||||
ptr[idx]= 0;
|
sed_cmd->editline[j] = '\0';
|
||||||
|
|
||||||
/* this accounts for discrepancies between the modified string and the
|
return i;
|
||||||
* original string passed in to this function */
|
|
||||||
|
|
||||||
/* adjust for opening 2 chars [aic]\ */
|
|
||||||
|
|
||||||
return idx + slashes_eaten + 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
9
testsuite/sed/sed-splits-edit-commands-on-command-line
Normal file
9
testsuite/sed/sed-splits-edit-commands-on-command-line
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
echo 2 | busybox sed -e 'i\
|
||||||
|
1
|
||||||
|
a\
|
||||||
|
3' > output
|
||||||
|
cmp output - <<EOF
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
EOF
|
Loading…
Reference in New Issue
Block a user