[hackers] [sbase] ed: Fix multiline commands || Santtu Lakkala

From: <git_AT_suckless.org>
Date: Wed, 31 Dec 2025 12:31:07 +0100 (CET)

commit 60d9f7a5a9f0b55660915b06fdc73db6811a9f9d
Author: Santtu Lakkala <inz_AT_inz.fi>
AuthorDate: Tue Dec 16 17:59:21 2025 +0200
Commit: Roberto E. Vargas Caballero <k0ga_AT_shike2.net>
CommitDate: Tue Dec 30 10:21:33 2025 +0100

    ed: Fix multiline commands
    
    Fix command line parsing escape handling. Further process all
    commands on the command line.

diff --git a/TODO b/TODO
index 48ed4b3..4092917 100644
--- a/TODO
+++ b/TODO
_AT_@ -28,11 +28,6 @@ Bugs
 
 ed
 --
-* cat <<EOF | ed
- i
- LLL
- .
- s/$/\\
 
 * Editing huge files doesn't work well.
 
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..b213747
--- /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
Received on Wed Dec 31 2025 - 12:31:07 CET

This archive was generated by hypermail 2.3.0 : Wed Dec 31 2025 - 12:36:32 CET