[hackers] [sbase][PATCH] ed: Multiline command fixes

From: Santtu Lakkala <inz_AT_inz.fi>
Date: Tue, 16 Dec 2025 17:59:21 +0200

Fix command line parsing escape handling. Further process all commands
on the command line.
---
 ed.c             | 15 +++++++++------
 tests/0025-ed.sh | 29 +++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+), 6 deletions(-)
 create mode 100755 tests/0025-ed.sh
diff --git a/ed.c b/ed.c
index 0839232..535fadf 100644
--- a/ed.c
+++ b/ed.c
_AT_@ -679,10 +679,8 @@ getinput(void)
 		if (ch == '\\') {
 			if ((ch = getchar()) == EOF)
 				break;
-			if (ch != '\n') {
-				ungetc(ch, stdin);
-				ch = '\\';
-			}
+			if (ch != '\n')
+				addchar('\\', &cmdline);
 		}
 		addchar(ch, &cmdline);
 	}
_AT_@ -1550,7 +1548,7 @@ savecmd(void)
 static void
 doglobal(void)
 {
-	int cnt, ln, k, idx;
+	int cnt, ln, k, idx, c;
 
 	skipblank();
 	gflag = 1;
_AT_@ -1569,7 +1567,12 @@ doglobal(void)
 			if (!uflag) {
 				idx = inputidx;
 				getlst();
-				docmd();
+				for (;;) {
+					docmd();
+					if (!(c = input()))
+						break;
+					back(c);
+				}
 				inputidx = idx;
 				continue;
 			}
diff --git a/tests/0025-ed.sh b/tests/0025-ed.sh
new file mode 100755
index 0000000..9fe02b5
--- /dev/null
+++ b/tests/0025-ed.sh
_AT_@ -0,0 +1,29 @@
+#!/bin/sh
+
+tmp=tmp.$$
+
+trap 'rm -f $tmp' EXIT
+trap 'rm -f $tmp; kill -KILL $$' HUP INT TERM
+
+cat <<EOF > $tmp
+LLL\\
+static int xflag = 0;
+static int gflag = 0;
+extern long arflag = 0;
+EOF
+
+ed -s /dev/null <<EOF | diff -u $tmp -
+i
+LLL
+.
+s/$/\\\\
+g/^L/ a\\
+static int xflag = 0;\\
+static int gflag = 0;\\
+static int arflag = 0;
+v! .flag!s/^static/extern/\\
+s# int # long #
+g_^[^a-z]_d
+,p
+Q
+EOF
-- 
2.42.0
Received on Tue Dec 16 2025 - 16:59:21 CET

This archive was generated by hypermail 2.3.0 : Tue Dec 16 2025 - 17:00:35 CET