% @(#)$Id: string_ops.lsl,v 1.4 1995/01/27 18:56:58 leavens Exp $
% Various useful operations on strings as in C/C++ <string.h>
% Larch/C++ users should use the trait lcpp_string_ops instead of this one.
string_ops(E): trait
includes String(E, String[E]),
Sequence(String[E], Seq[String[E]]),
Set(E, Set[E])
introduces
toSet: String[E] -> Set[E]
anyIn: Set[E], String[E] -> Bool
firstIndexOf: String[E], E -> Int % cf. C(++) strchr
lastIndexOf: String[E], E -> Int % cf. C(++) strrchr
tokens: String[E], E -> Seq[String[E]] % cf. C(++) strtok
indexOfFirstIn: String[E], Set[E] -> Int % cf. C(++) strpbrk
lengthOfPrefixNotFrom: String[E], Set[E] -> Int % cf. C(++) strcspn
asserts
\forall s, s1: String[E], s2: Set[E], c: E, i: Int
toSet(empty) == {};
toSet(c \precat s) == insert(c, toSet(s));
~anyIn({}, s);
~anyIn(s2, empty);
anyIn(insert(c, s2), s1) == (c \in s1) \/ anyIn(s2, s1);
firstIndexOf(s, c)
== if not(c \in s)
then -1
else if (head(s) = c)
then 0
else 1 + firstIndexOf(tail(s), c);
lastIndexOf(s, c)
== if not(c \in s)
then -1
else if (last(s) = c)
then len(s) - 1
else lastIndexOf(init(s), c);
tokens(s, c)
== if not(c \in s)
then { s }
else {prefix(s, firstIndexOf(s, c))}
|| tokens(removePrefix(s, 1 + firstIndexOf(s, c)), c);
~anyIn(s2, s1)
=> (indexOfFirstIn(s1, s2) = -1);
anyIn(s2, s1)
=> (indexOfFirstIn(s1, s2) =
(if (head(s1) \in s2)
then 0
else 1 + indexOfFirstIn(tail(s1), s2)));
lengthOfPrefixNotFrom(empty, s2) == 0;
lengthOfPrefixNotFrom(c \precat s1, s2)
== if (c \in s2)
then 1
else 1 + lengthOfPrefixNotFrom(s1, s2);
implies
converts toSet, anyIn, firstIndexOf, lastIndexOf, tokens,
indexOfFirstIn, lengthOfPrefixNotFrom
[Index]
HTML generated using lcpp2html.