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
/
idxtext.icn
< prev
next >
Wrap
Text File
|
2000-07-29
|
5KB
|
156 lines
############################################################################
#
# File: idxtext.icn
#
# Subject: Program for creating indexed text-base
#
# Author: Richard L. Goerwitz
#
# Date: July 9, 1991
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# Version: 1.15
#
############################################################################
#
# idxtext turns a file associated with gettext() routine into an
# indexed text-base. Though gettext() will work fine with files
# that haven't been indexed via idxtext(), access is faster if the
# indexing is done if the file is, say, over 10k (on my system the
# crossover point is actually about 5k).
#
# Usage is simply "idxtext [-a] file1 [file2 [...]]," where file1,
# file2, etc are the names of gettext-format files that are to be
# (re-)indexed. The -a flag tells idxtext to abort if an index file
# already exists.
#
# Indexed files have a very simple format: keyname delimiter offset
# [delimiter offset [etc.]]\n. The first line of the index file is a
# pointer to the last indexed byte of the text-base file it indexes.
#
# BUGS: Index files are too large. Also, I've yet to find a portable
# way of creating unique index names that are capable of being
# uniquely identified with their original text file. It might be
# sensible to hard code the name into the index. The chances of a
# conflict seem remote enough that I haven't bothered. If you're
# worried, use the -a flag. (RLG)
############################################################################
#
# Links: adjuncts
#
# Tested with: MS-DOS, MS-DOS/386, OS/2, ProIcon, UNIX
#
# See also: gettext.icn
#
# Modified by Phillip Lee Thomas
# History: modified link and local statements.
# modified to run under OS/2 and ProIcon.
# Added exit() statement.
# Move OS declarations to Set_OS() in adjuncts.icn.
# Allow multiple indexed values.
#
# Version 1.15 (August 5, 1995)
# Use preprocessor include statement rather than link.
# Allow multiple index keys for a stretch of text:
# Example:
# ::key one ::key two ::another key
# Multiple lines of text which are retrieved
# by searching for these three keys.
# ::key for another stretch of text
# A second bit of text.
#
#
############################################################################
#
# Links: adjuncts
#
############################################################################
link adjuncts
# declared in adjuncts.icn
# global _slash, _baselen, _delimiter
procedure main(a)
local ABORT, idxfile_name, fname, infile, outfile
Set_OS()
if \a[1] == "-a" then ABORT := pop(a)
# Check to see if we have any arguments.
if find("Macintosh", &features) then {
writes("Enter file name for indexing: ")
a := [read()]
}
else {
*a = 0 & stop("usage: idxtext [-a] file1 [file2 [...]]")
}
# Start popping filenames off of the argument list.
while fname := pop(a) do {
# Open input file.
infile := open(fname) |
{ write(&errout, "idxtext: ",fname," not found"); next }
# Get index file name.
idxfile_name := Pathname(fname) || getidxname(fname)
if \ABORT then if close(open(idxfile_name)) then
stop("idxtext: index file ",idxfile_name, " already exists")
outfile := open(idxfile_name, "w") |
stop("idxtext: can't open ", idxfile_name)
# Write index to index.IDX file.
write_index(infile, outfile)
every close(infile | outfile)
}
exit()
end
procedure write_index(in, out)
local key_offset_table, w, line, KEY
# Write to out all keys in file "in," with their byte
# offsets.
key_offset_table := table()
while (w := where(in), line := read(in)) do {
line ? {
while ="::" do {
KEY := trim(tab(find("::") | 0))
if not (/key_offset_table[KEY] := KEY || _delimiter || w)
then key_offset_table[KEY] ||:= _delimiter || w
}
}
}
# First line of index contains the offset of the last
# indexed byte in write_index, so that we can still
# search unindexed parts of in.
write(out, where(in))
# Write sorted KEY\toffset lines.
if *key_offset_table > 0 then {
every write(out, (!sort(key_offset_table))[2])
return
}
else stop("No indexed items found.")
end