Introduction
Introduction Statistics Contact Development Disclaimer Help
ed: Handle correctly lines in substitutions - sbase - suckless unix tools
git clone git://git.suckless.org/sbase
Log
Files
Refs
README
LICENSE
---
commit 2732217a407c03900145e6f4191936ff6a33945a
parent e24228e0626e9f8ee89272f0f42d9ff9be078346
Author: Roberto E. Vargas Caballero <[email protected]>
Date: Fri, 29 Dec 2023 20:27:23 +0100
ed: Handle correctly lines in substitutions
The s command can apply a replace pattern with embedded newlines
which modifies the line/index assignament. Using a range in the
address fail because afther the call to subline() the next line
has to be searched based in the index because the replace could
insert newlines.
Diffstat:
M TODO | 8 --------
M ed.c | 18 +++++++++++++++---
2 files changed, 15 insertions(+), 11 deletions(-)
---
diff --git a/TODO b/TODO
@@ -50,14 +50,6 @@ ed
line
.
1g/^$/p
-* cat <<EOF | ed
-i
-foobar1
-foobar2
-.
-1,2s/foo/&\
-&/
-,n
* Editing huge files doesn't work well.
diff --git a/ed.c b/ed.c
@@ -1226,11 +1226,23 @@ subline(int num, int nth)
static void
subst(int nth)
{
- int i;
+ int i, line, next;
- for (i = line1; i <= line2; ++i) {
+ line = line1;
+ for (i = 0; i < line2 - line1 + 1; i++) {
chksignals();
- subline(i, nth);
+
+ next = getindex(nextln(line));
+ subline(line, nth);
+
+ /*
+ * The substitution command can add lines, so
+ * we have to skip lines until we find the
+ * index that we saved before the substitution
+ */
+ do
+ line = nextln(line);
+ while (getindex(line) != next);
}
}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.