############################################################################
#
#	File:     caseless.icn
#
#	Subject:  Procedures to perform caseless scanning
#
#	Author:   Nevin J. Liber
#
#	Date:     August 19, 1996
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#	These procedures are analogous to the standard string-analysis
#	functions except that uppercase letters are considered equivalent to
#	lowercase letters.
#
#	anycl(c, s, i1, i2)	succeeds and produces i1 + 1, provided
#				map(s[i1]) is in cset(map(c)) and i2 is
#				greater than i1.  It fails otherwise.
#
#	balcl(c1, c2, c3, s, i1, i2)	generates the sequence of integer
#					positions in s preceding a
#					character of cset(map(c1)) in
#					map(s[i1:i2]) that is balanced with
#					respect to characters in cset(map(c2))
#					and cset(map(c3)), but fails if there
#					is no such position.
#
#	findcl(s1, s2, i1, i2)	generates the sequence of integer positions in
#				s2 at which map(s1) occurs as a substring
#				in map(s2[i1:i2]), but fails if there is no
#				such position.
#
#	manycl(c, s, i1, i2)	succeeds and produces the position in s
#				after the longest initial sequence of
#				characters in cset(map(c)) within
#				map(s[i1:i2]).  It fails if map(s[i1]) is not
#				in cset(map(c)).
#
#	matchcl(s1, s2, i1, i2)	produces i1 + *s1 if
#				map(s1) == map(s2[i1+:=*s1]) but fails
#				otherwise.
#
#	uptocl(c, s, i1, i2)	generates the sequence of integer positions in
#				s preceding a character of cset(map(c)) in
#				map(s[i1:i2]).  It fails if there is no such
#				position.
#
#	Defaults:	s, s2	&subject
#			i1	&pos if s or s2 is defaulted; otherwise 1
#			i2	0
#			c1	&cset
#			c2	'('
#			c3	')'
#
#	Errors:	101	i1 or i2 not integer
#		103	s or s1 or s2 not string
#		104	c or c1 or c2 or c3 not cset
#
################################################################################


procedure anycl(c, s, i1, i2)	#:	Caseless version of any()

	c := cset(map(cset(c)))
	/i1 := (/s & &pos)
	s := map(string(s) | (/s & &subject))

	return any(c, s, i1, i2)

end


procedure balcl(c1, c2, c3, s, i1, i2)	#:	Caseless version of bal()

	c1 := cset(map(cset(c1)))
	c2 := cset(map(cset(c2)))
	c3 := cset(map(cset(c3)))
	/i1 := (/s & &pos)
	s := map(string(s) | (/s & &subject))

	suspend bal(c1, c2, c3, s, i1, i2)

end


procedure findcl(s1, s2, i1, i2)	#:	Caseless version of find()

	s1 := map(string(s1))
	/i1 := (/s2 & &pos)
	s2 := map(string(s2) | (/s2 & &subject))

	suspend find(s1, s2, i1, i2)

end


procedure manycl(c, s, i1, i2)	#:	Caseless version of many()

	c := cset(map(cset(c)))
	/i1 := (/s & &pos)
	s := map(string(s) | (/s & &subject))

	return many(c, s, i1, i2)

end


procedure matchcl(s1, s2, i1, i2)	#:	Caseless version of match()

	s1 := map(string(s1))
	/i1 := (/s2 & &pos)
	s2 := map(string(s2) | (/s2 & &subject))

	return match(s1, s2, i1, i2)

end


procedure uptocl(c, s, i1, i2)	#:	Caseless version of upto()

	c := cset(map(cset(c)))
	/i1 := (/s & &pos)
	s := map(string(s) | (/s & &subject))

	suspend upto(c, s, i1, i2)

end