Skip to content

Commit 73ea365

Browse files
mkhlrsc
authored andcommitted
plumb/basic: avoid wrap around in file:1:2 (9fans#158)
Fixes 9fans#122, 9fans#140. As reported in 9fans#122, `file:1:1` moves to the end of the file, and `file:1:2` fails with “address out of range”. I’ll use file:2:3 as an example so we can tell the line and column number apart. What’s happening is this: plumb/basic matches `2:3` using twocolonaddr (from plumb/fileaddr), then sets addr to `2-#1+#3` (the 1 is constant and was introduced because column numbers are 1-based). Acme interprets this in three steps: 1. find the range (q0, q1) that contains line 2 2. create the range (q2, q2) where q2 = q0 - 1 3. create the range (q3, q3) where q3 = q2 + 3 The second step has a branch where if q0 == 0 and 1 > 0 (remember that 1 is constant and comes form plumb/basic), q0 is set to the end of the file. This makes addressing things at the end of the file easier. The problem then is that if we select line 1, which starts at the beginning of the file, q0 is always 0 and the branch in step 2) will always be used. `1:1` is interpreted as `1-#1+#1` which starts at 0, wraps around to the end of the file, then moves 1 character backwards and then forwards again, ending at the end of the file. `1:2` is interpretes as `1-#1+#2` which starts at 0, wraps around to the end od the file, then moves 1 character backwards and tries moving 2 characters forwards beyond the end of the file, resulting in the out of range error. In 9fans#140 @rsc proposed transforming `:X:Y` into `:X-#0+#Y-#1` instead since that avoids wrapping around by not moving backwards at first. This change modifies `plumb/basic` to do that.
1 parent a9e66ff commit 73ea365

1 file changed

Lines changed: 2 additions & 2 deletions

File tree

plumb/basic

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ type is text
6464
data matches '([.a-zA-Z¡-￿0-9_/\-@]*[a-zA-Z¡-￿0-9_/\-])':$twocolonaddr,$twocolonaddr
6565
arg isfile $1
6666
data set $file
67-
attr add addr=$2-#1+#$3,$4-#1+#$5
67+
attr add addr=$2-#0+#$3-#1,$4-#0+#$5-#1
6868
plumb to edit
6969
plumb client $editor
7070

@@ -73,7 +73,7 @@ type is text
7373
data matches '([.a-zA-Z¡-￿0-9_/\-@]*[a-zA-Z¡-￿0-9_/\-])':$twocolonaddr
7474
arg isfile $1
7575
data set $file
76-
attr add addr=$2-#1+#$3
76+
attr add addr=$2-#0+#$3-#1
7777
plumb to edit
7878
plumb client $editor
7979

0 commit comments

Comments
 (0)