summaryrefslogtreecommitdiff
path: root/ipl/gprogs/patfetch.icn
diff options
context:
space:
mode:
Diffstat (limited to 'ipl/gprogs/patfetch.icn')
-rw-r--r--ipl/gprogs/patfetch.icn85
1 files changed, 85 insertions, 0 deletions
diff --git a/ipl/gprogs/patfetch.icn b/ipl/gprogs/patfetch.icn
new file mode 100644
index 0000000..2c32f51
--- /dev/null
+++ b/ipl/gprogs/patfetch.icn
@@ -0,0 +1,85 @@
+############################################################################
+#
+# File: patfetch.icn
+#
+# Subject: Program to extract patterns from a file
+#
+# Author: Ralph E. Griswold
+#
+# Date: July 22, 1993
+#
+############################################################################
+#
+# This file is in the public domain.
+#
+############################################################################
+#
+# This program accepts a list of integer specifications for patterns
+# as the appear in order in a file of patterns. The selected patterns
+# are written to standard output, but not until the end of the input
+# specifications. The name of the pattern file is specified on the
+# command line.
+#
+# Each line of input can be a comma-separated string of either integers
+# or integer ranges. Blanks after commas are tolerated. An example of
+# input is:
+#
+# 1-3, 5
+# 10
+# 13-17
+# 8
+#
+# which specifies the patterns 1, 2, 3, 5, 8, 10, 13, 14, 15, 16, and 17.
+#
+# Note that the integers need not be in order, although within a range,
+# the lower bound must precede the upper bound.
+#
+############################################################################
+#
+# Links: patutils
+#
+############################################################################
+
+link patutils
+
+procedure main(args)
+ local file, input, i, hitlist, patlist, spec, lo, hi, subspec
+
+ file := args[1] | stop("*** no pattern list specified")
+
+ input := open(file) | stop(" *** cannot open input file")
+
+ hitlist := set() # construct set of indices to remove
+
+ while spec := read() do {
+ spec ? {
+ while subspec := tab(upto(',') | 0) do {
+ if insert(hitlist, integer(subspec)) then { # integer
+ move(1) | break
+ tab(many(' '))
+ }
+ else {
+ subspec ? {
+ lo := tab(many(&digits)) &
+ ="-" &
+ hi := tab(many(&digits)) &
+ lo <= hi &
+ pos(0) | write(&errout, "*** bad specification")
+ every insert(hitlist, 0 < integer(lo to hi))
+ }
+ move(1) | break
+ tab(many(' '))
+ }
+ }
+ }
+ }
+
+ patlist := [] # read in list of patterns
+
+ while put(patlist, readpatt(input))
+
+ every i := !sort(hitlist) do { # write out selected patterns
+ write(patlist[i]) | write(&errout, "*** ", i, " out of bounds")
+ }
+
+end