RosettaCodeData/Task/String-matching/Oforth/string-matching.fth

15 lines
522 B
Forth

: stringMatching(s1, s2)
| i |
s2 isAllAt(s1, 1) ifTrue: [ System.Out s1 << " begins with " << s2 << cr ]
s2 isAllAt(s1, s1 size s2 size - 1 + ) ifTrue: [ System.Out s1 << " ends with " << s2 << cr ]
s1 indexOfAll(s2) ->i
i ifNotNull: [ System.Out s1 << " includes " << s2 << " at position : " << i << cr ]
"\nAll positions : " println
1 ->i
while (s1 indexOfAllFrom(s2, i) dup ->i notNull) [
System.Out s1 << " includes " << s2 << " at position : " << i << cr
i s2 size + ->i
] ;