aboutsummaryrefslogtreecommitdiff
path: root/pkg/system/help/xhelp/xhofile.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/system/help/xhelp/xhofile.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'pkg/system/help/xhelp/xhofile.x')
-rw-r--r--pkg/system/help/xhelp/xhofile.x188
1 files changed, 188 insertions, 0 deletions
diff --git a/pkg/system/help/xhelp/xhofile.x b/pkg/system/help/xhelp/xhofile.x
new file mode 100644
index 00000000..c12ea7d3
--- /dev/null
+++ b/pkg/system/help/xhelp/xhofile.x
@@ -0,0 +1,188 @@
+# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+
+include <fset.h>
+include "xhelp.h"
+
+
+# XH_OPEN_FILE -- Open the named file and send it to the GUI. If this is
+# a help document (i.e. it contains a ".help" block) we first convert it
+# to HTML, otherwise send it as is.
+
+procedure xh_open_file (xh, parameter, filename, check_for_help, warn)
+
+pointer xh # task descriptor
+char parameter[ARB] # GUI parameter to notify
+char filename[ARB] # file to open
+int check_for_help # check file for help block?
+int warn # warn if not present?
+
+pointer sp, ip, buf, out, text
+int fdi, fdo
+long fsize
+bool has_help
+
+int access(), open(), getline()
+int strmatch(), gstrcpy()
+long fstatl()
+errchk open
+
+define err_ 99
+
+begin
+ call smark (sp)
+ call salloc (buf, SZ_LINE, TY_CHAR)
+ call salloc (out, SZ_FNAME, TY_CHAR)
+
+ # Make sure the file exists.
+ if (access (filename, 0, 0) == NO) {
+ if (warn == YES) {
+ call sprintf (Memc[buf], SZ_LINE, "File does not exist:\n`%s'.")
+ call pargstr (filename)
+ call gmsg (XH_GP(xh), "alert", Memc[buf])
+ }
+ goto err_
+ } else if (access (filename, 0, BINARY_FILE) == YES) {
+ if (warn == YES) {
+ call sprintf (Memc[buf], SZ_LINE,
+ "Attempt to load binary file:\n`%s'.")
+ call pargstr (filename)
+ call gmsg (XH_GP(xh), "alert", "pop")
+ call gmsg (XH_GP(xh), "alert", Memc[buf])
+ }
+ goto err_
+ }
+
+ # If we're told not to look for help simply open the file and send
+ # it to the GUI (e.g. used for homepage and online help).
+ if (check_for_help == NO) {
+ call xh_load_file (xh, parameter, filename)
+ call sfree (sp)
+ return
+ }
+
+ # Open the file.
+ iferr (fdi = open (filename, READ_ONLY, TEXT_FILE)) {
+ if (warn == YES) {
+ call sprintf (Memc[buf], SZ_LINE, "Cannot open file\n`%s'.")
+ call pargstr (filename)
+ call gmsg (XH_GP(xh), "alert", Memc[buf])
+ }
+ goto err_
+ }
+
+ # Allocate an array the length of the file, if this isn't a help file
+ # we use this as the message buffer and send it to the GUI.
+ fsize = fstatl (fdi, F_FILESIZE)
+ call salloc (text, fsize+1, TY_CHAR)
+ call aclrc (Memc[text], fsize+1)
+
+ # See whether this is a help file
+ has_help = FALSE
+ ip = text
+ while (getline (fdi, Memc[buf]) != EOF) {
+ if (strmatch (Memc[buf], "^.help") > 0) {
+ has_help = TRUE
+ break
+ }
+ ip = ip + gstrcpy (Memc[buf], Memc[ip], SZ_LINE)
+ }
+ Memc[ip] = EOS
+
+
+ # If the file was found to have a .help block we're positioned at
+ # the beginning of the block. Convert the remainder to an HTML
+ # temp file and send that to the GUI, otherwise we already have the
+ # contents of the file in the text buffer so send that.
+ if (has_help) {
+ # Create an output filename and open it for writing.
+ call mktemp ("tmp$xhelpi", Memc[out], SZ_FNAME)
+ fdo = open (Memc[out], NEW_FILE, TEXT_FILE)
+
+ # Convert the remainder to HTML and send it to the GUI.
+ if (fdo != ERR) {
+ call lroff2html (fdi, fdo, filename, "", "", "", "")
+ call close (fdo)
+
+ call xh_load_file (xh, "helpres", Memc[out])
+ call delete (Memc[out])
+ }
+
+ } else {
+ # No help was found, send the contents straight to the display.
+ call xh_text_msg (XH_GP(xh), "helpres", Memc[text])
+ }
+
+
+err_ if (fdi != ERR)
+ call close (fdi)
+ call sfree (sp)
+end
+
+
+# XH_LOAD_FILE -- Load the named file in the GUI.
+
+procedure xh_load_file (xh, parameter, filename)
+
+pointer xh # task descriptor
+char parameter[ARB] # GUI parameter to notify
+char filename[ARB] # file to display
+
+pointer sp, ip, line, text
+int fd, open(), getline(), gstrcpy()
+long fsize, fstatl()
+errchk open
+
+begin
+ call smark (sp)
+ call salloc (line, SZ_LINE, TY_CHAR)
+
+ # Open the file and send it to the display.
+ fd = open (filename, READ_ONLY, TEXT_FILE)
+ if (fd != ERR) {
+ fsize = fstatl (fd, F_FILESIZE)
+ call salloc (text, fsize+1, TY_CHAR)
+ call aclrc (Memc[text], fsize+1)
+
+ for (ip=text; getline (fd, Memc[line]) != EOF; )
+ ip = ip + gstrcpy (Memc[line], Memc[ip], SZ_LINE)
+
+ Memc[ip] = EOS
+ call close (fd)
+
+ call xh_text_msg (XH_GP(xh), parameter, Memc[text])
+ }
+
+ call sfree (sp)
+end
+
+
+# XH_TEXT_MSG -- Send a text message to a named UI parameter but first
+# escape all curly braces so it passes through the Tcl correctly.
+
+procedure xh_text_msg (gp, param, msg)
+
+pointer gp
+char param[ARB], msg[ARB]
+
+pointer buf, ip
+int i, nchars
+int strlen()
+
+begin
+ nchars = strlen (msg)
+ call calloc (buf, nchars + SZ_LINE, TY_CHAR)
+
+ ip = buf
+ for (i=1; i < nchars; i=i+1) {
+ if (msg[i] == '{' || msg[i] == '}') {
+ Memc[ip] = '\\'
+ ip = ip + 1
+ }
+ Memc[ip] = msg[i]
+ ip = ip + 1
+ }
+
+ call gmsg (gp, "type", "file")
+ call gmsg (gp, param, Memc[buf])
+ call mfree (buf, TY_CHAR)
+end