diff options
author | Leah Neukirchen <leah@vuxu.org> | 2018-01-07 21:28:02 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2018-01-07 21:28:02 +0100 |
commit | 07f3f044ed15a76433788d9ead142972e6d2efa1 (patch) | |
tree | ef499b6d60335b2f6db0aedf9071d098d033eb4a /msed.c | |
parent | 5e7c300b425c9771942255c9c4f8ad8eebc7b6e3 (diff) | |
download | mblaze-07f3f044ed15a76433788d9ead142972e6d2efa1.tar.gz mblaze-07f3f044ed15a76433788d9ead142972e6d2efa1.tar.xz mblaze-07f3f044ed15a76433788d9ead142972e6d2efa1.zip |
msed: add s///d flag to remove on match
Diffstat (limited to 'msed.c')
-rw-r--r-- | msed.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/msed.c b/msed.c index 643fdd8..67541fd 100644 --- a/msed.c +++ b/msed.c @@ -20,8 +20,9 @@ subst(char *str, char *srch, char *repl, char *flags) static char buf[4096]; char *bufe = buf + sizeof buf; - int iflag = !!strchr(flags, 'i'); + int dflag = !!strchr(flags, 'd'); int gflag = !!strchr(flags, 'g'); + int iflag = !!strchr(flags, 'i'); #define APP(o, l) do { if (bufe-b < (ssize_t)l) return str; memcpy(b, str+i+o, l); b += l; } while (0) #define APPC(c) do { if (b >= bufe) return str; *b++ = c; } while (0) @@ -38,6 +39,9 @@ subst(char *str, char *srch, char *repl, char *flags) if (regexec(&srchrx, str+i, 9, pmatch, 0) != 0) break; + if (dflag) + return 0; + APP(0, pmatch[0].rm_so); char *t = repl; @@ -186,7 +190,7 @@ sed(char *file) while (*e && *e != sep) e++; char *u = ++e; - while (*e == 'i' || *e == 'g') + while (*e == 'd' || *e == 'g' || *e == 'i') e++; if (!(*e == ' ' || *e == ';' || *e == '\n' || !*e)) { @@ -200,9 +204,13 @@ sed(char *file) char *flags = strndup(u, e-u); char *ov = v; - v = strdup(subst(ov, from, to, flags)); - free(ov); + char *r = subst(ov, from, to, flags); + if (r) + v = strdup(r); + else + v = 0; + free(ov); free(from); free(to); free(flags); |