plumb/basic: Move forward first so we don't wrap around #158
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #122, #140.
As reported in #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:
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 as1-#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 as1-#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 #140 @rsc proposed transforming
:X:Y
into:X-#0+#Y-#1
instead since thatavoids wrapping around by not moving backwards at first.
This change modifies
plumb/basic
to do that.