1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
include <ttyset.h>
include <error.h>
include "help.h"
# PR_DIRECTORY -- Print a directory of the help blocks for a package.
# Extract the names of all the modules therein into a string buffer
# and print it as a table.
define SZ_OBUF 2048 # buffer for directory
define MAX_MODULES 500 # max modules that can be sorted
define MAX_NAMELEN 20 # max chars in a module name
define FIRST_COL 6
define exit_ 90
procedure pr_directory (db, hp, pakname, paknum, ctrl)
pointer db # help database descriptor
pointer hp # root help directory
char pakname[ARB] # name of package
int paknum # package number in root directory
pointer ctrl # help control params
bool multiple_directories
int m, fd
pointer sp, indices, hdr, fname, hp_pak, lbuf, obuf
int hd_getname(), ttystati(), stropen(), getline()
pointer hdb_load()
errchk hd_getname, ttystati
begin
call smark (sp)
call salloc (indices, MAX_MODULES, TY_POINTER)
call salloc (fname, SZ_FNAME, TY_CHAR)
call salloc (hdr, SZ_FNAME, TY_CHAR)
call salloc (obuf, SZ_OBUF, TY_CHAR)
call salloc (lbuf, SZ_LINE, TY_CHAR)
# Get the filename of the help directory for the package.
if (hd_getname (hp,paknum,TY_PKG,Memc[fname],SZ_FNAME) == 0) {
call eprintf ("No help available for package `%s'\n")
call pargstr (pakname)
goto exit_
}
# Open the help directory for the package.
iferr (hp_pak = hdb_load (db, Memc[fname])) {
call sfree (sp)
call erract (EA_WARN)
goto exit_
}
# Extract the names of the modules in the package. Save the pointers
# in an array for the table print routine.
for (m=0; m < MAX_MODULES; m=m+1) {
call salloc (Memi[indices+m], MAX_NAMELEN, TY_CHAR)
if (hd_getname (hp_pak, m+1, TY_MODNAME, Memc[Memi[indices+m]],
MAX_NAMELEN) == 0)
break
}
# If the template supplied by the user specified more than a single
# package, print the name of the package.
multiple_directories = (H_LENTL(ctrl) > 1)
# We may have been called with any legal abbreviation of the package
# name; fetch the full name from the system package directory.
if (multiple_directories) {
call houtput (ctrl, "\n")
if (hd_getname (hp, paknum, TY_MODNAME, Memc[hdr], SZ_FNAME) != 0) {
call strcat (":\n", Memc[hdr], SZ_FNAME)
call houtput (ctrl, Memc[hdr])
}
}
# Now print the table. It is not necessary to sort the table,
# because the "helpdir" code (which reads the help directory) has
# already done so. The directory is written into a string buffer
# and then output line by line with houtput, since there is no
# easy way to make STRTBL call houtput.
# Format the table into the buffer. A blank line marks the end of
# the table.
fd = stropen (Memc[obuf], SZ_OBUF, NEW_FILE)
call strtbl (fd, Memc, Memi[indices], m, FIRST_COL,
ttystati (H_TTY(ctrl), TTY_NCOLS), MAX_NAMELEN, 0)
call putline (fd, "\n")
call close (fd)
# Copy lines from the buffer to the HELP output. Do not read off
# end of buffer or FIO will file fault and abort.
fd = stropen (Memc[obuf], SZ_OBUF, READ_ONLY)
while (getline (fd, Memc[lbuf]) > 1)
call houtput (ctrl, Memc[lbuf])
call close (fd)
call hdb_free (db, hp_pak)
exit_
call sfree (sp)
end
|