From fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Wed, 8 Jul 2015 20:46:52 -0400 Subject: Initial commit --- pkg/system/help/xhelp/xhsearch.x | 185 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 pkg/system/help/xhelp/xhsearch.x (limited to 'pkg/system/help/xhelp/xhsearch.x') diff --git a/pkg/system/help/xhelp/xhsearch.x b/pkg/system/help/xhelp/xhsearch.x new file mode 100644 index 00000000..18f1aa28 --- /dev/null +++ b/pkg/system/help/xhelp/xhsearch.x @@ -0,0 +1,185 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include +include +include "xhelp.h" + + +# XH_SEARCH -- Given a search pattern generate a list of tasks matching the +# pattern. + +procedure xh_search (xh, exact_match, pattern) + +pointer xh #i task struct pointer +int exact_match #i require an exact match? +char pattern[ARB] #i search pattern + +pointer sp, lfile, line, helpstr, item +pointer tp, lp, pat +char task[SZ_FNAME], pkg[SZ_FNAME], desc[SZ_FNAME] +int i, ip, fd, fdl +long fsize + +long fstatl() +int open(), xh_match(), getline(), gstrcpy() +errchk open, xh_updt_quickref + +begin + call smark (sp) + call salloc (lfile, SZ_FNAME, TY_CHAR) + call salloc (line, SZ_LINE, TY_CHAR) + call salloc (item, SZ_LINE, TY_CHAR) + call salloc (pat, SZ_FNAME, TY_CHAR) + + # Open the quick reference file. + iferr (fd = open (QUICKREF(xh), READ_ONLY, TEXT_FILE)) + call error (0, "Cannot open quick-reference file.") + + # Open the temp file for the matched lines. + call mktemp ("tmp$xhelpq", Memc[lfile], SZ_FNAME) + fdl = open (Memc[lfile], NEW_FILE, TEXT_FILE) + + # Allocate space for the results string. + fsize = fstatl (fd, F_FILESIZE) + + # Check pattern for multi-word searches. + call aclrc (Memc[pat], SZ_FNAME) + for (ip=1; IS_WHITE(pattern[ip]); ip=ip+1) + ; + if (pattern[ip] == '{') { + ip = ip + 1 + for (i=0; pattern[ip] != '}'; ip=ip+1) { + Memc[pat+i] = pattern[ip] + i = i + 1 + } + } else + call strcpy (pattern[ip], Memc[pat], SZ_FNAME) + + # Loop over the lines in the file and match the pattern. + while (getline(fd,Memc[line]) != EOF) { + if (xh_match (Memc[line], Memc[pat], exact_match) != 0) + call putline (fdl, Memc[line]) # save it to the file + } + call close (fdl) + call close (fd) + + # Now read back the file to see if we matched anything, and so we + # can parse the file for task/package names. + fdl = open (Memc[lfile], READ_ONLY, TEXT_FILE) + fsize = fstatl (fdl, F_FILESIZE) + + # See whether we got anything, if not return. + if (fsize == 0) { + call sprintf (Memc[line], SZ_LINE, + "No help available for\npattern `%s'.") + call pargstr (Memc[pat]) + call gmsg (XH_GP(xh), "alert", Memc[line]) + + call close (fdl) + call delete (Memc[lfile]) + call sfree (sp) + return + } + call calloc (helpstr, 5*fsize, TY_CHAR) + + # Read back the sorted list, separate the task name, package, and + # descriptions and format it for the GUI. + tp = helpstr + tp = tp + gstrcpy ("
", Memc[tp], ARB)
+	while (getline(fdl, Memc[line]) != EOF) {
+	    Memc[item] = EOS
+	    lp = line
+
+	    # Get the task name.
+	    for (i=1; !IS_WHITE(Memc[lp]); i=i+1) {
+		task[i] = Memc[lp]
+		lp = lp + 1
+		if (Memc[lp] == EOS || i >= SZ_FNAME)
+		    break 
+	    }
+	    task[i] = EOS
+
+	    # Skip delimiter.
+	    while (IS_WHITE(Memc[lp]) || Memc[lp] == '-') 
+		lp = lp + 1
+
+	    # Get the description up to the '[' package name.
+	    for (i=1; Memc[lp] != '['; i=i+1) {
+		desc[i] = Memc[lp]
+		lp = lp + 1
+		if (Memc[lp] == EOS || i >= SZ_FNAME)
+		    break 
+	    }
+	    desc[i] = EOS
+
+	    # Get the package name up to the ']' delimiter.
+	    if (Memc[lp] != EOS) {
+		lp = lp + 1
+	        for (i=1; Memc[lp] != ']'; i=i+1) {
+		    pkg[i] = Memc[lp]
+		    lp = lp + 1
+		    if (Memc[lp] == '\n' || Memc[lp] == EOS || i >= SZ_FNAME)
+		        break 
+	        }
+	    }
+	    pkg[i] = EOS
+
+	    call sprintf(Memc[item], SZ_LINE, "%10.10s ")
+		call pargstr (pkg)
+		call pargstr (task)
+		call pargstr (task)
+	    tp = tp + gstrcpy (Memc[item], Memc[tp], ARB)
+	    call sprintf(Memc[item], SZ_LINE, "%10.10s ")
+		call pargstr (pkg)
+		call pargstr (pkg)
+		call pargstr (pkg)
+	    tp = tp + gstrcpy (Memc[item], Memc[tp], ARB)
+	    call sprintf(Memc[item], SZ_LINE, "  %s\n")
+		call pargstr (desc)
+	    tp = tp + gstrcpy (Memc[item], Memc[tp], ARB)
+	}
+	call strcat ("
\n", Memc[tp], SZ_LINE) + Memc[tp] = EOS + call close (fdl) + + # Send it to the GUI. + call gmsg (XH_GP(xh), "apropos", Memc[helpstr]) + + # Clean up. + call delete (Memc[lfile]) + call mfree (helpstr, TY_CHAR) + call sfree (sp) +end + + +# XH_MATCH -- Match any or all words in a pattern against the given line. +# We can either look for an exact match or just the occurence of one word +# in the pattern. + +int procedure xh_match (line, pattern, exact_match) + +char line[ARB] #i line to be matched +char pattern[ARB] #i pattern words +int exact_match + +char word[SZ_FNAME] +int i, j +int strsearch() + +begin + if (exact_match == YES) { + return (strsearch(line, pattern)) + } else { + # See if any word in the pattern matches in the line. + for (i=1; pattern[i] != EOS; i=i+1) { + for (j=1; pattern[i] != EOS && pattern[i] != ' '; j=j+1) { + word[j] = pattern[i] + i = i + 1 + } + word[j] = EOS + if (strsearch(line, word) != 0) + return (YES) + } + return (NO) + } +end -- cgit