about summary refs log tree commit diff
path: root/msed.c
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2018-01-07 21:28:02 +0100
committerLeah Neukirchen <leah@vuxu.org>2018-01-07 21:28:02 +0100
commit07f3f044ed15a76433788d9ead142972e6d2efa1 (patch)
treeef499b6d60335b2f6db0aedf9071d098d033eb4a /msed.c
parent5e7c300b425c9771942255c9c4f8ad8eebc7b6e3 (diff)
downloadmblaze-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.c16
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);