mirror of
https://github.com/sheumann/hush.git
synced 2024-07-08 01:28:56 +00:00
Fix the following testcase by storing the state of the adress match with
the command. # cat strings a b c d e f g # ./busybox sed '1,2d;4,$d' <strings c # ./busybox sed '4,$d;1,2d' <strings # sed '4,$d;1,2d' <strings c # sed '1,2d;4,$d' <strings c
This commit is contained in:
parent
c2b9186be1
commit
c18ce373a2
@ -75,6 +75,9 @@ typedef struct sed_cmd_s {
|
|||||||
int invert; /* the '!' after the address */
|
int invert; /* the '!' after the address */
|
||||||
// int block_cmd; /* This command is part of a group that has a command address */
|
// int block_cmd; /* This command is part of a group that has a command address */
|
||||||
|
|
||||||
|
/* Runtime flag no not if the current command match's */
|
||||||
|
int still_in_range;
|
||||||
|
|
||||||
/* SUBSTITUTION COMMAND SPECIFIC FIELDS */
|
/* SUBSTITUTION COMMAND SPECIFIC FIELDS */
|
||||||
|
|
||||||
/* sed -e 's/sub_match/replace/' */
|
/* sed -e 's/sub_match/replace/' */
|
||||||
@ -491,7 +494,7 @@ static char *parse_cmd_str(sed_cmd_t * sed_cmd, char *cmdstr)
|
|||||||
return (cmdstr);
|
return (cmdstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *add_cmd(sed_cmd_t * sed_cmd, char *cmdstr)
|
static char *add_cmd(sed_cmd_t *sed_cmd, char *cmdstr)
|
||||||
{
|
{
|
||||||
/* Skip over leading whitespace and semicolons */
|
/* Skip over leading whitespace and semicolons */
|
||||||
cmdstr += strspn(cmdstr, semicolon_whitespace);
|
cmdstr += strspn(cmdstr, semicolon_whitespace);
|
||||||
@ -793,7 +796,6 @@ static void process_file(FILE * file)
|
|||||||
char *pattern_space; /* Posix requires it be able to hold at least 8192 bytes */
|
char *pattern_space; /* Posix requires it be able to hold at least 8192 bytes */
|
||||||
char *hold_space = NULL; /* Posix requires it be able to hold at least 8192 bytes */
|
char *hold_space = NULL; /* Posix requires it be able to hold at least 8192 bytes */
|
||||||
static int linenum = 0; /* GNU sed does not restart counting lines at EOF */
|
static int linenum = 0; /* GNU sed does not restart counting lines at EOF */
|
||||||
unsigned int still_in_range = 0;
|
|
||||||
int altered;
|
int altered;
|
||||||
int force_print;
|
int force_print;
|
||||||
|
|
||||||
@ -836,7 +838,7 @@ static void process_file(FILE * file)
|
|||||||
&& (regexec(sed_cmd->beg_match, pattern_space, 0, NULL,
|
&& (regexec(sed_cmd->beg_match, pattern_space, 0, NULL,
|
||||||
0) == 0)) ||
|
0) == 0)) ||
|
||||||
/* we are currently within the beginning & ending address range */
|
/* we are currently within the beginning & ending address range */
|
||||||
still_in_range || ((sed_cmd->beg_line == -1)
|
sed_cmd->still_in_range || ((sed_cmd->beg_line == -1)
|
||||||
&& (next_line == NULL))
|
&& (next_line == NULL))
|
||||||
);
|
);
|
||||||
if (sed_cmd->cmd == '{') {
|
if (sed_cmd->cmd == '{') {
|
||||||
@ -1077,7 +1079,7 @@ static void process_file(FILE * file)
|
|||||||
/* If only one address */
|
/* If only one address */
|
||||||
/* we were in the middle of our address range (this
|
/* we were in the middle of our address range (this
|
||||||
* isn't the first time through) and.. */
|
* isn't the first time through) and.. */
|
||||||
|| ((still_in_range == 1)
|
|| ((sed_cmd->still_in_range == 1)
|
||||||
/* this line number is the last address we're looking for or... */
|
/* this line number is the last address we're looking for or... */
|
||||||
&& ((sed_cmd->end_line > 0
|
&& ((sed_cmd->end_line > 0
|
||||||
&& (sed_cmd->end_line == linenum))
|
&& (sed_cmd->end_line == linenum))
|
||||||
@ -1086,10 +1088,10 @@ static void process_file(FILE * file)
|
|||||||
&& (regexec(sed_cmd->end_match, pattern_space,
|
&& (regexec(sed_cmd->end_match, pattern_space,
|
||||||
0, NULL, 0) == 0))))) {
|
0, NULL, 0) == 0))))) {
|
||||||
/* we're out of our address range */
|
/* we're out of our address range */
|
||||||
still_in_range = 0;
|
sed_cmd->still_in_range = 0;
|
||||||
} else {
|
} else {
|
||||||
/* didn't hit the exit? then we're still in the middle of an address range */
|
/* didn't hit the exit? then we're still in the middle of an address range */
|
||||||
still_in_range = 1;
|
sed_cmd->still_in_range = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user