home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
progs
/
versum.icn
< prev
next >
Wrap
Text File
|
2000-07-29
|
2KB
|
76 lines
############################################################################
#
# File: versum.icn
#
# Subject: Program to produce versum sequence
#
# Author: Ralph E. Griswold
#
# Date: August 12, 1995
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# This program writes the versum sequence for an integer to a file of a
# specified name. If such a file exists, it picks up where
# it left off, appending new values to the file.
#
# The supported options are:
#
# -s i The seed for the sequence, default 196
# -f s Name of file to extend, no default
# -F s Name of file, default <i>.vsq, where <i> is the
# seed of the sequence
# -t i The number of steps to carry the sequence out to, default
# essentially unlimited
# -m i Stop when value equals or exceeds m; default no limit
#
# If both -f and -F are given, -f overrides.
#
############################################################################
#
# Links: options
#
############################################################################
link options
procedure main(args)
local start, output, input, i, opts, limit, name, max, count
opts := options(args, "t+s+m+f:F:")
start := (0 < \opts["s"]) | 196
limit := \opts["t"] | -1
max := opts["m"]
name := \opts["F"] | (start || ".vsq")
name := \opts["f"]
if input := open(name) then {
count := 0
while i := read(input) do {
if not integer(i) then exit() # link, not term
count +:= 1
if count > limit then exit()
}
close(input)
}
/i := start # in case file doesn't exist or is empty
if not integer(i) then stop("*** invalid data")
output := open(name, "a") | stop("*** cannot open file")
limit -:= \count
until (limit -:= 1) = -1 do {
i +:= reverse(i)
if i > \max then break
write(output, i := string(i))
}
end