summaryrefslogtreecommitdiff
path: root/ipl/packs/ibpag2/slshupto.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/packs/ibpag2/slshupto.icn')
-rw-r--r--ipl/packs/ibpag2/slshupto.icn79
1 files changed, 79 insertions, 0 deletions
diff --git a/ipl/packs/ibpag2/slshupto.icn b/ipl/packs/ibpag2/slshupto.icn
new file mode 100644
index 0000000..07cbece
--- /dev/null
+++ b/ipl/packs/ibpag2/slshupto.icn
@@ -0,0 +1,79 @@
+############################################################################
+#
+# Name: slshupto.icn
+#
+# Title: slshupto (upto with backslash escaping)
+#
+# Author: Richard L. Goerwitz
+#
+# Version: 1.4
+#
+############################################################################
+#
+# Slshupto works just like upto, except that it ignores backslash
+# escaped characters. I can't even begin to express how often I've
+# run into problems applying Icon's string scanning facilities to
+# to input that uses backslash escaping. Normally, I tokenize first,
+# and then work with lists. With slshupto() I can now postpone or
+# even eliminate the traditional tokenizing step, and let Icon's
+# string scanning facilities to more of the work.
+#
+# If you're confused:
+#
+# Typically UNIX utilities (and probably others) use backslashes to
+# "escape" (i.e. remove the special meaning of) metacharacters. For
+# instance, UNIX shells normally accept "*" as a shorthand for "any
+# series of zero or more characters. You can make the "*" a literal
+# "*," with no special meaning, by prepending a backslash. The rou-
+# tine slshupto() understands these backslashing conventions. You
+# can use it to find the "*" and other special characters because it
+# will ignore "escaped" characters.
+#
+############################################################################
+#
+# Links: none
+#
+# See also: slashbal.icn
+#
+############################################################################
+
+# for compatibility with the original name
+#
+procedure slashupto(c, s, i, j)
+ suspend slshupto(c, s, i, j)
+end
+
+#
+# slshupto: cset x string x integer x integer -> integers
+# (c, s, i, j) -> Is (a generator)
+# where Is are the integer positions in s[i:j] before characters
+# in c that is not preceded by a backslash escape
+#
+procedure slshupto(c, s, i, j)
+
+ local c2
+
+ if /s := &subject
+ then /i := &pos
+ else /i := 1
+ /j := *s + 1
+
+ /c := &cset
+ c2 := '\\' ++ c
+ s[1:j] ? {
+ tab(i)
+ while tab(upto(c2)) do {
+ if ="\\" then {
+ move(1) | {
+ if find("\\", c)
+ then return &pos - 1
+ }
+ next
+ }
+ suspend .&pos
+ move(1)
+ }
+ }
+
+end
+