summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2020-12-23 13:33:32 +0200
committerSergey Poznyakoff <gray@gnu.org>2020-12-23 13:33:32 +0200
commit36b37b989472ae9dc660cee34863d742a5bfdaf8 (patch)
tree9d43c5ff479d29e42eb81313974f8c8f4a30fb9b
parent4fe3e7289947b7ec3bd23bd70cdc9943d7892764 (diff)
downloadgdbm-36b37b989472ae9dc660cee34863d742a5bfdaf8.tar.gz
Update the docs
* doc/Makefile.am: Use gendocs.pl to generate web version of the manual. * doc/gdbm.texi: Update. * doc/gendocs.pl: New file. * doc/otherdoc.texi.in: New file. * doc/.gitignore: Ignore otherdoc.texi. * doc/webdoc.init: New file. * doc/gendocs.sh: Remove. * doc/gendocs_template: Remove. * doc/html.init: Remove.
-rw-r--r--doc/.gitignore1
-rw-r--r--doc/Makefile.am10
-rw-r--r--doc/gdbm.texi327
-rw-r--r--doc/gendocs.pl480
-rwxr-xr-xdoc/gendocs.sh489
-rw-r--r--doc/gendocs_template71
-rw-r--r--doc/html.init164
-rw-r--r--doc/otherdoc.texi.in9
-rw-r--r--doc/webdoc.init8
9 files changed, 726 insertions, 833 deletions
diff --git a/doc/.gitignore b/doc/.gitignore
index e3d20a8..df6febd 100644
--- a/doc/.gitignore
+++ b/doc/.gitignore
@@ -24,3 +24,4 @@ gdbm.vrs
manual
stamp-vti
version.texi
+otherdoc.texi
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 17cf60c..c345db2 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -22,7 +22,8 @@ gdbm_TEXINFOS=\
dist_man_MANS = gdbm.3 gdbm_dump.1 gdbm_load.1 gdbmtool.1
-GENDOCS=$(srcdir)/gendocs.sh --no-copy-images --html '--init-file=$(abs_srcdir)/html.init'
+GENDOCS = perl gendocs.pl
+EXTRA_DIST = gendocs.pl webdoc.init
TEXI2DVI=texi2dvi -t '@set $(RENDITION)'
@@ -30,10 +31,13 @@ TEXI2DVI=texi2dvi -t '@set $(RENDITION)'
# TEXINPUTS=/usr/share/texmf/pdftex/plain/misc/ is ok for most distributions
.PHONY: manual
manual:
+ rm -rf manual
TEXINPUTS=$(srcdir):$(top_srcdir)/build-aux:$(TEXINPUTS) \
- MAKEINFO="$(MAKEINFO) $(MAKEINFOFLAGS)" \
+ MAKEINFO="$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS)" \
TEXI2DVI="$(TEXI2DVI) -t @finalout" \
- $(GENDOCS) --no-copy-images $(PACKAGE) '$(PACKAGE_NAME) manual'
+ $(GENDOCS) -C manual -o otherdoc.texi $(PACKAGE) otherdoc.texi.in
+ $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -DWEBDOC \
+ --html --init-file=webdoc.init $(info_TEXINFOS) -o manual
# Checking
check-tabs:
diff --git a/doc/gdbm.texi b/doc/gdbm.texi
index 77fe877..6a55c59 100644
--- a/doc/gdbm.texi
+++ b/doc/gdbm.texi
@@ -97,7 +97,6 @@ Introduction:
* Copying:: Your rights.
* Intro:: Introduction to GNU dbm.
-* List:: List of functions.
Functions:
@@ -134,6 +133,11 @@ Other topics:
* GNU Free Documentation License:: Document license.
* Index:: Index
+@ifset WEBDOC
+@ifhtml
+* This Manual in Other Formats::
+@end ifhtml
+@end ifset
@end menu
@node Copying
@@ -145,26 +149,26 @@ are restrictions on its distribution, but these restrictions are
designed to permit everything that a good cooperating citizen would want
to do. What is not allowed is to try to prevent others from further
sharing any version of @code{gdbm} that they might get from
-you.@refill
+you.
Specifically, we want to make sure that you have the right to give
away copies @code{gdbm}, that you receive
source code or else can get it if you want it, that you can change these
functions or use pieces of them in new free programs, and that you know
-you can do these things.@refill
+you can do these things.
To make sure that everyone has such rights, we have to forbid you to
deprive anyone else of these rights. For example, if you distribute
copies @code{gdbm}, you must give the recipients all
the rights that you have. You must make sure that they, too, receive or
-can get the source code. And you must tell them their rights.@refill
+can get the source code. And you must tell them their rights.
Also, for our own protection, we must make certain that everyone finds
out that there is no warranty for anything in the @code{gdbm} distribution.
If these functions are modified by someone else and passed on, we want
their recipients to know that what they have is not what we distributed,
so that any problems introduced by others will not reflect on our
-reputation.@refill
+reputation.
@code{Gdbm} is currently distributed under the terms of the GNU General
Public License, Version 3. (@emph{NOT} under the GNU General Library
@@ -180,22 +184,24 @@ functions. These routines are provided to a programmer needing to
create and manipulate a hashed database. (@code{gdbm} is @emph{NOT} a
complete database package for an end user.)
+@tpindex datum
The basic use of @code{gdbm} is to store key/data pairs in a data file.
Each key must be unique and each key is paired with only one data item.
The keys can not be directly accessed in sorted order. The basic unit
of data in @code{gdbm} is the structure:
@example
- typedef struct @{
- char *dptr;
- int dsize;
- @} datum;
+typedef struct
+@{
+ char *dptr;
+ int dsize;
+@} datum;
@end example
This structure allows for arbitrary sized keys and data items.
The key/data pairs are stored in a @code{gdbm} disk file, called a
-@code{gdbm} database. An application must open a @code{gdbm} database
+@dfn{gdbm database}. An application must open a @code{gdbm} database
to be able manipulate the keys and data contained in the database.
@code{gdbm} allows an application to have multiple databases open at the
same time. When an application opens a @code{gdbm} database, it is
@@ -204,40 +210,133 @@ database can be opened by at most one writer at a time. However, many readers
may open the database simultaneously. Readers and writers can not
open the @code{gdbm} database at the same time.
-@node List
-@chapter List of functions.
-
-The following is a quick list of the functions contained in the @code{gdbm}
-library. The include file @code{gdbm.h}, that can be included by the user,
-contains a definition of these functions.
+@flindex gdbm.h
+To use the @code{gdbm} functions, the programmer must first include
+the header file @file{gdbm.h}.
+
+@tpindex GDBM_FILE
+This file defines, among others, the @code{GDBM_FILE} data type, an
+opaque pointer to the structure that represents the opened gdbm
+database. To access the database, the programmer must first open it
+using the @code{gdbm_open} function. The function takes several
+arguments, the name of the database file being one of them, and
+returns a @code{GDBM_FILE} object on success. This object is then
+passed to other functions in order to manipulate the database. When
+the database is no longer needed, the programmer @dfn{closes} it using
+the @code{gdbm_close} call.
+
+These and other functions are discussed in detail in chapters that
+follow. Here we show an example illustrating the use of @code{gdbm}
+to look up a key in the database.
@example
+#include <stdio.h>
+#include <string.h>
#include <gdbm.h>
-GDBM_FILE gdbm_open(name, block_size, flags, mode, fatal_func);
-int gdbm_close(dbf);
-int gdbm_store(dbf, key, content, flag);
-datum gdbm_fetch(dbf, key);
-int gdbm_delete(dbf, key);
-datum gdbm_firstkey(dbf);
-datum gdbm_nextkey(dbf, key);
-int gdbm_reorganize(dbf);
-int gdbm_sync(dbf);
-int gdbm_exists(dbf, key);
-char *gdbm_strerror(errno);
-int gdbm_setopt(dbf, option, value, size);
-int gdbm_fdesc(dbf);
-int gdbm_export (GDBM_FILE, const char *, int, int);
-int gdbm_export_to_file (GDBM_FILE dbf, FILE *fp);
-int gdbm_import (GDBM_FILE, const char *, int);
-int gdbm_import_from_file (GDBM_FILE dbf, FILE *fp, int flag);
-int gdbm_count (GDBM_FILE dbf, gdbm_count_t *pcount);
-int gdbm_version_cmp (int const a[], int const b[]);
+int
+main (int argc, char **argv)
+@{
+ GDBM_FILE gdbf; /* Database file object pointer */
+ datum key, content; /* Key and content data */
+ int status = 0; /* Exit status of the program: 0 - OK, 1 - key
+ not found, 2 - error. */
+
+ /*
+ * Validate arguments.
+ */
+ if (argc != 3)
+ @{
+ fprintf (stderr, "usage: %s DBFILE KEY\n", argv[0]);
+ return 2;
+ @}
+
+ /*
+ * Open the database. The GDBM_READER flag indicates that we only intend
+ * to read from it.
+ */
+ gdbf = gdbm_open (argv[1], 0, GDBM_READER, 0, NULL);
+ if (gdbf == NULL)
+ @{
+ fprintf (stderr, "can't open database: %s\n",
+ gdbm_strerror (gdbm_errno));
+ @}
+
+ /*
+ * Prepare the lookup key. Notice, that the terminating \0 character
+ * is not counted in the dsize computation.
+ */
+ key.dptr = argv[2];
+ key.dsize = strlen (argv[2]);
+
+ /*
+ * Look up the key in the database.
+ */
+ content = gdbm_fetch (gdbf, key);
+
+ /*
+ * Analyze the return.
+ */
+ if (content.dptr != NULL)
+ @{
+ /*
+ * The key is found. Print the content on the stdout and
+ * indicate success.
+ */
+ fwrite (content.dptr, content.dsize, 1, stdout);
+ putchar ('\n');
+ status = 0;
+ @}
+ else if (gdbm_errno == GDBM_ITEM_NOT_FOUND)
+ @{
+ /*
+ * There is no such key in the database.
+ */
+ fprintf (stderr, "no such key\n");
+ status = 1;
+ @}
+ else
+ @{
+ /*
+ * An error occurred.
+ */
+ fprintf (stderr, "%s\n", gdbm_db_strerror (gdbf));
+ status = 2;
+ @}
+
+ /*
+ * Close the database and return.
+ */
+ gdbm_close (gdbf);
+ return status;
+@}
@end example
-The @code{gdbm.h} include file is often in the @file{/usr/include}
-directory. (The actual location of @code{gdbm.h} depends on your local
-installation of @code{gdbm}.)
+To compile this example, run
+
+@example
+cc -oexample example.c -lgdbm
+@end example
+
+To run it, you will need an example database. The easiest way to
+create it is by using the @command{gdbtool} program, which is part
+of the @code{gdbm} package (@pxref{gdbmtool}):
+
+@example
+$ gdbmtool test.gdbm store foo bar
+@end example
+
+@noindent
+This creates database file @file{test.gdbm} and stores a single record
+in it. The record's key is @samp{foo}, and the value is @samp{bar}.
+Now you can run the example program to see how it works:
+
+@example
+$ ./example test.gdbm foo
+bar
+$ ./example test.gdbm baz
+no such key
+@end example
@node Open
@chapter Opening the database.
@@ -315,7 +414,7 @@ database file descriptor.
@item mode
File mode (see
@ifhtml
-@uref{http://www.manpagez.com/man/2/chmod},
+@uref{http://www.manpagez.com/man/2/chmod, chmod(2)},
@end ifhtml
@ifnothtml
@ref{chmod,,change permissions of a file,chmod(2),
@@ -323,7 +422,7 @@ chmod(2) man page},
@end ifnothtml
and
@ifhtml
-@uref{http://www.manpagez.com/man/2/open}),
+@uref{http://www.manpagez.com/man/2/open, open(2)}),
@end ifhtml
@ifnothtml
@pxref{open,,open a file,open(2), open(2) man page}),
@@ -351,7 +450,7 @@ returned from @code{gdbm_open}.
Alternative function for opening a GDBM database. The @var{fd}
argument is the file descriptor of the database file obtained by a
-call to @code{open}(2), @code{creat}(2) or similar funcionss. The
+call to @code{open}(2), @code{creat}(2) or similar functions. The
descriptor is not dup'ed, and will be closed when the returned
GDBM_FILE is closed. Use @code{dup}(2) if that is not desirable.
@end deftypefn
@@ -389,7 +488,7 @@ describing the error and returns -1.
@deftypefn {gdbm interface} int gdbm_count (GDBM_FILE @var{dbf}, @
gdbm_count_t *@var{pcount})
Counts number of records in the database @var{dbf}. On success,
-stores it in the memory location pointed to by @var{pcount} and return
+stores it in the memory location pointed to by @var{pcount} and returns
0. On error, sets @code{gdbm_errno} (if relevant, also @code{errno})
and returns -1.
@end deftypefn
@@ -425,6 +524,9 @@ already exists.
This function can return the following values:
@table @asis
+@item 0
+Success. The value of @var{content} is keyed by @var{key} in the
+database.
@item -1
The item was not stored in the database because the caller was not an
official writer or either @var{key} or @var{content} have a
@@ -436,10 +538,6 @@ other functions to indicate an error, it cannot be valid data.
@item +1
The item was not stored because the argument @var{flag} was
@samp{GDBM_INSERT} and the @var{key} was already in the database.
-@item 0
-No error. The value of @var{content} is keyed by @var{key}. The file
-on disk is updated to reflect the structure of the new database before
-returning from this function.
@end table
@end deftypefn
@@ -448,8 +546,9 @@ If you store data for a @var{key} that is already in the data base,
@samp{GDBM_REPLACE}. You do not get two data items for the same
@code{key} and you do not get an error from @code{gdbm_store}.
-The size in @code{gdbm} is not restricted like @code{dbm} or @code{ndbm}. Your
-data can be as large as you want.
+The size of datum in @code{gdbm} is restricted only by the maximum
+value for an object of type @code{int} (type of the @code{dsize} member of
+@code{datum}).
@node Fetch
@chapter Searching for records in the database.
@@ -526,8 +625,7 @@ function.
@deftypefn {gdbm interface} int gdbm_delete (GDBM_FILE @var{dbf}, datum @var{key})
Deletes the data associated with the given @var{key}, if it exists in
-the database @var{dbf}. The file on disk is updated to reflect the
-structure of the new database before returning from this function.
+the database @var{dbf}.
The parameters are:
@@ -563,13 +661,13 @@ field in the returned datum is @samp{NULL}, inspect the
of @code{GDBM_ITEM_NOT_FOUND} means that the database contains no
data. Other value means an error occurred.
-Otherwise, @samp{dptr} points to a memory block obtained from
+On success, @samp{dptr} points to a memory block obtained from
@code{malloc}, which holds the key value. The caller is responsible
for freeing this memory block when no longer needed.
@end deftypefn
@deftypefn {gdbm interface} datum gdbm_nextkey (GDBM_FILE @var{dbf}, datum @var{prev})
-This function continues the iteration over the keys in @var{dbf},
+This function continues iteration over the keys in @var{dbf},
initiated by @code{gdbm_firstkey}. The parameter @var{prev} holds the
value returned from a previous call to @code{gdbm_nextkey} or
@code{gdbm_firstkey}.
@@ -586,7 +684,7 @@ for freeing this memory block when no longer needed.
@end deftypefn
@cindex iteration loop
-These functions were intended to visit the database in read-only algorithms,
+These functions are intended to visit the database in read-only algorithms,
for instance, to validate the database or similar operations. The
usual algorithm for sequential access is:
@@ -613,7 +711,7 @@ usual algorithm for sequential access is:
@cindex iteration and @code{gdbm_delete}
@cindex deletion in iteration loops
@cindex @code{gdbm_delete} and sequential access
-Care should be taken when the @code{gdbm_delete} function is used in
+Don't use @code{gdbm_delete} or @code{gdbm_store} in
such a loop. File visiting is based on a @dfn{hash table}. The
@code{gdbm_delete} function re-arranges the hash table to make sure
that any collisions in the table do not leave some item
@@ -730,7 +828,7 @@ The GDBM version @value{VERSION} supports two flat file formats. The
information about the database file itself. As its name implies,
files in this format are binary files.
-The @dfn{ascii} flat file format encodes all data in base64 and stores
+The @dfn{ascii} flat file format encodes all data in Base64 and stores
not only key/data pairs, but also the original database file metadata,
such as file name, mode and ownership. Files in this format can be
sent without additional encapsulation over transmission channels that
@@ -774,7 +872,7 @@ output file, replacing it if it already exists.
@item mode
The permissions to use when creating the output file.
@ifhtml
-See @uref{http://www.manpagez.com/man/2/open},
+See @uref{http://www.manpagez.com/man/2/open, open(2)},
@end ifhtml
@ifnothtml
See @ref{open,,open a file,open(2), open(2) man page},
@@ -899,8 +997,7 @@ earlier. It dumps the database to a file in binary dump format and
is entirely equivalent to
@example
-gdbm_dump(@var{dbf}, @var{exportfile}, GDBM_DUMP_FMT_BINARY,
- @var{flag}, @var{mode})
+gdbm_dump(@var{dbf}, @var{exportfile}, GDBM_DUMP_FMT_BINARY, @var{flag}, @var{mode})
@end example
@end deftypefn
@@ -1014,7 +1111,7 @@ function is called upon the entry to any GDBM function.
@end deftypefn
Certain errors (such as write error when saving stored key) can leave
-database file in inconistent state. When such a critical error
+database file in inconsistent state. When such a critical error
occurs, the database file is marked as needing recovery. Subsequent
calls to any GDBM functions for that database file (except
@code{gdbm_recover}), will return immediately with GDBM error value
@@ -1033,7 +1130,7 @@ call the @code{gdbm_recover} function (@pxref{Recovery}).
@chapter Recovery
Certain errors (such as write error when saving stored key) can leave
-database file in @dfn{inconistent state}. When such a critical error
+database file in @dfn{inconsistent state}. When such a critical error
occurs, the database file is marked as needing recovery. Subsequent
calls to any GDBM functions for that database file (except
@code{gdbm_recover}), will return immediately with GDBM error value
@@ -1047,12 +1144,12 @@ state, use the following function:
Check the database file @var{dbf} and fix eventual errors. The
@var{rcvr} argument points to a structure that has @dfn{input
members}, providing additional information to alter the behavior of
-@code{gdbm_recover}, and @dfn{output members}, used to return
+@code{gdbm_recover}, and @dfn{output members}, which are used to return
additional statistics about the recovery process (@var{rcvr} can be
@code{NULL} if no such information is needed).
Each input member has a corresponding flag bit, which must be set in
-the @var{flags} in order to instruct the function to use it.
+@var{flags}, in order to instruct the function to use it.
The @code{gdbm_recover} type is defined as:
@@ -1080,13 +1177,22 @@ typedef struct gdbm_recovery_s
The @dfn{input members} modify the behavior of @code{gdbm_recover}:
-@deftypeop {input member} gdbm_recovery void (*errfun) (void *@var{data},@
+@deftypecv {input member} gdbm_recovery void (*errfun) (void *@var{data},@
char const *@var{fmt}, ...)
@kwindex GDBM_RCVR_ERRFUN
If the @code{GDBM_RCVR_ERRFUN} flag bit is set, @code{errfun} points
to a function that will be called upon each recoverable or non-fatal
-error that occurred during the recovery.
-@end deftypeop
+error that occurred during the recovery. The @code{data} field of
+@code{gdbm_recovery} will be passed to it as its first argument. The
+@var{fmt} argument is a
+@ifhtml
+@uref{http://www.manpagez.com/man/3/printf, printf(3)}-like
+@end ifhtml
+@ifnothtml
+@code{printf}-like (@pxref{printf,,format output,printf(3), printf(2) man page}),
+@end ifnothtml
+format string. The rest of arguments supply parameters for that format.
+@end deftypecv
@deftypecv {input member} gdbm_recovery {void *} data
Supplies first argument for the @code{errfun} invocations.
@@ -1096,7 +1202,7 @@ Supplies first argument for the @code{errfun} invocations.
@kwindex GDBM_RCVR_MAX_FAILED_KEYS
If @code{GDBM_RCVR_MAX_FAILED_KEYS} is set, this member sets the limit
on the number of keys that cannot be retrieved. If the number of
-failed keys grows bigger than @code{max_failed_keys}, recovery is
+failed keys becomes equal to @code{max_failed_keys}, recovery is
aborted and error is returned.
@end deftypecv
@@ -1104,7 +1210,7 @@ aborted and error is returned.
@kwindex GDBM_RCVR_MAX_FAILED_BUCKETS
If @code{GDBM_RCVR_MAX_FAILED_BUCKETS} is set, this member sets the limit
on the number of buckets that cannot be retrieved or that contain
-bogus information. If the number of failed buckets grows bigger than
+bogus information. If the number of failed buckets becomes equal to
@code{max_failed_buckets}, recovery is aborted and error is returned.
@end deftypecv
@@ -1112,8 +1218,8 @@ bogus information. If the number of failed buckets grows bigger than
@kwindex GDBM_RCVR_MAX_FAILURES
If @code{GDBM_RCVR_MAX_FAILURES} is set, this member sets the limit
of failures that are tolerated during recovery. If the number of
-errors grows bigger than @code{max_failures}, recovery is aborted and
-error is returned.
+errors becomes equal to @code{max_failures}, recovery is aborted and
+error is returned.
@end deftypecv
The following members are filled on output, upon successful return
@@ -1145,10 +1251,10 @@ The caller is responsible for freeing that memory when no longer needed.
@end deftypefn
@kwindex GDBM_RCVR_FORCE
-By default, @code{gdbm_recovery} first checks the database fo
+By default, @code{gdbm_recovery} first checks the database for
inconsistencies and attempts recovery only if some were found.
The special flag bit @code{GDBM_RCVR_FORCE} instructs
-@code{gdbm_recovery} to omit this check and to force recovery
+@code{gdbm_recovery} to omit this check and to perform database recovery
unconditionally.
@node Options
@@ -1176,6 +1282,9 @@ place the option value (depending on the option).
@item size
The length of the data pointed to by @var{value}.
@end table
+
+The return value will be @samp{-1} upon failure, or @samp{0} upon
+success. The global variable @code{gdbm_errno} will be set upon failure.
@end deftypefn
The valid options are:
@@ -1193,6 +1302,17 @@ to a @code{size_t} holding the desired cache size.
The @samp{GDBM_CACHESIZE} option is provided for compatibility with
earlier versions.
+For instance, to set a database to use a cache of 10, after opening it
+with @code{gdbm_open}, but prior to accessing it in any way, the following
+code could be used:
+
+@example
+@group
+int value = 10;
+ret = gdbm_setopt (dbf, GDBM_SETCACHESIZE, &value, sizeof (int));
+@end group
+@end example
+
@kwindex GDBM_GETCACHESIZE
@item GDBM_GETCACHESIZE
Return the size of the internal bucket cache. The @var{value} should
@@ -1201,10 +1321,10 @@ point to a @code{size_t} variable, where the size will be stored.
@kwindex GDBM_GETFLAGS
@item GDBM_GETFLAGS
Return the flags describing the state of the database. The @var{value} should
-point to a @code{int} variable where to store the flags. The return
-is the same as the flags used when opening the database (@pxref{Open,
-gdbm_open}), except that it reflects the current state (which may have
-been altered by another calls to @code{gdbm_setopt}.
+point to an @code{int} variable where to store the flags. On success,
+its value will be similar to the flags used when opening the database
+(@pxref{Open, gdbm_open}), except that it will reflect the current state
+(which may have been altered by another calls to @code{gdbm_setopt}).
@kwindex GDBM_FASTMODE
@item GDBM_FASTMODE
@@ -1326,20 +1446,6 @@ Return the block size in bytes. The @var{value} should point to @code{int}.
@end table
-The return value will be @samp{-1} upon failure, or @samp{0} upon
-success. The global variable @code{gdbm_errno} will be set upon failure.
-
-For instance, to set a database to use a cache of 10, after opening it
-with @code{gdbm_open}, but prior to accessing it in any way, the following
-code could be used:
-
-@example
-@group
-int value = 10;
-ret = gdbm_setopt (dbf, GDBM_CACHESIZE, &value, sizeof (int));
-@end group
-@end example
-
@node Locking
@chapter File Locking.
@cindex locking
@@ -1721,7 +1827,7 @@ database file to be opened. The function opens two files:
@var{mode} arguments have the same meaning as the second and third
arguments of
@ifhtml
-@uref{http://www.manpagez.com/man/2/open,,open(2)},
+@uref{http://www.manpagez.com/man/2/open, open(2)},
@end ifhtml
@ifnothtml
@code{open} (@pxref{open,,open a file,open(2), open(2) man page}),
@@ -1808,9 +1914,7 @@ never free it.
The usual way of iterating over all the records in the database is:
@example
-for (key = dbm_firstkey (dbf);
- key.ptr;
- key = dbm_nextkey (dbf))
+for (key = dbm_firstkey (dbf); key.ptr; key = dbm_nextkey (dbf))
@{
/* do something with the key */
@}
@@ -1951,7 +2055,7 @@ it will be opened only for reading.
@cindex @option{-n}, @command{gdbmtool} option
@cindex @option{--newdb}, @command{gdbmtool} option
If the database does not exist, @command{gdbmtool} will create it.
-There is a special option @option{-n} (@option{--newdb}, which
+There is a special option @option{-n} (@option{--newdb}), which
instructs the utility to create a new database. If it is used and if
the database already exists, it will be deleted, so use it sparingly.
@@ -2009,7 +2113,7 @@ Create the database.
Disable file locking.
@item -m
@itemx --no-mmap
-Disable mmap.
+Disable memory mapping.
@anchor{-q option}
@item -q
@itemx --quiet
@@ -2115,7 +2219,8 @@ Command Line Editing, readline, GNU Readline Library}).
@subsection Shell Variables
@cindex variables, gdbmtool
A number of @command{gdbmtool} parameters is kept in its internal
-variables.
+variables. To examine or modify variables, use the @code{set} command
+(@pxref{set}).
@deftypevr {gdbmtool variable} bool confirm
Whether to ask for confirmation before certain destructive operations,
@@ -2177,9 +2282,9 @@ The default value is inherited from the environment variable
@anchor{quiet}
@deftypevr {gdbmtool variable} bool quiet
-Whether to display a welcome banner at startup. This variable should
-be set in a startup script file (@pxref{startup files}).
-@xref{-q option}.
+Whether to display a welcome banner at startup. To affect
+@command{gdbmtool}, this variable should be set in a startup script
+file (@pxref{startup files}). @xref{-q option}.
@end deftypevr
@anchor{open parameters}
@@ -2220,8 +2325,8 @@ exist.
This sets the @samp{GDBM_READER} flag (@pxref{Open, GDBM_READER}).
@end table
-Attempting to set any other value or to unset this variable produces
-an error.
+Attempting to set any other value or to unset this variable results
+in error.
@end deftypevr
@anchor{filemode}
@@ -2270,6 +2375,7 @@ before invoking it.
The following commands are used to list or modify the variables:
+@anchor{set}
@deffn {command verb} set [@var{assignments}]
When used without arguments, lists all variables and their values.
Unset variables are shown after a comment sign (@samp{#}). For string
@@ -2794,7 +2900,7 @@ original name, as stored in the input file. It will fail to do so if
the input is in binary format. In that case, the name of the database
must be given as the second argument.
-In general, if two arguments are given the second one is treated as
+In general, if two arguments are given, the second one is treated as
the name of the database to create, overriding the file name specified
in the flat file.
@@ -2890,9 +2996,8 @@ about things that are unclear in the documentation or are just obscure
features, please report them too.
You may contact the authors and maintainers by e-mail:
-@example
-@email{phil@@cs.wwu.edu}, @email{downsj@@downsj.com}, @email{gray@@gnu.org.ua}
-@end example
+@email{phil@@cs.wwu.edu}, @email{downsj@@downsj.com},
+@email{gray@@gnu.org} or @email{gray@@gnu.org.ua}.
@node Resources
@chapter Additional resources
@@ -2905,7 +3010,9 @@ is available online at @uref{http://www.gnu.org/@/software/@/gdbm/@/manual.html}
Latest versions of @code{gdbm} can be downloaded from anonymous FTP:
@uref{ftp://ftp.gnu.org/@/gnu/@/gdbm}, or via HTTP from
-@uref{http://ftp.gnu.org/@/gnu/@/gdbm}, or from any
+@uref{http://ftp.gnu.org/@/gnu/@/gdbm}, or via HTTPS from
+@uref{https://ftp.gnu.org/@/gnu/@/gdbm},
+or from any
@ifhtml
@uref{http://www.gnu.org/order/ftp.html,,GNU mirror} worldwide.
@end ifhtml
@@ -2927,4 +3034,12 @@ To track @code{gdbm} development, visit
@printindex cp
+@ifset WEBDOC
+@ifhtml
+@node This Manual in Other Formats
+@unnumbered This Manual in Other Formats
+@include otherdoc.texi
+@end ifhtml
+@end ifset
+
@bye
diff --git a/doc/gendocs.pl b/doc/gendocs.pl
new file mode 100644
index 0000000..8c9c197
--- /dev/null
+++ b/doc/gendocs.pl
@@ -0,0 +1,480 @@
+# This file is part of GNU Pies.
+# Copyright (C) 2020 Sergey Poznyakoff
+#
+# GNU Pies is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Pies is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Pies. If not, see <http://www.gnu.org/licenses/>.
+
+use strict;
+use warnings;
+use Getopt::Long qw(:config gnu_getopt no_ignore_case);
+use File::Basename;
+use File::Spec;
+use File::Path qw(make_path);
+use Pod::Usage;
+
+my $dirname = '.';
+my $pkgname;
+my $srcname;
+my $output_name;
+my @includes;
+
+GetOptions("h" => sub {
+ pod2usage(-message => "$0: generate docs",
+ -exitstatus => 0);
+ },
+ "help" => sub {
+ pod2usage(-exitstatus => 0, -verbose => 2);
+ },
+ "usage" => sub {
+ pod2usage(-exitstatus => 0, -verbose => 0);
+ },
+ 'source|s=s' => \$srcname,
+ 'directory|C=s' => \$dirname,
+ 'output|o=s' => \$output_name,
+ 'include|I=s@' => \@includes
+ ) or exit(1);
+
+$pkgname = shift @ARGV or pod2usage(-exitstatus => 1, -verbose => 0);
+$srcname //= "${pkgname}.texi";
+my $template_name = shift @ARGV or pod2usage(-exitstatus => 1, -verbose => 0);
+
+unless (-d $dirname) {
+ make_path($dirname);
+}
+
+unless ($output_name) {
+ $output_name = File::Spec->catfile($dirname, (fileparse($template_name, qr/\.[^.]*/))[0]);
+}
+
+if (@includes) {
+ @includes = map { '-I '.$_} @includes;
+ # FIXME: Not used yet
+}
+
+sub template_scan {
+ my $file = shift;
+ open(FH, '<', $file) or die "can't open $file: $!\n";
+ my $line = 0;
+ while (<FH>) {
+ chomp;
+ ++$line;
+ s{ \$ ((?:BASE)?FILE|SIZE) \( ([a-z_]+) \) }{
+ eval { Gendocs->instance($2, $pkgname, $srcname) };
+ if ($@) {
+ if ($@ =~ m{Can't locate object method "new"}) {
+ die "$file:$line: unknown format: $2\n";
+ } else {
+ die $@;
+ }
+ }
+ }gex;
+ }
+ close FH
+}
+
+sub template_expand {
+ my ($infile, $outfile) = @_;
+ open(IFH, '<', $infile) or die "can't open $infile: $!\n";
+ open(OFH, '>', $outfile) or die "can't open $outfile: $!\n";
+ while (<IFH>) {
+ chomp;
+ s{ \$ ((?:BASE)?FILE|SIZE) \( ([a-z_]+) \) }{
+ if ($1 eq 'FILE') {
+ Gendocs->instance($2)->output;
+ } elsif ($1 eq 'BASEFILE') {
+ basename(Gendocs->instance($2)->output);
+ } else {
+ Gendocs->instance($2)->size;
+ }
+ }gex;
+ print OFH "$_\n";
+ }
+}
+
+template_scan $template_name;
+Gendocs->generate();
+template_expand($template_name, $output_name);
+Gendocs->sweep();
+
+package Gendocs;
+use strict;
+use warnings;
+
+my %registry;
+
+sub generate {
+ my ($class) = @_;
+ my @keys = keys %registry;
+ foreach my $k (@keys) {
+ $registry{$k}->build();
+ $registry{$k}->mark();
+ }
+}
+
+sub sweep {
+ my ($class) = @_;
+ my @keys = keys %registry;
+ foreach my $k (@keys) {
+ unless ($registry{$k}->has_mark) {
+ $registry{$k}->remove;
+ delete $registry{$k};
+ }
+ }
+}
+
+sub new {
+ my ($class, $pkgname, $name) = @_;
+ unless (exists($registry{$class})){
+ $registry{$class} = bless { pkgname => $pkgname, input => $name }, $class;
+ }
+ return $registry{$class}
+}
+sub instance {
+ my ($class, $fmt, @args) = @_;
+ my $subclass = "Gendocs::".ucfirst($fmt);
+ unless (exists($registry{$subclass})) {
+ $registry{$subclass} = $subclass->new(@args);
+ }
+ return $registry{$subclass};
+}
+
+sub runcom {
+ my $self = shift;
+ system @_;
+ if ($? == -1) {
+ die "failed to execute $_[0]: $!";
+ } elsif ($? & 127) {
+ die sprintf("$_[0] died with signal %d\n", $? & 127);
+ } elsif ($? >> 8) {
+ warn sprintf("$_[0] exited with value %d\n", $? >> 8);
+ }
+}
+
+sub mark { shift->{mark} = 1 }
+sub has_mark { shift->{mark} }
+sub remove {
+ my ($self) = @_;
+ if ($self->{output}) {
+ unlink $self->{output};
+ delete $self->{output};
+ }
+}
+sub size {
+ my ($self) = @_;
+ my $s = (stat($self->output))[7];
+ if ($s > 1048576) {
+ $s = int($s / 1048576) . 'M';
+ } elsif ($s > 1024) {
+ $s = int($s / 1024) . 'K';
+ }
+ return $s;
+}
+
+sub pkgname { shift->{pkgname} }
+sub input { shift->{input} }
+sub output { shift->{output} }
+
+package Gendocs::Makeinfo;
+use strict;
+use warnings;
+use base 'Gendocs';
+
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new(@_);
+ $self->{makeinfo} = $ENV{'MAKEINFO'} || 'makeinfo';
+ return $self;
+}
+
+package Gendocs::Info;
+use strict;
+use warnings;
+use base 'Gendocs::Makeinfo';
+
+sub build {
+ my ($self) = @_;
+ unless ($self->{output}) {
+ my $output = File::Spec->catfile($dirname, $self->pkgname . '.info');
+ print "Generating info file: " . $self->input . " -> $output\n";
+ $self->runcom("$self->{makeinfo} -o $output " . $self->input);
+ $self->{output} = $output;
+ }
+ return $self->{output};
+}
+
+package Gendocs::Info_gz;
+use strict;
+use warnings;
+use base 'Gendocs';
+
+sub build {
+ my ($self) = @_;
+ unless ($self->{output}) {
+ my $input = Gendocs->instance('info', $self->pkgname, $self->input)->build();
+ my $output = "$input.gz";
+ print "Compressing info file: $input -> $output\n";
+ $self->runcom("gzip -f -9 -c $input > $output");
+ $self->{output} = $output;
+ }
+ return $self->{output};
+}
+
+package Gendocs::Ascii;
+use strict;
+use warnings;
+use base 'Gendocs::Makeinfo';
+
+sub build {
+ my ($self) = @_;
+ unless ($self->{output}) {
+ my $output = File::Spec->catfile($dirname, $self->pkgname . '.txt');
+ print "Generating ascii file: " . $self->input . " -> $output\n";
+ $self->runcom("$self->{makeinfo} -o $output --no-split --no-headers " . $self->input);
+ $self->{output} = $output;
+ }
+ return $self->{output};
+}
+
+package Gendocs::Ascii_gz;
+use strict;
+use warnings;
+use base 'Gendocs';
+
+sub build {
+ my ($self) = @_;
+ unless ($self->{output}) {
+ my $input = Gendocs->instance('ascii', $self->pkgname, $self->input)->build();
+ my $output = "$input.gz";
+ print "Compressing ascii file: $input -> $output\n";
+ $self->runcom("gzip -f -9 -c $input > $output");
+ $self->{output} = $output;
+ }
+ return $self->{output};
+}
+
+package Gendocs::Texinfo_gz;
+use strict;
+use warnings;
+use base 'Gendocs';
+
+sub build {
+ my ($self) = @_;
+ unless ($self->{output}) {
+ my $output = File::Spec->catfile($dirname, $self->pkgname . '.tar.gz');
+ print "Creating compressed sources: $output\n";
+ $self->runcom("tar czfh $output *.texinfo *.texi *.txi *.eps 2>/dev/null || /bin/true");
+ $self->{output} = $output;
+ }
+ return $self->{output};
+}
+
+package Gendocs::Dvi;
+use strict;
+use warnings;
+use base 'Gendocs';
+
+sub new {
+ my $class = shift;
+ my $self = $class->SUPER::new(@_);
+ $self->{texi2dvi} = $ENV{'TEXI2DVI'} || 'texi2dvi --build=tidy -t @finalout';
+ return $self;
+}
+
+sub build {
+ my ($self) = @_;
+ unless ($self->{output}) {
+ my $output = File::Spec->catfile($dirname, $self->pkgname . '.dvi');
+ my $cmd = "$self->{texi2dvi} -o $output $self->{input}";
+ print "Creating dvi: $cmd\n";
+ $self->runcom($cmd);
+ $self->{output} = $output;
+ }
+ return $self->{output};
+}
+
+package Gendocs::Dvi_gz;
+use strict;
+use warnings;
+use base 'Gendocs';
+
+sub build {
+ my ($self) = @_;
+ unless ($self->{output}) {
+ my $input = Gendocs->instance('dvi', $self->pkgname, $self->input)->build();
+ my $output = "$input.gz";
+ print "Compressing dvi file: $input -> $output\n";
+ $self->runcom("gzip -f -9 -c $input > $output");
+ $self->{output} = $output;
+ }
+ return $self->{output};
+}
+
+package Gendocs::Pdf;
+use strict;
+use warnings;
+use base 'Gendocs::Dvi';
+
+sub build {
+ my ($self) = @_;
+ unless ($self->{output}) {
+ my $output = File::Spec->catfile($dirname, $self->pkgname . '.pdf');
+ my $cmd = "$self->{texi2dvi} -o $output --pdf $self->{input}";
+ print "Creating pdf: $cmd\n";
+ $self->runcom($cmd);
+ $self->{output} = $output;
+ }
+ return $self->{output};
+}
+__END__
+=head1 NAME
+
+gendocs.pl - generate documentation in various formats
+
+=head1 SYNOPSIS
+
+B<gendocs.pl>
+[B<-C> I<DIR>]
+[B<-s> I<SOURCE>]
+[B<-o> I<OUTPUT-FILE>]
+[B<-I> I<INCLUDE-DIR>]
+[B<--directory=>I<DIR>]
+[B<--include=>I<INCLUDE-DIR>]
+[B<--output=>I<OUTPUT-FILE>]
+[B<--source=>I<SOURCE>]
+I<PACKAGE> I<TEMPLATE>
+
+B<gendocs.pl> B<-h> | B<--help> | B<--usage>
+
+=head1 DESCRIPTION
+
+Generates documentation for the I<PACKAGE> in various formats. I<TEMPLATE>
+is a template file for the index page. When processing I<TEMPLATE> the
+following I<macros> inform B<gendocs.pl> about the desired documentation
+formats and are expanded on output:
+
+=over 4
+
+=item B<$FILE(I<FORMAT>)>
+
+Full pathname of the documentation file in format I<FORMAT>.
+
+=item B<$BASEFILE(I<FORMAT>)>
+
+Base name of the documentation file for format I<FORMAT>.
+
+=item B<$SIZE(I<FORMAT>)>
+
+Size of the documentation file in format I<FORMAT>. Proper size suffix
+(B<K> or B<M>) is appended, as needed.
+
+=back
+
+The file is processed twice. On the first pass, the program collects the
+mentioned I<FORMAT>s. Then the requested files are generated. On the
+second pass, the macros are replaced with the actual values and the output
+index file is generated. The name of the index file can be supplied using
+the B<-o> (B<--output>) option. If it is not given, the name is obtained
+by removing last suffix (a substring beginning with a dot and containing
+one or more characters, excepting dots) from the I<TEMPLATE> argument.
+
+Unless the B<-C> (B<--directory>) option is given, the output will be
+generated in the current working directory. If the B<-C> option is
+given, all output files, including index file, will be generated in
+the supplied directory.
+
+The following output formats are supported:
+
+=over 4
+
+=item B<info>
+
+Monolithic info file.
+
+=item B<info_gz>
+
+Monolithic info file, compressed with B<gzip>
+
+=item B<ascii>
+
+Monolithic ASCII file.
+
+=item B<ascii_gz>
+
+Monolithic ASCII file, compressed with B<gzip>
+
+=item B<texinfo_gz>
+
+A tar archive with the Texinfo documentation sources, compressed with B<gzip>.
+
+=item B<dvi>
+
+TeX B<dvi> file.
+
+=item B<dvi_gz>
+
+TeX B<dvi> file, compressed with B<gzip>
+
+=item B<pdf>
+
+A B<PDF> file.
+
+=back
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-C>, B<--directory=>I<DIR>
+
+Create all output files in the directory I<DIR>.
+
+=item B<-s>, B<--source=>I<SOURCE>
+
+Name of the main Texinfo source file. By default F<I<PACKAGE>.texi> is
+used.
+
+=item B<-o>, B<--output=>I<OUTPUT-FILE>
+
+Name of the output index file. By default it is constructed by removing
+the last filename suffix from I<TEMPLATE>. E.g. F<index.texi.in> produces
+F<index.texi>.
+
+=item B<-I>, B<--include=>I<INCLUDE-DIR>
+
+Name of the directory with Texinfo include files. This option is not
+actually used. It is reserved for future use.
+
+=back
+
+=head1 ENVIRONMENT
+
+The following environment variables affect the behavior of B<gendocs.pl>:
+
+=over 4
+
+=item B<MAKEINFO>
+
+Name and initial options of the B<makeinfo> program.
+
+=item B<TEXI2DVI>
+
+Name and initial options of the B<texi2dvi> program. The default is
+F<texi2dvi --build=tidy -t @finalout>.
+
+=item B<TEXINPUTS>
+
+Used by F<texi2dvi>. Colon-separated list of Texinfo input directories.
+
+=back
+
+=cut
diff --git a/doc/gendocs.sh b/doc/gendocs.sh
deleted file mode 100755
index 0984f94..0000000
--- a/doc/gendocs.sh
+++ /dev/null
@@ -1,489 +0,0 @@
-#!/bin/sh -e
-# gendocs.sh -- generate a GNU manual in many formats. This script is
-# mentioned in maintain.texi. See the help message below for usage details.
-
-scriptversion=2015-02-28.17
-
-# Copyright 2003-2013, 2017-2020 Free Software Foundation, Inc.
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-# Original author: Mohit Agarwal.
-# Send bug reports and any other correspondence to bug-texinfo@gnu.org.
-#
-# The latest version of this script, and the companion template, is
-# available from Texinfo CVS:
-# http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs.sh
-# http://savannah.gnu.org/cgi-bin/viewcvs/texinfo/texinfo/util/gendocs_template
-#
-# An up-to-date copy is also maintained in Gnulib (gnu.org/software/gnulib).
-
-# TODO:
-# - image importation was only implemented for HTML generated by
-# makeinfo. But it should be simple enough to adjust.
-# - images are not imported in the source tarball. All the needed
-# formats (PDF, PNG, etc.) should be included.
-
-prog=`basename "$0"`
-srcdir=`pwd`
-
-scripturl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs.sh"
-templateurl="http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/texinfo/texinfo/util/gendocs_template"
-
-: ${SETLANG="env LANG= LC_MESSAGES= LC_ALL= LANGUAGE="}
-: ${MAKEINFO="makeinfo"}
-: ${TEXI2DVI="texi2dvi -t @finalout"}
-: ${DOCBOOK2HTML="docbook2html"}
-: ${DOCBOOK2PDF="docbook2pdf"}
-: ${DOCBOOK2TXT="docbook2txt"}
-: ${GENDOCS_TEMPLATE_DIR="."}
-: ${PERL='perl'}
-: ${TEXI2HTML="texi2html"}
-unset CDPATH
-unset use_texi2html
-
-version="gendocs.sh $scriptversion
-
-Copyright 2013 Free Software Foundation, Inc.
-There is NO warranty. You may redistribute this software
-under the terms of the GNU General Public License.
-For more information about these matters, see the files named COPYING."
-
-usage="Usage: $prog [OPTION]... PACKAGE MANUAL-TITLE
-
-Generate output in various formats from PACKAGE.texinfo (or .texi or
-.txi) source. See the GNU Maintainers document for a more extensive
-discussion:
- http://www.gnu.org/prep/maintain_toc.html
-
-Options:
- --email ADR use ADR as contact in generated web pages; always give this.
-
- -s SRCFILE read Texinfo from SRCFILE, instead of PACKAGE.{texinfo|texi|txi}
- -o OUTDIR write files into OUTDIR, instead of manual/.
- -I DIR append DIR to the Texinfo search path.
- --common ARG pass ARG in all invocations.
- --html ARG pass ARG to makeinfo or texi2html for HTML targets.
- --info ARG pass ARG to makeinfo for Info, instead of --no-split.
- --no-ascii skip generating the plain text output.
- --no-copy-images
- don't try to copy images referenced by img HTML tags,
- --source ARG include ARG in tar archive of sources.
- --split HOW make split HTML by node, section, chapter; default node.
-
- --texi2html use texi2html to make HTML target, with all split versions.
- --docbook convert through DocBook too (xml, txt, html, pdf).
-
- --help display this help and exit successfully.
- --version display version information and exit successfully.
-
-Simple example: $prog --email bug-gnu-emacs@gnu.org emacs \"GNU Emacs Manual\"
-
-Typical sequence:
- cd PACKAGESOURCE/doc
- wget \"$scripturl\"
- wget \"$templateurl\"
- $prog --email BUGLIST MANUAL \"GNU MANUAL - One-line description\"
-
-Output will be in a new subdirectory \"manual\" (by default;
-use -o OUTDIR to override). Move all the new files into your web CVS
-tree, as explained in the Web Pages node of maintain.texi.
-
-Please use the --email ADDRESS option so your own bug-reporting
-address will be used in the generated HTML pages.
-
-MANUAL-TITLE is included as part of the HTML <title> of the overall
-manual/index.html file. It should include the name of the package being
-documented. manual/index.html is created by substitution from the file
-$GENDOCS_TEMPLATE_DIR/gendocs_template. (Feel free to modify the
-generic template for your own purposes.)
-
-If you have several manuals, you'll need to run this script several
-times with different MANUAL values, specifying a different output
-directory with -o each time. Then write (by hand) an overall index.html
-with links to them all.
-
-If a manual's Texinfo sources are spread across several directories,
-first copy or symlink all Texinfo sources into a single directory.
-(Part of the script's work is to make a tar.gz of the sources.)
-
-As implied above, by default monolithic Info files are generated.
-If you want split Info, or other Info options, use --info to override.
-
-You can set the environment variables MAKEINFO, TEXI2DVI, TEXI2HTML,
-and PERL to control the programs that get executed, and
-GENDOCS_TEMPLATE_DIR to control where the gendocs_template file is
-looked for. With --docbook, the environment variables DOCBOOK2HTML,
-DOCBOOK2PDF, and DOCBOOK2TXT are also consulted.
-
-By default, makeinfo and texi2dvi are run in the default (English)
-locale, since that's the language of most Texinfo manuals. If you
-happen to have a non-English manual and non-English web site, see the
-SETLANG setting in the source.
-
-Email bug reports or enhancement requests to bug-texinfo@gnu.org.
-"
-
-MANUAL_TITLE=
-PACKAGE=
-EMAIL=webmasters@gnu.org # please override with --email
-commonarg= # passed to all makeinfo/texi2html invcations.
-dirargs= # passed to all tools (-I dir).
-dirs= # -I's directories.
-htmlarg=
-infoarg=--no-split
-generate_ascii=true
-outdir=manual
-source_extra=
-split=default
-srcfile=
-no_copy_images=
-
-while test $# -gt 0; do
- case $1 in
- -s) shift; srcfile=$1;;
- -o) shift; outdir=$1;;
- -I) shift; dirargs="$dirargs -I '$1'"; dirs="$dirs $1";;
- --common) shift; commonarg=$1;;
- --docbook) docbook=yes;;
- --email) shift; EMAIL=$1;;
- --html) shift; htmlarg=$1;;
- --info) shift; infoarg=$1;;
- --no-ascii) generate_ascii=false;;
- --source) shift; source_extra=$1;;
- --split) shift; split=$1;;
- --texi2html) use_texi2html=1;;
- --no-copy-images) no_copy_images=1;;
- --help) echo "$usage"; exit 0;;
- --version) echo "$version"; exit 0;;
- -*)
- echo "$0: Unknown option \`$1'." >&2
- echo "$0: Try \`--help' for more information." >&2
- exit 1;;
- *)
- if test -z "$PACKAGE"; then
- PACKAGE=$1
- elif test -z "$MANUAL_TITLE"; then
- MANUAL_TITLE=$1
- else
- echo "$0: extra non-option argument \`$1'." >&2
- exit 1
- fi;;
- esac
- shift
-done
-
-# makeinfo uses the dirargs, but texi2dvi doesn't.
-commonarg=" $dirargs $commonarg"
-
-# For most of the following, the base name is just $PACKAGE
-base=$PACKAGE
-
-if test -n "$srcfile"; then
- # but here, we use the basename of $srcfile
- base=`basename "$srcfile"`
- case $base in
- *.txi|*.texi|*.texinfo) base=`echo "$base"|sed 's/\.[texinfo]*$//'`;;
- esac
- PACKAGE=$base
-elif test -s "$srcdir/$PACKAGE.texinfo"; then
- srcfile=$srcdir/$PACKAGE.texinfo
-elif test -s "$srcdir/$PACKAGE.texi"; then
- srcfile=$srcdir/$PACKAGE.texi
-elif test -s "$srcdir/$PACKAGE.txi"; then
- srcfile=$srcdir/$PACKAGE.txi
-else
- echo "$0: cannot find .texinfo or .texi or .txi for $PACKAGE in $srcdir." >&2
- exit 1
-fi
-
-if test ! -r $GENDOCS_TEMPLATE_DIR/gendocs_template; then
- echo "$0: cannot read $GENDOCS_TEMPLATE_DIR/gendocs_template." >&2
- echo "$0: it is available from $templateurl." >&2
- exit 1
-fi
-
-# Function to return size of $1 in something resembling kilobytes.
-calcsize()
-{
- size=`ls -ksl $1 | awk '{print $1}'`
- echo $size
-}
-
-# copy_images OUTDIR HTML-FILE...
-# -------------------------------
-# Copy all the images needed by the HTML-FILEs into OUTDIR. Look
-# for them in the -I directories.
-copy_images()
-{
- test -n "$no_copy_images" && return
- local odir
- odir=$1
- shift
- $PERL -n -e "
-BEGIN {
- \$me = '$prog';
- \$odir = '$odir';
- @dirs = qw($dirs);
-}
-" -e '
-/<img src="(.*?)"/g && ++$need{$1};
-
-END {
- #print "$me: @{[keys %need]}\n"; # for debugging, show images found.
- FILE: for my $f (keys %need) {
- for my $d (@dirs) {
- if (-f "$d/$f") {
- use File::Basename;
- my $dest = dirname ("$odir/$f");
- #
- use File::Path;
- -d $dest || mkpath ($dest)
- || die "$me: cannot mkdir $dest: $!\n";
- #
- use File::Copy;
- copy ("$d/$f", $dest)
- || die "$me: cannot copy $d/$f to $dest: $!\n";
- next FILE;
- }
- }
- die "$me: $ARGV: cannot find image $f\n";
- }
-}
-' -- "$@" || exit 1
-}
-
-case $outdir in
- /*) abs_outdir=$outdir;;
- *) abs_outdir=$srcdir/$outdir;;
-esac
-
-echo "Making output for $srcfile"
-echo " in `pwd`"
-mkdir -p "$outdir/"
-
-cmd="$SETLANG $MAKEINFO -o $PACKAGE.info $commonarg $infoarg \"$srcfile\""
-echo "Generating info... ($cmd)"
-rm -f $PACKAGE.info* # get rid of any strays
-eval "$cmd"
-tar czf "$outdir/$PACKAGE.info.tar.gz" $PACKAGE.info*
-ls -l "$outdir/$PACKAGE.info.tar.gz"
-info_tgz_size=`calcsize "$outdir/$PACKAGE.info.tar.gz"`
-# do not mv the info files, there's no point in having them available
-# separately on the web.
-
-cmd="$SETLANG $TEXI2DVI $dirargs \"$srcfile\""
-printf "\nGenerating dvi... ($cmd)\n"
-eval "$cmd"
-# compress/finish dvi:
-gzip -f -9 $PACKAGE.dvi
-dvi_gz_size=`calcsize $PACKAGE.dvi.gz`
-mv $PACKAGE.dvi.gz "$outdir/"
-ls -l "$outdir/$PACKAGE.dvi.gz"
-
-cmd="$SETLANG $TEXI2DVI --pdf $dirargs \"$srcfile\""
-printf "\nGenerating pdf... ($cmd)\n"
-eval "$cmd"
-pdf_size=`calcsize $PACKAGE.pdf`
-mv $PACKAGE.pdf "$outdir/"
-ls -l "$outdir/$PACKAGE.pdf"
-
-if $generate_ascii; then
- opt="-o $PACKAGE.txt --no-split --no-headers $commonarg"
- cmd="$SETLANG $MAKEINFO $opt \"$srcfile\""
- printf "\nGenerating ascii... ($cmd)\n"
- eval "$cmd"
- ascii_size=`calcsize $PACKAGE.txt`
- gzip -f -9 -c $PACKAGE.txt >"$outdir/$PACKAGE.txt.gz"
- ascii_gz_size=`calcsize "$outdir/$PACKAGE.txt.gz"`
- mv $PACKAGE.txt "$outdir/"
- ls -l "$outdir/$PACKAGE.txt" "$outdir/$PACKAGE.txt.gz"
-fi
-
-# Split HTML at level $2 using program $1. Used for texi2html.
-html_split()
-{
- opt="--split=$2 --node-files $commonarg $htmlarg"
- cmd="$SETLANG $1 --output $PACKAGE.html $opt \"$srcfile\""
- printf "\nGenerating html by $2... ($cmd)\n"
- eval "$cmd"
- split_html_dir=$PACKAGE.html
- (
- cd ${split_html_dir} || exit 1
- if test ! -e index.html; then
- if test -f ${PACKAGE}.html; then
- ln -sf ${PACKAGE}.html index.html
- else
- echo >&2 "$0: ${split_html_dir}/${PACKAGE}.html does not exist"
- fi
- fi
- tar -czf "$abs_outdir/${PACKAGE}.html_$2.tar.gz" -- *.html
- )
- eval html_$2_tgz_size=`calcsize "$outdir/${PACKAGE}.html_$2.tar.gz"`
- rm -f "$outdir"/html_$2/*.html
- mkdir -p "$outdir/html_$2/"
- mv ${split_html_dir}/*.html "$outdir/html_$2/"
- rmdir ${split_html_dir}
-}
-
-if test -z "$use_texi2html"; then
- opt="--no-split --html -o $PACKAGE.html $commonarg $htmlarg"
- cmd="$SETLANG $MAKEINFO $opt \"$srcfile\""
- printf "\nGenerating monolithic html... ($cmd)\n"
- rm -rf $PACKAGE.html # in case a directory is left over
- eval "$cmd"
- html_mono_size=`calcsize $PACKAGE.html`
- gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz"
- html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"`
- copy_images "$outdir/" $PACKAGE.html
- mv $PACKAGE.html "$outdir/"
- ls -l "$outdir/$PACKAGE.html" "$outdir/$PACKAGE.html.gz"
-
- version=`makeinfo --version|sed -n '1s/.* \([0-9][0-9]*\)\.[0-9.]*/\1/p'`
- case $version in
- [0-9]*) ;;
- *) version=4;;
- esac
- # Before Texinfo 5.0, makeinfo did not accept a --split=HOW option,
- # it just always split by node. So if we're splitting by node anyway,
- # leave it out.
- if test $version -lt 5 -o "x$split" != xdefault; then
- split_arg=--split=$split
- opt="--html -o $PACKAGE.html $split_arg $commonarg $htmlarg"
- cmd="$SETLANG $MAKEINFO $opt \"$srcfile\""
- printf "\nGenerating html by $split... ($cmd)\n"
- eval "$cmd"
- split_html_dir=$PACKAGE.html
- copy_images $split_html_dir/ $split_html_dir/*.html
- (
- cd $split_html_dir || exit 1
- tar -czf "$abs_outdir/$PACKAGE.html_$split.tar.gz" -- *
- )
- eval \
- html_${split}_tgz_size=`calcsize "$outdir/$PACKAGE.html_$split.tar.gz"`
- rm -rf "$outdir/html_$split/"
- mv $split_html_dir "$outdir/html_$split/"
- du -s "$outdir/html_$split/"
- ls -l "$outdir/$PACKAGE.html_$split.tar.gz"
- CONDS="/%%IF *HTML_SECTION%%/,/%%ENDIF *HTML_SECTION%%/d;\
- /%%IF *HTML_CHAPTER%%/,/%%ENDIF *HTML_CHAPTER%%/d"
- else
- html_split "$MAKEINFO --html" node
- html_split "$MAKEINFO --html" chapter
- html_split "$MAKEINFO --html" section
- # should take account of --split here.
- CONDS="/%%ENDIF.*%%/d;/%%IF *HTML_SECTION%%/d;/%%IF *HTML_CHAPTER%%/d"
- fi
-else # use texi2html:
- opt="--output $PACKAGE.html $commonarg $htmlarg"
- cmd="$SETLANG $TEXI2HTML $opt \"$srcfile\""
- printf "\nGenerating monolithic html with texi2html... ($cmd)\n"
- rm -rf $PACKAGE.html # in case a directory is left over
- eval "$cmd"
- html_mono_size=`calcsize $PACKAGE.html`
- gzip -f -9 -c $PACKAGE.html >"$outdir/$PACKAGE.html.gz"
- html_mono_gz_size=`calcsize "$outdir/$PACKAGE.html.gz"`
- mv $PACKAGE.html "$outdir/"
-
- html_split "$TEXI2HTML" node
- html_split "$TEXI2HTML" chapter
- html_split "$TEXI2HTML" section
- CONDS="/%%ENDIF.*%%/d;/%%IF *HTML_SECTION%%/d;/%%IF *HTML_CHAPTER%%/d"
-fi
-
-printf "\nMaking .tar.gz for sources...\n"
-d=`dirname $srcfile`
-(
- cd "$d"
- srcfiles=`ls -d *.texinfo *.texi *.txi *.eps $source_extra 2>/dev/null` || true
- tar czfh "$abs_outdir/$PACKAGE.texi.tar.gz" $srcfiles
- ls -l "$abs_outdir/$PACKAGE.texi.tar.gz"
-)
-texi_tgz_size=`calcsize "$outdir/$PACKAGE.texi.tar.gz"`
-
-if test -n "$docbook"; then
- opt="-o - --docbook $commonarg"
- cmd="$SETLANG $MAKEINFO $opt \"$srcfile\" >${srcdir}/$PACKAGE-db.xml"
- printf "\nGenerating docbook XML... ($cmd)\n"
- eval "$cmd"
- docbook_xml_size=`calcsize $PACKAGE-db.xml`
- gzip -f -9 -c $PACKAGE-db.xml >"$outdir/$PACKAGE-db.xml.gz"
- docbook_xml_gz_size=`calcsize "$outdir/$PACKAGE-db.xml.gz"`
- mv $PACKAGE-db.xml "$outdir/"
-
- split_html_db_dir=html_node_db
- opt="$commonarg -o $split_html_db_dir"
- cmd="$DOCBOOK2HTML $opt \"${outdir}/$PACKAGE-db.xml\""
- printf "\nGenerating docbook HTML... ($cmd)\n"
- eval "$cmd"
- (
- cd ${split_html_db_dir} || exit 1
- tar -czf "$abs_outdir/${PACKAGE}.html_node_db.tar.gz" -- *.html
- )
- html_node_db_tgz_size=`calcsize "$outdir/${PACKAGE}.html_node_db.tar.gz"`
- rm -f "$outdir"/html_node_db/*.html
- mkdir -p "$outdir/html_node_db"
- mv ${split_html_db_dir}/*.html "$outdir/html_node_db/"
- rmdir ${split_html_db_dir}
-
- cmd="$DOCBOOK2TXT \"${outdir}/$PACKAGE-db.xml\""
- printf "\nGenerating docbook ASCII... ($cmd)\n"
- eval "$cmd"
- docbook_ascii_size=`calcsize $PACKAGE-db.txt`
- mv $PACKAGE-db.txt "$outdir/"
-
- cmd="$DOCBOOK2PDF \"${outdir}/$PACKAGE-db.xml\""
- printf "\nGenerating docbook PDF... ($cmd)\n"
- eval "$cmd"
- docbook_pdf_size=`calcsize $PACKAGE-db.pdf`
- mv $PACKAGE-db.pdf "$outdir/"
-fi
-
-printf "\nMaking index file...\n"
-
-curdate=`$SETLANG date '+%B %d, %Y'`
-sed \
- -e "s!%%TITLE%%!$MANUAL_TITLE!g" \
- -e "s!%%EMAIL%%!$EMAIL!g" \
- -e "s!%%PACKAGE%%!$PACKAGE!g" \
- -e "s!%%DATE%%!$curdate!g" \
- -e "s!%%HTML_MONO_SIZE%%!$html_mono_size!g" \
- -e "s!%%HTML_MONO_GZ_SIZE%%!$html_mono_gz_size!g" \
- -e "s!%%HTML_NODE_TGZ_SIZE%%!$html_node_tgz_size!g" \
- -e "s!%%HTML_SECTION_TGZ_SIZE%%!$html_section_tgz_size!g" \
- -e "s!%%HTML_CHAPTER_TGZ_SIZE%%!$html_chapter_tgz_size!g" \
- -e "s!%%INFO_TGZ_SIZE%%!$info_tgz_size!g" \
- -e "s!%%DVI_GZ_SIZE%%!$dvi_gz_size!g" \
- -e "s!%%PDF_SIZE%%!$pdf_size!g" \
- -e "s!%%ASCII_SIZE%%!$ascii_size!g" \
- -e "s!%%ASCII_GZ_SIZE%%!$ascii_gz_size!g" \
- -e "s!%%TEXI_TGZ_SIZE%%!$texi_tgz_size!g" \
- -e "s!%%DOCBOOK_HTML_NODE_TGZ_SIZE%%!$html_node_db_tgz_size!g" \
- -e "s!%%DOCBOOK_ASCII_SIZE%%!$docbook_ascii_size!g" \
- -e "s!%%DOCBOOK_PDF_SIZE%%!$docbook_pdf_size!g" \
- -e "s!%%DOCBOOK_XML_SIZE%%!$docbook_xml_size!g" \
- -e "s!%%DOCBOOK_XML_GZ_SIZE%%!$docbook_xml_gz_size!g" \
- -e "s,%%SCRIPTURL%%,$scripturl,g" \
- -e "s!%%SCRIPTNAME%%!$prog!g" \
- -e "$CONDS" \
-$GENDOCS_TEMPLATE_DIR/gendocs_template >"$outdir/index.html"
-
-echo "Done, see $outdir/ subdirectory for new files."
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/doc/gendocs_template b/doc/gendocs_template
deleted file mode 100644
index 5c63d20..0000000
--- a/doc/gendocs_template
+++ /dev/null
@@ -1,71 +0,0 @@
-<!-- -*- html -*- -->
-<!--#include virtual="inc/pagehdr.html" -->
-<!--#include virtual="inc/header.html" -->
-<ul class='tabs'>
- <li><a href="%%PACKAGE%%.html">Main</a></li>
- <li><a href="download.html">Downloads</a></li>
- <li><a class="active" href="manual.html">Documentation</a></li>
-</ul>
-
-<div id="main">
-<p>The manual for <b>%%PACKAGE%%</b> is available in the following formats:</p>
-
-<ul>
- <li><a href="manual/%%PACKAGE%%.html">HTML
- (%%HTML_MONO_SIZE%%K bytes)</a> - entirely on one web page.</li>
- <li><a href="manual/html_node/index.html">HTML</a> - with one web page per
- node.</li>
-%%IF HTML_SECTION%%
- <li><a href="manual/html_section/index.html">HTML</a> - with one web page per
- section.</li>
-%%ENDIF HTML_SECTION%%
-%%IF HTML_CHAPTER%%
- <li><a href="manual/html_chapter/index.html">HTML</a> - with one web page per
- chapter.</li>
-%%ENDIF HTML_CHAPTER%%
- <li><a href="manual/%%PACKAGE%%.html.gz">HTML compressed
- (%%HTML_MONO_GZ_SIZE%%K gzipped characters)</a> - entirely on
- one web page.</li>
- <li><a href="manual/%%PACKAGE%%.html_node.tar.gz">HTML compressed
- (%%HTML_NODE_TGZ_SIZE%%K gzipped tar file)</a> -
- with one web page per node.</li>
-%%IF HTML_SECTION%%
- <li><a href="manual/%%PACKAGE%%.html_section.tar.gz">HTML compressed
- (%%HTML_SECTION_TGZ_SIZE%%K gzipped tar file)</a> -
- with one web page per section.</li>
-%%ENDIF HTML_SECTION%%
-%%IF HTML_CHAPTER%%
- <li><a href="manual/%%PACKAGE%%.html_chapter.tar.gz">HTML compressed
- (%%HTML_CHAPTER_TGZ_SIZE%%K gzipped tar file)</a> -
- with one web page per chapter.</li>
-%%ENDIF HTML_CHAPTER%%
- <li><a href="manual/%%PACKAGE%%.info.tar.gz">Info document
- (%%INFO_TGZ_SIZE%%K characters gzipped tar file)</a>.</li>
- <li><a href="manual/%%PACKAGE%%.txt">ASCII text
- (%%ASCII_SIZE%%K characters)</a>.</li>
- <li><a href="manual/%%PACKAGE%%.txt.gz">ASCII text compressed
- (%%ASCII_GZ_SIZE%%K gzipped characters)</a>.</li>
- <li><a href="manual/%%PACKAGE%%.dvi.gz">TeX dvi file
- (%%DVI_GZ_SIZE%%K characters gzipped)</a>.</li>
- <li><a href="manual/%%PACKAGE%%.pdf">PDF file
- (%%PDF_SIZE%%K characters)</a>.</li>
- <li><a href="manual/%%PACKAGE%%.texi.tar.gz">Texinfo source
- (%%TEXI_TGZ_SIZE%%K characters gzipped tar file)</a></li>
- <li><a href="http://man.gnu.org.ua/manpage/?3+gdbm">gdbm(3) manpage</a></li>
- <li><a href="http://man.gnu.org.ua/manpage/?1+gdbm_dump">gdbm_dump(1) manpage</a></li>
- <li><a href="http://man.gnu.org.ua/manpage/?1+gdbm_load">gdbm_load(1) manpage</a></li>
- <li><a href="http://man.gnu.org.ua/manpage/?1+gdbmtool">gdbmtool(1) manpage</a></li>
-
-</ul>
-
-</div>
-
-<div class="generator">
-<p>(This page is generated by the <a
-href="%%SCRIPTURL%%">%%SCRIPTNAME%%</a> script.)
-</p>
-</div>
-
-<!--#include virtual="inc/footer.html" -->
-</body>
-</html>
diff --git a/doc/html.init b/doc/html.init
deleted file mode 100644
index 5e0e6fe..0000000
--- a/doc/html.init
+++ /dev/null
@@ -1,164 +0,0 @@
-# Texi2any configuration for gdbm documentation. -*- perl -*-
-# Copyright (C) 2011, 2015 Sergey Poznyakoff
-#
-# Gdbm is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# Gdbm is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with Gdbm. If not, see <http://www.gnu.org/licenses/>.
-use strict;
-
-my $top_html_dir="/software/gdbm";
-my $graphics_dir="$top_html_dir/graphics";
-
-# Show TOC in place of the @contents directive.
-set_from_init_file('INLINE_CONTENTS', 1);
-# Do not show Texinfo menus.
-set_from_init_file('SHOW_MENU', 0);
-# Inhibit output of CSS lines in page headers.
-set_from_init_file('CSS_LINES', '');
-
-set_from_init_file('BODYTEXT', "");
-
-set_from_init_file('EXTRA_HEAD', "\
- <link rev=\"made\" href=\"mailto:gray\@gnu.org.ua\">\
- <link rel=\"stylesheet\" type=\"text/css\" href=\"${top_html_dir}/gray.css\">\
- <link rel=\"stylesheet\" type=\"text/css\" href=\"${top_html_dir}/texi.css\">\
- <link rel=\"icon\" type=\"image/png\" href=\"/graphics/gnu-head-icon.png\">");
-
-set_from_init_file('AFTER_BODY_OPEN', qq{
-<!--#include virtual=\"${top_html_dir}/inc/header.html\" -->
-<ul class='tabs'>
- <li><a href="${top_html_dir}/gdbm.html">Main</a></li>
- <li><a href="${top_html_dir}/download.html">Downloads</a></li>
- <li><a class="active" href="${top_html_dir}/manual.html">Documentation</a></li>
-</ul>
-});
-
-sub gray_end_file($)
-{
- my $self = shift;
- my $program_text = '';
- if ($self->get_conf('PROGRAM_NAME_IN_FOOTER')) {
- my $program_string = &{$self->{'format_program_string'}}($self);
- $program_text = "<p>
- $program_string
-</p>";
- }
- my $pre_body_close = $self->get_conf('PRE_BODY_CLOSE');
- $pre_body_close = '' if (!defined($pre_body_close));
- return "</div>
-<div class=\"copyright\">
-$program_text
-
-$pre_body_close
-</div>
-</div>
-</body>
-</html>
-";
-}
-
-texinfo_register_formatting_function('end_file', \&gray_end_file);
-
-set_from_init_file('PRE_BODY_CLOSE',
- 'Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.');
-
-# Print generating program name at the bottom of a page.
-set_from_init_file('PROGRAM_NAME_IN_FOOTER',1);
-
-# Disable horizontal bars
-set_from_init_file('DEFAULT_RULE', '');
-set_from_init_file('BIG_RULE', '');
-
-# Turn off navigation bars at the bottom of each section in chapter split mode,
-# or subsection in section split mode.
-set_from_init_file('HEADERS', undef)
- if ((get_conf('SPLIT') eq 'chapter') or (get_conf('SPLIT') eq 'section'));
-# Use navigation icons
-
-set_from_init_file('ICONS', 1);
-
-set_from_init_file('ACTIVE_ICONS',
- {
- 'Top' => "$graphics_dir/top.png",
- 'Contents' => "$graphics_dir/ctx.png",
- 'Overview' => '',
- 'Index' => "$graphics_dir/idx.png",
- 'This' => '',
- 'Back' => "$graphics_dir/left.png",
- 'FastBack' => "$graphics_dir/bwd.png",
- 'Prev' => "",
- 'Up' => "$graphics_dir/up.png",
- 'Next' => "$graphics_dir/right.png",
- 'NodeUp' => "$graphics_dir/left.png",
- 'NodeNext' => "$graphics_dir/up.png",
- 'NodePrev' => "$graphics_dir/right.png",
- 'Following' => "$graphics_dir/right.png",
- 'Forward' => "$graphics_dir/right.png",
- 'FastForward' => "$graphics_dir/fwd.png",
- 'About' => '',
- 'First' => '',
- 'Last' => '',
- ' ' => ''
- });
-
-sub gray_split_status()
-{
- my $split = get_conf('SPLIT');
- if ($split eq '') {
- return '';
- } elsif ($split eq 'node') {
- return ' <span class="splitstatus">(split by node)</span>';
- } elsif ($split eq 'section') {
- return ' <span class="splitstatus">(split by section)</span>';
- } elsif ($split eq 'chapter') {
- return ' <span class="splitstatus">(split by chapter)</span>';
- }
-}
-
-sub gray_document_title($$)
-{
- my $self = shift;
- my $direction = shift;
- my $status = gray_split_status();
-
- return q{<span class="title">} . $self->{title_string} . '</span>' .$status . q{<span class="title">:</span>};
-}
-
-sub gray_sec_ref($$)
-{
- return q{<span class="navtext">Section:</span>};
-}
-
-sub gray_chap_ref($$)
-{
- return q{<span class="navtext">Chapter:</span>};
-}
-
-
-my @gray_buttons = (\&gray_document_title, ' ',
- \&gray_sec_ref, 'Back', 'Forward', ' ',
- \&gray_chap_ref,
- 'FastBack', ' ', 'Up', ' ', 'FastForward', ' ',
- 'Contents', 'Index' );
-
-set_from_init_file('TOP_BUTTONS', undef);
-set_from_init_file('SECTION_BUTTONS', \@gray_buttons);
-set_from_init_file('CHAPTER_BUTTONS', \@gray_buttons);
-set_from_init_file('NODE_FOOTER_BUTTONS', \@gray_buttons);
-set_from_init_file('SECTION_FOOTER_BUTTONS', \@gray_buttons);
-set_from_init_file('MISC_BUTTONS',
- [\&gray_document_title,
- 'Contents',
- 'Index',
- ' ',
- 'About'
- ]);
diff --git a/doc/otherdoc.texi.in b/doc/otherdoc.texi.in
new file mode 100644
index 0000000..fc6ed08
--- /dev/null
+++ b/doc/otherdoc.texi.in
@@ -0,0 +1,9 @@
+@multitable @columnfractions 0.30 .5
+@item @uref{../$FILE(info_gz),$BASEFILE(info_gz)} @tab Info document compressed ($SIZE(info_gz) characters gzipped tar file)
+@item @uref{../$FILE(ascii),$BASEFILE(ascii)} @tab ASCII text ($SIZE(ascii) characters)
+@item @uref{../$FILE(ascii_gz),$BASEFILE(ascii_gz)} @tab ASCII text, compressed ($SIZE(ascii_gz) characters)
+@item @uref{../$FILE(dvi_gz),$BASEFILE(dvi_gz)} @tab TeX dvi file ($SIZE(dvi_gz) characters gzipped)
+@item @uref{../$FILE(pdf),$BASEFILE(pdf)} @tab PDF file ($SIZE(pdf) characters gzipped)
+@item @uref{../$FILE(texinfo_gz),$BASEFILE(texinfo_gz)} @tab Texinfo source ($SIZE(texinfo_gz) characters gzipped tar file)
+@end multitable
+
diff --git a/doc/webdoc.init b/doc/webdoc.init
new file mode 100644
index 0000000..0990b4d
--- /dev/null
+++ b/doc/webdoc.init
@@ -0,0 +1,8 @@
+use strict;
+use warnings;
+set_from_init_file('EXTRA_HEAD', qq{
+<link rel="stylesheet" type="text/css" href="css/info.css"/>
+<link rel="stylesheet" type="text/css" href="css/gdbm.css"/>
+<script src="js/modernizr.js" type="text/javascript"></script>
+<script src="js/info.js" type="text/javascript"></script>
+});