// returns true if second is a substring of first
method contains(first:String, second:String)->Boolean is public{
var iter1 := first.iter
var iter2 := second.iter
var current1 := iter1.next
var current2 := iter2.next
var soFar := false
while {iter1.havemore} do {
if(current1 == current2) then{
if(!iter2.havemore) then {return true}
else{
soFar := true
current1 := iter1.next
current2 := iter2.next
}
}
else{
soFar := false
current1 := iter1.next
iter2 := second.iter
current2 := iter2.next
}
}
if((current1 != current2) || iter2.havemore) then {soFar := false}
return soFar
}
method caseInsensitiveEqual(first:String, second:String)->Boolean is public{
var iter1 := first.iter
var iter2 := second.iter
var c1:Number := 0
var c2:Number := 0
var soFar := true
if(first.length != second.length) then {return false}
while {iter1.havemore && soFar} do {
c1 := iter1.next.ord
c2 := iter2.next.ord
if((65 <= c1) && (c1 <= 90)) then {
soFar := (c1 == c2) || ((c1 + 32) == c2)
}
else{ if((65 <= c2) && (c2 <= 90)) then {
soFar := (c1 == (c2 + 32))
}
else{soFar := (c1 == c2)}
}
if(!soFar) then {return false}
}
return soFar
}
// returns string with all non-letter characters removed
method removeNonLetters(s:String) is public{
var changed := s
var iter := s.iter
var c := ""
var n := 0
while{iter.havemore} do {
c := iter.next
n := c.ord
if((n < 65) || ((n > 90) && (n < 97)) || (n > 122)) then {
changed := changed.replace(c)with("")
}
}
return changed
}
// converts string to lower case, going letter by letter
method toLower(s:String) is public{
var aLIST := ["A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
var alist := ["a","b","c","d","e","f","g","h","i","j","k","l","m",
"n","o","p","q","r","s","t","u","v","w","x","y","z"]
for(1..26) do{i->
s := s.replace(aLIST.at(i))with(alist.at(i))
}
return s
}