############################################################################
#
# File: str2toks.icn
#
# Subject: Procedures to convert string to tokens
#
# Author: Richard L. Goerwitz
#
# Date: March 3, 1996
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# Version: 1.2
#
############################################################################
#
# str2toks: cset x string x integer x integer -> strings
# (c, s, i, j) -> s1, s2, ...
#
# Suspends portions of s[i:j] delimited by characters in c. The
# usual defaults for s, i, and j apply, although str2toks is not
# meant as a primitive scanning function (note that it suspends
# strings, and not integer positions).
#
# Defaults:
#
# c ~(&letters ++ &digits)
# s &subject
# i &pos if s is defaulted, otherwise 1
# j 0
#
# Basically, this file is just a very simple piece of code wrapped up
# with some sensible defaults, and isolated in its own procedure.
#
############################################################################
#
# Example:
#
# "hello, how are ya?" ? every write(str2toks())
#
# The above expression would write to &output, on successive lines,
# the words "hello", "how", "are", and finally "ya" (skipping the
# punctuation). Naturally, the beginning and end of the line count
# as delimiters.
#
# Note that if i > 1 or j < *s+1 some tokens may end up appearing
# truncated. Normally, one should simply use the defaults for i and
# j - and for s as well when inside a scanning expression.
#
############################################################################
procedure str2toks(c, s, i, j)
local token, default_val
/c := ~(&letters ++ &digits)
if /s := &subject
then default_val := &pos
else default_val := 1
if \i then {
if i < 1 then
i := *s + (i+1)
}
else i := default_val
if \j then {
if j < 1 then
j := *s + (j+1)
}
else j := *s+1
s[i:j] ? {
tab(many(c))
while token := tab(upto(c)) do {
suspend token
tab(many(c))
}
suspend "" ~== tab(0)
}
end
This page produced by UniDoc on 2021/04/15 @ 23:59:45.