Rob Landley writes:
authorEric Andersen <andersen@codepoet.org>
Wed, 26 May 2004 10:03:33 +0000 (10:03 -0000)
committerEric Andersen <andersen@codepoet.org>
Wed, 26 May 2004 10:03:33 +0000 (10:03 -0000)
add sed -r support.

I bumped into a couple of things that want to use extended regular expressions
in sed, and it really isn't that hard to add.  Can't say I've extensively
tested it, but it's small and isn't going to break anything that doesn't use
it, so...

Rob

editors/sed.c

index 45574e81dd5138039159a8032e8a3649ee37a44b..3d687162188e7a4d1ab2150883788450bbbe0c49 100644 (file)
@@ -112,7 +112,7 @@ typedef struct sed_cmd_s {
 
 /* globals */
 /* options */
-static int be_quiet = 0, in_place=0;
+static int be_quiet = 0, in_place=0, regex_type=0;
 FILE *nonstdout;
 char *outname;
 
@@ -298,7 +298,7 @@ static int get_address(char *my_str, int *linenum, regex_t ** regex)
 
                temp=copy_parsing_slashn(pos,next);
                *regex = (regex_t *) xmalloc(sizeof(regex_t));
-               xregcomp(*regex, temp, REG_NEWLINE);
+               xregcomp(*regex, temp, regex_type|REG_NEWLINE);
                free(temp);
                /* Move position to next character after last delimiter */
                pos+=(next+1);
@@ -326,7 +326,7 @@ static int parse_file_cmd(sed_cmd_t * sed_cmd, const char *filecmdstr, char **re
 
 static int parse_subst_cmd(sed_cmd_t * const sed_cmd, char *substr)
 {
-       int cflags = 0;
+       int cflags = regex_type;
        char *match;
        int idx = 0;
 
@@ -1115,12 +1115,15 @@ extern int sed_main(int argc, char **argv)
 #endif
 
        /* do normal option parsing */
-       while ((opt = getopt(argc, argv, "ine:f:")) > 0) {
+       while ((opt = getopt(argc, argv, "irne:f:")) > 0) {
                switch (opt) {
                case 'i':
                        in_place++;
                        atexit(cleanup_outname);
                        break;
+               case 'r':
+                       regex_type|=REG_EXTENDED;
+                       break;
                case 'n':
                        be_quiet++;
                        break;