aboutsummaryrefslogtreecommitdiff
path: root/pkg/system/help/xhelp/xhqref.x
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/system/help/xhelp/xhqref.x')
-rw-r--r--pkg/system/help/xhelp/xhqref.x250
1 files changed, 250 insertions, 0 deletions
diff --git a/pkg/system/help/xhelp/xhqref.x b/pkg/system/help/xhelp/xhqref.x
new file mode 100644
index 00000000..51912169
--- /dev/null
+++ b/pkg/system/help/xhelp/xhqref.x
@@ -0,0 +1,250 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <syserr.h>
+include <finfo.h>
+include <ctype.h>
+include "../help.h"
+include "xhelp.h"
+
+define MAX_PKGS 200
+define SZ_PKG 32
+define EXTPKG "hlib$extern.pkg"
+
+
+# XH_UPDT_QUICKREF -- Update a quick reference file for the help database
+# if needed.
+
+procedure xh_updt_quickref (xh)
+
+pointer xh
+
+long fiq[LEN_FINFO], fie[LEN_FINFO]
+
+int access()
+long finfo()
+errchk access, finfo
+
+begin
+ # If the quickref file exists, and it is older than the
+ # hlib$extern.pkg file which defines the helpdb rebuild
+ # the quickref file so we're current, otherwise rebuild
+ # the quickref file anyway.
+ if ((access (QUICKREF(xh), 0, 0) == NO) ||
+ (access (PKGFILE, 0, 0) == NO)) {
+ call xh_make_quickref (xh, QUICKREF(xh))
+ } else {
+ if (finfo (QUICKREF(xh), fiq) == ERR)
+ call filerr (QUICKREF(xh), SYS_FOPNNEXFIL)
+ if (finfo (EXTPKG, fie) == ERR)
+ call filerr (EXTPKG, SYS_FOPNNEXFIL)
+
+ if (FI_MTIME[fie] > FI_MTIME[fiq]) {
+ call delete (QUICKREF(xh))
+ call xh_make_quickref (xh, QUICKREF(xh))
+ }
+ }
+end
+
+
+# XH_MAKE_QUICKREF -- Make a quick reference file for the help database.
+
+procedure xh_make_quickref (xh, quickref)
+
+pointer xh #i task struct pointer
+char quickref[ARB] #i quickref filename
+
+pointer pkglist, pp
+int fdi, fdo, fd_err
+int sz_pbuf, npkgs
+char fname[SZ_FNAME], efname[SZ_FNAME]
+char pkg[SZ_PKG], lastpkg[SZ_PKG], line[SZ_LINE]
+
+int open(), access(), getline(), gstrcpy(), strsearch(), strcmp()
+errchk open
+
+begin
+ # Tell the GUI we're actually busy doing something....
+ call gmsg (XH_GP(xh), "alert",
+ "Please wait,\ngenerating QuickRef file...")
+ call gflush (XH_GP(xh))
+
+ # Open the STDERR stream onto a dummy file to catch any
+ # "no help available" messages that may interfere with the
+ # textout GUI parameter.
+ call mktemp ("tmp$xerr", efname, SZ_FNAME)
+ fd_err = open (efname, NEW_FILE, TEXT_FILE)
+ call frediro (STDERR, fd_err)
+
+ # Open a temp file with the raw search information.
+ call mktemp ("tmp$xhelpq", fname, SZ_FNAME)
+ fdi = open (fname, NEW_FILE, TEXT_FILE)
+
+ call xh_get_help (fdi, "[a-z]*.", "", "", HF_HTML, HELPDB(xh), "help",
+ "references")
+ call close (fdi)
+
+ # Close the error file, swap back the descriptors first and delete it.
+ call fswapfd (STDERR, fd_err)
+ call close (fd_err)
+ call delete (efname)
+
+ # Delete existing files.
+ if (access (quickref, 0, 0) == YES)
+ call delete (quickref)
+
+ # Open the references file.
+ iferr (fdo = open (quickref, NEW_FILE, TEXT_FILE)) {
+ call sprintf (line, SZ_LINE, "Cannot create quickref file `%s'.")
+ call pargstr (quickref)
+ call error (0, line)
+ }
+ fdi = open (fname, READ_ONLY, TEXT_FILE)
+
+ # Initialize for the package list.
+ pkg[1] = EOS
+ lastpkg[1] = EOS
+ npkgs = 0
+ sz_pbuf = MAX_PKGS * SZ_PKG
+ call malloc (pkglist, sz_pbuf, TY_CHAR)
+ pp = pkglist
+
+ # Loop over the lines in the file, save the ones that are the
+ # descriptions. Descriptions are assumed to contain a '-' since
+ # this is standard for .men files, to be safe we also required
+ # the bracketed package name generated with a 'references' query.
+ # The package name is used to create the package list symtab we
+ # use to show the item as a task or package.
+
+ while (getline(fdi,line) != EOF) {
+ if (strsearch (line, " - ") != 0 && strsearch (line, "[") != 0) {
+ call putline (fdo, line)
+
+ # Extract the package name. The results aren't sorted at
+ # this point so we see whether this package is the same as
+ # the last before adding it to the package list. This
+ # gives us a unique list of unsorted package names.
+
+ call xh_gname (line, pkg)
+ if (lastpkg[1] == EOS)
+ call strcpy (pkg, lastpkg, SZ_PKG)
+ if (strcmp (pkg, lastpkg) != 0) {
+ npkgs = npkgs + 1
+
+ # Protect against overflowing the buffer.
+ if ((pp - pkglist) > sz_pbuf)
+ call error (1, "Package buffer overflow.")
+
+ pp = pp + gstrcpy (pkg, Memc[pp], SZ_PKG)
+ pp = pp + gstrcpy (" ", Memc[pp], SZ_PKG)
+ call strcpy (pkg, lastpkg, SZ_PKG)
+ }
+ }
+ }
+ Memc[pp] = EOS
+
+ # Close the new references file.
+ call close (fdo)
+
+ # Close and delete the references temp files.
+ call close (fdi)
+ call delete (fname)
+
+ # Sort the lines of the references file.
+ call xh_file_sort (quickref)
+
+ # Now send the package list off to be stored for the next time.
+ call xh_make_pkglist (Memc[pkglist])
+
+ call mfree (pkglist, TY_CHAR)
+
+ # Tell the GUI we're done.
+ call gmsg (XH_GP(xh), "alert", "dismiss")
+ call gflush (XH_GP(xh))
+end
+
+
+# XH_MAKE_PKGLIST -- Update the package symtab file. We are only called
+# when updating the quickref database so delete any existing file before
+# writing the new one.
+
+procedure xh_make_pkglist (list)
+
+char list[ARB] #i package list
+
+pointer sp, err, pkg
+pointer stp, sym
+int i, ip, fd
+
+pointer stopen(), stenter()
+int open(), access(), strlen()
+errchk open
+
+begin
+ call smark (sp)
+ call salloc (err, SZ_LINE, TY_CHAR)
+ call salloc (pkg, SZ_FNAME, TY_CHAR)
+
+ # Delete existing files.
+ if (access(PKGFILE,0,0) == YES)
+ call delete (PKGFILE)
+
+ # Open the package symtab file.
+ iferr (fd = open (PKGFILE, NEW_FILE, BINARY_FILE)) {
+ call sprintf (Memc[err], SZ_LINE, "Can't create pkg symtab `%s'.")
+ call pargstr (PKGFILE)
+ call error (0, Memc[err])
+ }
+
+ # Sort the list before making the symtab.
+ call xh_sort_list (list)
+
+ # Open the symtab.
+ stp = stopen ("package list", LEN_INDEX, LEN_STAB, SZ_SBUF)
+
+ # Enter strings in the symtab.
+ i = 0
+ for (ip=1; list[ip] != EOS; ip=ip+1) {
+ if (list[ip] == ' ') {
+ Memc[pkg+i] = EOS
+ sym = stenter (stp, Memc[pkg], strlen (Memc[pkg]) + 1)
+ i = 0
+ ip = ip + 1
+ }
+ Memc[pkg+i] = list[ip]
+ i = i + 1
+ }
+
+ # Save the symtab file.
+ call stsqueeze (stp)
+ call stsave (stp, fd)
+
+ # Clean up.
+ call stclose (stp)
+ call close (fd)
+ call sfree (sp)
+end
+
+
+# XH_GNAME -- Extract the package name from a 'references' line.
+
+procedure xh_gname (line, pkg)
+
+char line[ARB] #i references line
+char pkg[ARB] #o package name in line
+
+int ip, strlen()
+
+begin
+ # Clear trailing whitespace back to the ']' at end of the
+ # package name.
+ for (ip=strlen(line); line[ip] != ']' || IS_WHITE(line[ip]); )
+ ip = ip - 1
+ line[ip] = EOS
+
+ # Move back to starting '[' of package name.
+ while (line[ip] != '[' && ip > 0)
+ ip = ip - 1
+
+ # What's left is the package name, copy it to the output.
+ call strcpy (line[ip+1], pkg, SZ_PKG)
+end