These are the core strings db utilities.  They have been written from
scratch at least twice.  *sigh*  I never remember to back things up.

The fundamental idea in the core section is to provide a complete set of
utilities which may be used in classic Unix toolkit fashion.

Starting with version 0.2.1, the following compiled utilities are available:

idxstr:		creates the index file
lsstr:		displays information about an index file (or key file)
getstr:		gets one record from a file
dumpstr:	dumps the records in a strings file in index file pointer order
grepstr:	a record-based grep for strings files, optionally with regex
delstr:		marks a record (not a field) deleted

There are two utilities for creating and manipulating key files, added in
version 0.4.0 (which required yet another rewrite):

keystr:		creates a keys file
getkey:		outputs index numbers or offsets associated with a
		particular key

A "key file" is basically a full-text search on the contents of a given
field.  The key file contains pointers to all records containing a given
word, in that field.

There is also some pre-written plumbing using these basic functions:

edstr:		edit a record and regenerate the index
cyclestr:	view all records, in pointer order (forward, back, and call
		edstr, addstr, and delstr as required)

Editing is accomplished with Your Favorite Text Editor[tm].

strdb.c is a miniature library of functions used in part by all of the
above.  sortdb contains the functions used by idxstr, which may be used by
application-level indexing utilities that want to replace idxstr.  It's
separated out because sorting is a relatively infrequent event.  Keydb
contains the functions used to read, write, and manipulate key files.

Most of the utilities contain a fairly extreme wealth of options.  Several
are uniform:

-v	be verbose (whatever that happens to mean for the tool)
-V	print version number and exit
-F	force usage of outdated file (where applicable, which is usually)
-h	print the usage screen (this is the only current documentation)

Other options tend to depend upon the tool.  The principle, however, is
generally that output of most utilities (except lsstr) is intended for
input to another program, unless the program is interactive (cyclestr,
edstr).  It is possible to feed output from grepstr, for instance,
to delstr or getstr (to delete from a file, or create a subset file from
it).

In general, applications may use these utilities or do their own work.  For
instance, the version of fortune included here (in ../random-apps) expects
that the files of pithy sayings will be maintained using these utilities,
uses lsstr to find the total number of records in all the target files,
and uses getstr to return the selected record.  It doesn't have to; it could
simply use the primitives in strdb to do all this.  However, by doing this,
fortune never has to open a file on its own.
