############################################################################ # # File: noncase.icn # # Subject: Procedures for case-independent matching # # Author: Robert J. Alexander # # Date: May 2, 2001 # ############################################################################ # # This file is in the public domain. # ############################################################################ # # Kit of case-independent versions of Icon's built-in string-analysis # procedures. # ############################################################################ procedure c_any(c,s,i1,i2) return any(c_cset(c),s,i1,i2) end procedure c_find(s1,s2,i1,i2) local scanPos,endPos scanPos := match("",s2,i1,i2) endPos := many(&cset,s2,i1,i2) | scanPos suspend scanPos - 1 + find(map(s1), map((if \s2 then s2 else &subject)[scanPos:endPos])) end procedure c_many(c,s,i1,i2) return many(c_cset(c),s,i1,i2) end procedure c_match(s1,s2,i1,i2) local scanPos,endPos scanPos := match("",s2,i1,i2) endPos := scanPos + *s1 return (map(s1) == map((if \s2 then s2 else &subject)[scanPos:endPos]),endPos) end procedure c_upto(c,s,i1,i2) suspend upto(c_cset(c),s,i1,i2) end procedure c_cset(c) static lstring,ustring initial { lstring := string(&lcase) ustring := string(&ucase) } return cset(map(c) || map(c,lstring,ustring)) end