Fix the following testcase by storing the state of the adress match with
authorGlenn L McGrath <bug1@ihug.co.nz>
Sat, 13 Sep 2003 06:57:39 +0000 (06:57 -0000)
committerGlenn L McGrath <bug1@ihug.co.nz>
Sat, 13 Sep 2003 06:57:39 +0000 (06:57 -0000)
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

editors/sed.c

index b06d5a8d8948b6625507be15f3870bf2a66f22ec..5bfe924a513a6575ad9af4ab07f7211871dee34c 100644 (file)
@@ -75,6 +75,9 @@ typedef struct sed_cmd_s {
        int invert;                     /* the '!' after the 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 */
 
        /* sed -e 's/sub_match/replace/' */
@@ -491,7 +494,7 @@ static char *parse_cmd_str(sed_cmd_t * sed_cmd, char *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 */
        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 *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 */
-       unsigned int still_in_range = 0;
        int altered;
        int force_print;
 
@@ -836,7 +838,7 @@ static void process_file(FILE * file)
                                        && (regexec(sed_cmd->beg_match, pattern_space, 0, NULL,
                                                        0) == 0)) ||
                                /* 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))
                                );
                        if (sed_cmd->cmd == '{') {
@@ -1077,7 +1079,7 @@ static void process_file(FILE * file)
                                        /* If only one address */
                                        /* we were in the middle of our address range (this
                                         * 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... */
                                                && ((sed_cmd->end_line > 0
                                                                && (sed_cmd->end_line == linenum))
@@ -1086,10 +1088,10 @@ static void process_file(FILE * file)
                                                                && (regexec(sed_cmd->end_match, pattern_space,
                                                                                0, NULL, 0) == 0))))) {
                                        /* we're out of our address range */
-                                       still_in_range = 0;
+                                       sed_cmd->still_in_range = 0;
                                } else {
                                        /* 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;
                                }
                        }