summaryrefslogtreecommitdiff
path: root/ipl/procs/scanset.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/procs/scanset.icn')
-rw-r--r--ipl/procs/scanset.icn68
1 files changed, 68 insertions, 0 deletions
diff --git a/ipl/procs/scanset.icn b/ipl/procs/scanset.icn
new file mode 100644
index 0000000..14b6187
--- /dev/null
+++ b/ipl/procs/scanset.icn
@@ -0,0 +1,68 @@
+############################################################################
+#
+# File: scanset.icn
+#
+# Subject: Procedures setup for string scanning procedures
+#
+# Author: Robert J. Alexander
+#
+# Date: June 4, 1993
+#
+############################################################################
+#
+# 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
+#
+
+record scan_setup_result(
+ ss, # substring to be scanned
+ offset) # length of substring preceding ss
+
+procedure scan_setup(s,i1,i2)
+ if /s := &subject then
+ /i1 := &pos
+ else
+ /i1 := 1
+ /i2 := 0
+ return scan_setup_result(s[i1:i2],match("",s,i1,i2) - 1)
+end