link scanset
June 4, 1993; Robert J. Alexander
This file is in the public domain.
Procedure to set up for user-written string-scanning procedures that
are in the spirit of Icon's built-ins.
The values passed are the s, i1, i2 parameters which are the last
three arguments to all Icon scanning functions (such as
upto(c,s,i1,i2)). scan_setup() supplies any appropriate defaults and
returns needed values.
The value returned is a "scan_setup_result" record consisting of two
values:
1. The substring of s to be scanned (ss).
2. The size of the substring of s that precedes the
substring to be scanned (offset).
scan_setup() fails if i1 or i2 is out of range with respect to s.
The user-written procedure can then match in the string ss to compute
the position within ss appropriate to the scan (p). The value
returned (or suspended) to the caller is p + offset (the position
within the original string, s).
For example, the following function finds two words separated by
spaces:
procedure two_words(s,i1,i2)
local x,p
x := scan_setup(s,i1,i2) | fail # fail if out of range
x.ss ? suspend {
tab(upto(&letters)) &
pos(1) | (move(-1) & tab(any(~&letters))) &
p := &pos & # remember starting position
tab(many(&letters)) &
tab(many(' ')) &
tab(many(&letters)) &
p + x.offset # return position in original s
}
end