home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / goswish5.zip / goswish.doc < prev    next >
Text File  |  1999-06-08  |  47KB  |  1,100 lines

  1. 8 June 1999. GoSWISH ver 1.48
  2.                                        
  3. Daniel Hellerstein, danielh@econ.ag.gov
  4.  
  5.                 GoSWISH: A Search Engine Utility For OS/2
  6.  
  7. Abstract:       GoSWISH is a free search engine for OS/2 Web Sites. 
  8.                 GoSWISH consists of ver 1.3 of the SWISH "web indexer", 
  9.                 a script to automate it's use, and
  10.                 a script to provide a front-end to  WWW clients.
  11.  
  12.  
  13.                         --------------------------
  14. Table of Contents:
  15.  
  16. I.      Introduction
  17. II.     Installation
  18. IIa.      Installing as a CGI-BIN script
  19. IIb.      Installing as an SRE-http addon
  20. IIc.      Notes for upgraders
  21. III.    Using GoSWISH
  22. IIIa.     Using GOSWISH.HTM
  23. IV.     The GOSWISH.CMD program
  24. IV.a.     Invoking GOSWISH.CMD
  25. IV.b.     GOSWISH.CMD:  Make a SWISH index file
  26. IV.c.     GOSWISH.CMD:  Search a SWISH index file
  27. V.      The MKDCT.CMD program
  28. AppA.   Hints on using SWISH  
  29. AppB.   Acknowledgements and Legal Stuff 
  30.  
  31.  
  32.                         --------------------------
  33.  
  34. 1. Introduction 
  35.  
  36. The Simple Web Indexing System for Humans (SWISH) is a fast (and free)
  37. multi-platform program for generating & searching indices of the contents      
  38. of a set of files.  SWISH is designed to be used as "keyword search" tool,
  39. and will return output that can be incorporated into WWW output.
  40.  
  41. SWISH does the hard part of indexing (extracting words from selected
  42. documents and organizing them in compact fashion), and of searching
  43. this index for specified keywords. Although not terribly difficult 
  44. to use, it is a bit idiosyncratic.  By providing a simple, web-based
  45. interface to SWISH, GoSWISH can help the typical (i.e.; lazy and/or 
  46. overworked) web administrator use SWISH to keep his search tools
  47. up-to-date and easy-to-use. In addition, GoSWISH makes it easy to
  48. create, and display, summaries of the files that are found during
  49. a keyword search.
  50.  
  51. GOSwish includes a copy  SWISH ver 1.3. This is GNU-freeware (see the 
  52. appendix for further details).
  53.  
  54. To use GoSWISH you should have an OS/2 web server that understands CGI-BIN.
  55. Especially useful is a web-server that can handle POSTed CGI-BIN requests
  56. (since the set of options can get rather long).  
  57.  
  58. Even better, GoSWISH can also be run (somewhat more efficiently) as an 
  59. addon for the SRE-http freeware web server for OS/2 (see 
  60. http://www.srehttp.org for details).
  61.  
  62.  
  63.                         --------------------------------
  64.  
  65. II. Installation
  66.  
  67. First, you should UNZIP GOSWISH to an empty temporary directory.
  68.  
  69. Most people will want to use the INSTALL.CMD program (that
  70. comes with GoSWISH) to install.  This program will ask you whether
  71. you are installing GoSWISH to be run as a CGI-BIN program, or
  72. as an addon for the SRE-http web server.  It will then ask you
  73. for a few directories, modify a few files, and then copy them.
  74.  
  75. After it's done, you can try using GoSWISH!
  76.  
  77. For those who like to install software "by hand", the following
  78. instructions can be followed. 
  79.  
  80. IIa: Installing GoSwish as a CGI-BIN Script
  81.  
  82. In addition to copying files to appropriate places, the installation 
  83. of GoSWISH requires a few changes to the GOSWISH.CMD file; and possibly 
  84. to the GOSWISH.HTM file. Therefore, pay especial attention to step iv of
  85. the following instructions.
  86.  
  87.   0) Unzip GOSWISH.ZIP to an empty temporary directory
  88.  
  89.   i) Create a SWISH subdirectory in some convenient locations. For sake
  90.      of explanation, let's assume that you create D:\HTTP\SWISH.
  91.  
  92.   ii) Copy the following files to this directory (say, to D:\HTTP\SWISH):
  93.          SWISH-E.EXE
  94.          GOSWISH.CMD        
  95.         
  96.  iii) Copy GOSWISH.HTM to somewhere in your web tree. That is,
  97.       copy it to some place accessible via the www.  For sake of
  98.       explanation, let's assume you copy it to E:\WWW, and E:\WWW is
  99.       the "root" of your web tree.
  100.  
  101.       Then, you must edit GOSWISH.HTM (with your favorite text editor) and
  102.       make the following changes:
  103.  
  104.         a) Change all occurences of the string "search_document_directory" 
  105.            (without the quotes) to the relative directory you'ld like
  106.            your  "search documents"  written to by default
  107.            (or, you change it to an empty string).
  108.              * For example, change it to "SWISH/" (without the quotes).
  109.  
  110.         b) Change all occurences of the string "GOSWISH.CMD"
  111.            (in URLs and in forms) to /CGI-BIN/GOSWISH.CMD (or whatever
  112.            string your server uses to signify CGI-BIN scripts).
  113.  
  114.  iv) With your favorite text editor, edit GOSWISH.CMD (the copy in
  115.      you SWISH directory) and change the following parameters (they'll be
  116.      very clearly marked):
  117.  
  118.        a) SWISH_DIR  -- the directory used to store "SWISH" indices.
  119.        b) WEB_ROOT_DIR    -- The root of your web tree.
  120.           For example:
  121.                 SWISH_DIR='D:\HTTP\SWISH'
  122.                 WEB_ROOT_DIR='E:\WWW'
  123.  
  124.        c) If you are planning on using the "regenerate swish index"
  125.           option, and your web server uses something other then
  126.           /cgi-bin/ as a a "cgi-bin script" signal, then you should also
  127.           change the CGI_STRING variable.
  128.  
  129.   v) Copy this "modified" version of GOSWISH.CMD to your CGI-BIN
  130.     directory.
  131.  
  132. Assuming that there are no other access restrictions (is there 
  133. an HTACCESS file you need to modify?) you are now ready to use GoSWISH!
  134.  
  135.  
  136.                         --------------------------------
  137.  
  138. II.b. Installing GoSwish as a SRE-http addon
  139.  
  140. SRE-http users can use the above instructions and run GoSWISH as a CGI-BIN
  141. script. However, for purposes of speed and flexibility, we recommend running 
  142. GoSWISH as an SRE-http addon.
  143.  
  144. In addition to the above steps:
  145.  
  146.    vi) As part of step iii, you might want to modify the NEED_PRIVS
  147.       parameter in GOSWISH.cmd. 
  148.       NEED_PRIVS is used to limit who can create new SWISH indices.
  149.  
  150.   vii)Instead of (or in addition to) copying to the CGI-BIN directory, copy
  151.       GOSWISH.CMD to your SRE-http "addon" directory. If you are using a 
  152.       version of SRE-http newer then 1.2L.1297d, you can delete the version of
  153.       GOSWISH.CMD on "D:\HTTP\SWISH". Otherwise, you'll have to keep the
  154.       two copies synchronized (later versions of SRE-http keep track of
  155.       where a script is running from).
  156.  
  157.  viii)  Optional. Copy MKDCT.CMD to your SWISH (i.e.; D:\HTTP\SWISH) directory.
  158.  
  159.  
  160. In addition, you may be interested in the following "sample" files; you
  161. should copy them to your SWISH directory.
  162.  
  163.     SAMPLE.CON  : a sample SWISH "configuration" file
  164.     SAMPLE.SWI  : a sample SWISH "index" file
  165.     SRCHSAMP.HTM  : a sample "use GoSWISH to search an index" document
  166.     SAMPLE.DCT  : a sample "description  cache file" 
  167.     MKDCT.IN   : a sample "list-of-URLS" (used by MKDCT.CMD).
  168.     DESCRIBE.TXT : a sample "directory-specific" description file
  169.                    (used by MKDCT).
  170.  
  171.  
  172. IIc. Notes for upgraders: 
  173.  
  174.  
  175. GoSWISH 1.4 incorporates a number of changes, many of which are "under
  176. the hood". The most important change is support for SWISH 1.3;  
  177. which is shipped as SWISH-E.EXE (a copy of SWISH-E.EXE is included
  178. in GOSWISH.ZIP).  
  179.  
  180. SWISH 1.3 is less buggy then SWISH 1.1, and supports some useful 
  181. new features.  Unfortunately, the "index" files created by SWISH 1.3 
  182. are different (just a bit, but enough) from those created by SWISH 1.1.
  183.  
  184. Therefore, if you have older SWISH index files (say, as created by
  185. GoSWISH 1.2 or before), you may want to NOT use SWISH 1.3.  GoSWISH
  186. will work with SWISH 1.1 and SWISH 1.2 (albeit with these 
  187. new features disabled), but you must set a few parameters. 
  188.  
  189.   In particular, the SWISH_VERSION parameter in GOSWISH.CMD must be set to:
  190.        SWISH_VERSION=1.1 
  191.   (see GOSWISH.CMD files for details).
  192.  
  193.  
  194. As of version 1.44, GoSWISH is now distributed with rxSWISH.DLL -- a
  195. dynamic link library that emulates SWISH-E.EXE (ver 1.3).  We recommend
  196. using this -- just set the SWISH_VERSION parameter to:
  197.       SWISH_VERSION='13_DLL'
  198. Hint: you should move (or copy) rxSWISH.DLL (from your server's root
  199. directory) to a directory in your LIBPATH (such as x:\os2\dll).
  200.  
  201. Lastly -- see the READ.ME for late breaking news.
  202.  
  203.  
  204. Minor notes:
  205.  
  206.   *  SRCHINDX.CMD is no longer supported -- for all intents and purposes,
  207.      all it's functionality is now incorporated into GOSWISH.CMD
  208.   *  The WWWDIR option is no long supported -- you can't change the 
  209.      "WEB_ROOT_DIRECTORY"  on the fly. But, since you can specify fully
  210.      qualified directories, and  multiple replacement rules, this capability is 
  211.      no longer needed.
  212.   *  Note the use of SWISH_DIR and WEB_ROOT_DIR instead of INDEX_DIR and WWW_DIR
  213.   *  The HEADER option has been modified (it no longer adds <H1>
  214.   *  H1 and H2 options, similar to HEADER, now available
  215.   *  GoSWISH can now tell SWISH-E to use "stemming" rules when indexing  
  216.   *  "Property" retention, with later display, is supported in GoSWISH. 
  217.   *  FOOTER_FILEs and HEADER_FILEs are now assumed to be in the 
  218.      SWISH_DIR directory.
  219.  
  220.                         --------------------------------
  221.  
  222. III) Using GoSWISH
  223.  
  224. To get started with GoSWISH, we recommend GOSWISH.HTM: it provides a complete 
  225. interface to GoSWISH and to SWISH. With GOSWISH.HTM you can:
  226.  
  227.   a) Specify the directory (fully qualified, or web relative) to create an 
  228.      index of,and then create the index.
  229.   b) Create "summaries" of all text (plain and html) documents encountered
  230.      whilst creating the index.
  231.   c) Create an HTML document that allows you to enter keywords, and then search
  232.      the index you just created.
  233.  
  234. The HTML documents created in step c can then be made "available to the 
  235. public". Alternatively, GoSWISH automatically tracks the various indices 
  236. created (say, one for each of several major areas), and you can instruct
  237. GoSWISH to offer a menu listing these various indices.
  238.  
  239. More ambitious users can structure their own "calls" to GOSWISH.CMD.  The 
  240. various options understood by GOSWISH.CMD are listed in Section IV.
  241.  
  242. You may have noticed that we've mentioned "descriptions" and "summaries" a few
  243. times.  This refers to the generation of short (300 word) summaries for 
  244. matched files.  Thus, not only will matching files be found, but descriptions
  245. (extracted from the contents of the file) can also be displayed.  
  246.  
  247. An important point should be remembered: the SWISH "index of your site" is a 
  248. static document -- it will NOT reflect recent changes in the contents of your
  249. website.  Frequent recreations of this index may be necesssary (hopefully, 
  250. GoSWISH will make that easy to do).
  251.  
  252.                         --------------------------------
  253.  
  254. IIIa. GOSWISH.HTM 
  255.  
  256. GOSWISH.HTM automates practically everything having to do with index creation
  257. and use -- you may never need to use any other tool. However, please do not
  258. hesitate to modify, change, or otherwise chop GOSWISH.HTM to it's constituent
  259. pieces.
  260.  
  261. GOSWISH.HTM can be used for three purposes:
  262.   a) to create a Swish Index (and a GoSWISH description-cache file)
  263.   b) to search a Swish Index (and a GoSWISH description-cache file)
  264.   c) to list currently available "search forms" (created by GoSWISH)
  265.  
  266. GOSWISH.HTM has two index creation modes: a "simple" and a "custom" mode. 
  267. In most cases the simple mode will be quite adequate. The custom mode is
  268. actually quite similar, with defaults that are the same as those used
  269. when the "simple" mode is used. Do note that the "custom" mode uses 
  270. a POST style request; so your server must understand POST requests.
  271.  
  272. Regardless of which creation mode you use, GoSWISH will activate GOSWISH.CMD.
  273. GOSWISH.CMD will then 
  274.   a) create a "SWISH configuration" file, 
  275.   b) launch SWISH in a new process on your server, and feed it this 
  276.      configuration file
  277.   c) if desired, it will also generate generate descriptive summaries 
  278.      (and store them in a description-cache file).
  279.   d) A short status document will be returned to you (the client), which will
  280.      contain a link to a sample "search this index" HTML document. This 
  281.      document contains a form that allows you to specify keywords, and a 
  282.      few simple options (such as number of matches).  In addition, if you 
  283.      chose to create summaries, you can also specify whether or not to 
  284.      display summaries.
  285.  
  286.      This document can be used as is. Or, you can append, amend or 
  287.      otherwise modify it.  If you want to use it "as is", you might need to
  288.      wait until the index (and descriptions) creation (of steps b and c) are
  289.      completed; a task which may take a few minutes (depending on the number 
  290.      and size of the files to be indexed).
  291.  
  292.      NOTE:
  293.  
  294. Notes:
  295.  
  296.    * GOSWISH will launch daughter processes; so reciept of a complete 
  297.      response from the server does not mean all the work's been done.  
  298.      To avoid this uncertainty, SRE-http users can "monitor swish while
  299.      it runs", as well as monitor the  generation of descriptions. 
  300.  
  301.      Unfortunately, due to the simplicity of the CGI-BIN protocol, when
  302.      run as a CGI-BIN script this "monitoring" feature is not available.
  303.  
  304.    * GoSWISH will generate a sample "search this index" document that 
  305.      uses the "search mode" of  GoSWISH. You can use this search document
  306.      as is (it's a reasonably efficient interface), or you can modify
  307.      with your favorite text editor. If you want to take a shot at
  308.      this sort of customization, you should read section IV.c.
  309.  
  310.  
  311.                         --------------------------------
  312.  
  313. IV. GOSWISH.CMD 
  314.  
  315. The following describes the various GOSWISH.CMD options.  Note that many of 
  316. these refer to SWISH options -- see Appendix A for an overview of what the 
  317. SWISH options do. In addition, the "custom" section of GOSWISH.HTM describes 
  318. most of these options.
  319.  
  320.  
  321. IV.a. Invoking GOSWISH.CMD
  322.  
  323. GOSWISH.CMD can be invoked with a URL of the form
  324.    /cgi-bin/GOSWISH?mode=x&option1=val1&option2=val2&etc.
  325. or, if you are an SRE-http user:
  326.    /GOSWISH?mode=x&option1=val1&option2=val2&etc.
  327.  
  328. The MODE argument determines what type of action GOSWISH.CMD will 
  329. perform. MODE can take one of the following values:
  330.  
  331.         MODE=M : Create a swish index 
  332.  
  333.         MODE=S : Search a SWISH index mode
  334.  
  335.         MODE=L : List currently available SWISH indices (and provide
  336.            links to forms that can be used to search them)
  337.  
  338.         MODE=REGEN : List currently available SWISH configuration files,
  339.                      which can be used to regenerate a SWISH index
  340.                      This is provided as an alternative to running
  341.                      SWISH-E (with a pre-existing configuration file)
  342.                      from an os/2 command prompt. Note that "descriptive
  343.                      summaries" are NOT regenerated, only the SWISH index.
  344.  
  345.         MODE=2REGEN : Regenerate a swish index (using a given swish
  346.                       configuration file). MODE=2REGEN is generated
  347.                       by MODE=REGEN -- it will not be described in
  348.                       this document.
  349.  
  350. Example: MODE=M
  351.  
  352.  
  353. The remaining options understood by GOSWISH depend on the value of MODE:
  354. one set of options is used when MODE=M, and a second set
  355. is used whtn MODE='S'. Note that when MODE='L' or MODE='REGEN', 
  356. no other options are used, and when MODE='2REGEN', a set of 
  357. filename options are used.
  358.  
  359. The following sections describes the GOSWISH.CMD options. Note that
  360. some of these examples presume you are using a URL to invoke GOSWISH, hence
  361. URL encoding rules (such as using a + for a space) are displayed. However,
  362. if you are using a FORM with INPUT elements, you should convert these encoded
  363. characters.
  364.  
  365. But before listing these options, please note that GOSWISH.CMD contains a 
  366. number of configuration parameters (some of which can be overridden by
  367. the following options). You can change these parameters by editing
  368. GOSWISH.CMD with your favorite text editor -- the parameters are
  369. in a section at the top of the file, and are documented.
  370.  
  371.  
  372.  
  373.                         --------------------------------
  374.  
  375. IV.b. GOSWISH.CMD: Creating a SWISH Index (mode=M)
  376.  
  377. In "create a swish index" mode, there are four classes of options:
  378. file options, indexing rules, description options, and other options. 
  379.  
  380.  
  381. ** File Options: You MUST set the SEL option (defaults are used
  382.                  for the others).        
  383.  
  384. SEL : The  directories to be searched.
  385.       You can enter..
  386.         relative directories (directories that do not have a drive letter), or
  387.         fully qualified directories.
  388.       in a space delimited list.
  389.       Relative directories are assumed to be under (subdirectories of) the
  390.       WEB_ROOT_DIR directory.  
  391.      
  392.       Example:  SEL=/    (search WEB_ROOT_DIR and all it's subdirectories)
  393.                 SEL=DIR1/  
  394.                 SEL=/DIR1  /DIR10  /DIR2
  395.                 SEL=/DIR1/  /DIR2/*  /DIR3/
  396.       Notes: 
  397.        * swish will index the subdirectories of each directory 
  398.          (relative or absolute) that you enter. 
  399.        * To specify an explicit set of files in a directory, but not in 
  400.          subdirectories (of a directory), you can   use * as a wildcard. 
  401.          For example: 
  402.             samples/  means all files in samples/, and in subdirectories of samples 
  403.             samples/* means all files in samples/       
  404.                       but NOT in subdirectories of samples/ 
  405.             samples/foo*.* means all files that match foo*.* in samples/ 
  406.                            but NOT in subdirectories  of samples/ 
  407.        * trailing and leading / (or \) characters  in relative directory
  408.          names are strictly optional (they will be removed and added 
  409.          as need be).
  410.       
  411.  
  412. SWIFILE: The name of the "swish index" to create. If not a fully qualified
  413.          name, it will be written to the SWISH_DIR directory. If not
  414.          specified, a unique random name (in SWISH_DIR) will be used.
  415.  
  416.  
  417. SWISHVERSION: Which version of SWISH to use. This overrides the default
  418.               SWISH_VERSION variable set in GOSWISH.CMD.
  419.               SWISHVERSION can take one of the following values: 
  420.                  11 == version 1.1
  421.                  12 == version 1.2
  422.                  13 == version 1.3
  423.               Example: SWISHVERSION=13
  424.  
  425.  
  426. SEARCHDOC: The name of the "search this index" HTML document. Relative
  427.            names are assumed to be relative to the WEB_ROOT_DIR. If not
  428.            specified, a unique random name (in WEB_ROOT_DIR) will be
  429.            used.
  430.            If a fully-qualified name is used, you should also include
  431.            the "selector" that will invoke this file. For example:
  432.                SEARCHDOC=D:\WWWNEW\SDOCS\SEARCHX.HTM+/WWW2/SEARCHX.HTM
  433.            ... note the use of a "url-encoded space" (the +) to delimit the 
  434.            fully qualified file name and the "selector").
  435.  
  436. OVERWRITE   If set to 1, filenames will overwrite pre existing file names.
  437.             Note that this overrides the OVERWRITE variable in GOSWISH.CMD
  438.  
  439. ** Indexing Rules: 
  440.  
  441. EXTLIST : List of extensions to index -- if a file does not have one
  442.           of these extensions, it will be ignored.
  443.  
  444. EXTLIST_NOFOLLOW: Do NOT extract "words" from these documents. 
  445.                  You should ONLY extract words from text documents
  446.                  (such as HTML files).
  447.  
  448. DOSTEM  If 1, then use the "stemming algorithim". If 0, do NOT use
  449.         the stemming algorithim. The default value is 1
  450.         Example: DOSTEM=1
  451.  
  452. METANAMES  List of <META> name fields to assign words to.
  453.            If you specify a list of such fields (such as DESCRIPTION and 
  454.            CONTENT), then you'll be able to search explicitily for words
  455.            appearing in these <META> elements in HTML files.  For example,
  456.            if you specify:
  457.                  METANAMES=DESCRIPTION
  458.            then you can later search using a KEYWORD
  459.                 DESCRIPTION=myword
  460.            and SWISH will find all files that have the word "myword" in
  461.            a "description" <META> element.
  462.  
  463.            There is one drawback -- these words will NOT be found under a 
  464.            usual search (however, you can "or" together normal keyword
  465.            searches and <META> keyword searches).
  466.  
  467.  
  468. PROPNAMES  List of "property names" (defined as values of META tags)
  469.            to retain for each file. This is extra descriptive information
  470.            that can be shown with other search results.
  471.            Example: PROPNAMES=DESCRIPTON+AUTHOR+MODIFIEDDATA
  472.  
  473. IGNORELIMIT: Used to ignore "common" words that occur too frequently
  474. IGNOREWORDS: A set of common words to ignore (such as "the" and "or").
  475.              If not specified, a list of about 1000 "swishdefault"
  476.              words are used.
  477.  
  478. REPWITH: SWISH will store files using fully qualified file names. If you
  479.          want to store URLS (a requirement if you want clients to be
  480.          able to "click to recieve" matched documents), the REPWITH can
  481.          be used to specify a "replacement rule".  By default, a
  482.          default REPWITH is used (that will create a selector that is
  483.          relative to the value of the SEL option). Note that
  484.          if you specify multiple directories to search, by default
  485.          a seperate replacement rule will be generated for each
  486.          directory you specify.
  487.  
  488.          If you specify any REPWITH rules, default ReplaceRules will
  489.          NOT be generated!
  490.  
  491.  
  492. These FR_ options are used to suppres indexing of files and directories.
  493. Please see SWISH.HTM for details.
  494. FR_DIRECTORY: the "FILE RULES DIRECTORY " instructoins
  495. FR_TITLE: The "FILE RULES TITLE" instructions
  496. FR_FILENAME: The "FILE RULES FILENAME" instructions
  497. FR_PATHNAME: The "FILE RULES PATHNAME" instructions.
  498.  
  499. These index options are stored in the swish index file; they just
  500. provide identifying information.  
  501. INDEXNAME : Name of the index
  502. INDEXADMIN: Administrator
  503. INDEXPOINTER: Pointer to this index
  504. INDEXDESCRIPTION: Description of the index
  505.  
  506.  
  507. ** Description options. 
  508.  
  509. The "description-cache" (DCT) file is created by extracting informaton from each 
  510. matched document. For HTML documents, a META NAME="DESCRIPTION"  or 
  511. HTTP EQUIV DESCRIPTION element is used (if available). 
  512.  
  513. For example:
  514.  <meta http-equiv="description"
  515.        contents="This is the manual for the server">
  516. Otherwise, values of <Hn> headers are used.
  517.  
  518. For non-HTML documents, the first few hundred characters are used.
  519.  
  520.  
  521. Note to SRE-http users: The MKDCT program can also be used to create
  522.                         a "description-cache file".
  523.  
  524. MAKESUMMARY: Make a descriptions-cache (DCT) file (that contains file summaries)
  525.             Can be one of :
  526.                 0 = Do NOT create a DCT file. If you select
  527.                     0, then descriptions will NOT be available (of course,
  528.                     you can always rerun GOSWISH to make descriptions at a later
  529.                     date)
  530.                         Note: on sites with well document HTML files, 
  531.                              you can use DESCRIPTION (and other such)
  532.                              "properties" instead of summaries.
  533.                 1 = Read descriptive summaries from a DESCRIBEFILE.
  534.                 2 = Read descriptive summaries from a DESCRIBEFILE.
  535.                     If no such directory-specific description file exists, 
  536.                     and this is a "text" file, then create a descriptive summary
  537.                     by examining the contents of the file.
  538.                     
  539.            Note: "text files" are defined as "indexed" files -- files that
  540.                     do NOT match the EXTLIST_NOFOLLOW list.
  541.             
  542. DCTFILE:     The name to use for the "descriptions-cache" (DCT) file. Relative names
  543.              are written relative to the SWISH_DIR.  If not specified,
  544.              a random name (in SWISH_DIR) is used.
  545.  
  546. DESCRIBEFILE: A text file that contains explicit descriptions. The DESCRIBEFILE,
  547.               if specified, is an "own directory" specific file -- a seperate one
  548.               should be specified for each directory (and subdirectory) being
  549.               indexed.  If an entry for an indexed file is found in the "own 
  550.               directory DESCRIBEFILE, then the associated description is used
  551.               (a description will NOT be constructed from the contents of the file).
  552.               DESCRIBEFILE files should look like:
  553.                  filename.ext  a description
  554.                  filenam2.ext  another deDscription
  555.                  filenam3.ext  another description, this one on
  556.                    | two lines 
  557.  
  558.                 Example: DESCRIBEFILE=DESCRIBE.TXT
  559.  
  560. ** Other options.
  561.  
  562. WATCH:  If WATCH=1, and you are running GOSWISH as an SRE-http addon,
  563.         then status information will be shown. 
  564.  
  565.         Note: when run as a CGI-BIN script, WATCH is ignored (status
  566.         is not "watched". However, GOSWISH will "START" SWISH -- 
  567.         a descriptive name will show up in the task list.
  568.         When run as an SRE-http addon, programs are DETACHed (and will 
  569.         not show in the task list).
  570.  
  571. DOSTEM:   If DOSTEM=1, then apply a "stemming" algorithim when indexing.
  572.          This algorithim will strip stems (sucn as "s", "ed", etc.)
  573.          from words before indexing them.
  574.  
  575. INDEXCOMMENTS: If INDEXCOMMENTS=0, then SWISH will index HTML comments.
  576.                If INDEXCOMMENTS=1, comments will not be indexed.
  577.  
  578. ** Example. 
  579.  
  580.  
  581.   Note that this would typically be a single long request,
  582.   or would be the body of a POST request (als note use of URL encoding):
  583.  
  584. /CGI-BIN/GOSWISH?
  585.   mode=M&
  586.   sel=/SAMPLES&
  587.   swifile=&
  588.   searchdoc=&
  589.   repwith=&
  590.   extlist=.htm+.txt+.gif+.jpg+.doc+.sht+.html+.shtml&
  591.   extlist_nofollow=+.gif+.xbm+.jpg+&
  592.   fr_pathname=contains+admin+testing+demo+trash+construction+PRIVATE+private+confidential+&
  593.   fr_directory=contains+.htaccess+&
  594.   fr_filename=contains+%23+%25+%7E+.bak+.orig+.old+old.+&
  595.   fr_title=contains+construction+example+pointers+&
  596.   ignorelimit=50+100&
  597.   ignorewords=SwishDefault&
  598.   indexname=&indexadmin=&indexdescription=&indexpointer=&
  599.   makesummary=2&
  600.   htmls=+HTM+HTML+SHTML+SHT+&
  601.   describefile=DESCRIBE.TXT&
  602.   watch=Y
  603.  
  604.             
  605.                         --------------------------------
  606.  
  607. IV.c.GoSWISH MODE=S options
  608.  
  609. MODE='S' is the "search a SWISH" index MODE. The following parameter
  610. can be fed to GoSWISH, either as part of an HTML form, or as
  611. part of a (possibly quite long) URL.
  612.  
  613.  
  614. INDEX: 
  615.        A space delimited list of "SWISH" indices.
  616.        Each index in this list may be a fully qualified name, or
  617.        a relative name.
  618.        If relative name is used, it is assumed to be relative to the SWISH_DIR.
  619.  
  620. DCT_FILE: 
  621.        A space delimited list of description-cache files.
  622.        Each index in this list may be a fully qualified name, or
  623.        a relative name.
  624.        If relative name is used, it is assumed to be relative to the SWISH_DIR.
  625.  
  626.  
  627. EXIST
  628.        If EXIST=1, then GoSWISH will check to see if the matches are accessible.
  629.        When matches are URLS (which is the usual case), socket calls are used.
  630.        If the URL does not exists, the match will be displayed, but will not 
  631.        be linked.
  632.  
  633.          In general, use of EXIST=1 is NOT recommended -- it dramatically increases
  634.          response time.
  635.  
  636. CONDITION 
  637.      Controls search logic. CONDITION should set to OR or NOT.
  638.      Depending on the value of CONDITION, an  "OR" or a "NOT"  will 
  639.      placed between keywords.
  640.      If CONDITION is not included, "AND" is used.
  641.  
  642.       *  Keywords for which an explicit "logical control" was
  643.          included will not be effected by the CONDITION parameter.  
  644.          That is, CONDITION only applies to keywords that do not have 
  645.          a preceding AND, OR, or NOT.
  646.  
  647.       * Caution: CONDITION  does not work well with (phrases) or
  648.                in combination with  complex user specified search strings.
  649.  
  650.        Example: 
  651.          <INPUT TYPE="hidden" NAME="condition"  VALUE="OR">
  652.  
  653.        Note: the list of "keywords" can also contain OR, NOT, AND and ( ) --
  654.              CONDITION will NOT override these explicit boolean terms.
  655.  
  656. COMMENT  
  657.     Comments to place (using <EM>) under header. You can include multiple
  658.     COMMENT elements.
  659.  
  660.      Example:
  661.          <INPUT TYPE="hidden" NAME="comment"
  662.           VALUE="Searching all complete words in your documents.">
  663.          <INPUT TYPE="text" NAME="comment"
  664.           VALUE="A personallized comment">
  665.  
  666. FOOTER_FILE
  667.      A file to use as a footer.
  668.         * The FOOTER_FILE is assumed to be relative to the SWISH directory
  669.           (or to a virtual directory)
  670.         * Server side includes will NOT be attempted on the footer_file.
  671.  
  672.        Example: <INPUT TYPE="hidden" NAME="footer_FILE" VALUE="AFOOT.TXT">
  673.  
  674.  
  675. HEADER_FILE     
  676.      A file to use as a header. If HEADER_FILE is specified, the
  677.      HEADER, H1, and H2 options are ignored (COMMENTS are NOT ignored).
  678.  
  679.      * If you use a HEADER_FILE, you MUST include a <BODY> statement in it.
  680.      * The HEADER_FILE is assumed to be relative to the SWISH_DIR director --
  681.        either in it, or in a subdirectory of SWISH_DIR.
  682.      * Server side includes will NOT be attempted on the header_file.
  683.  
  684.        Example: <INPUT TYPE="hidden" NAME="header_FILE"  VALUE="DAHEAD.TXT">
  685.  
  686. HEADER, H1, and H2
  687.      A header to display (at the top of the results page).
  688.      A default header is used if neither HEADER_FILE or HEADER is specified.
  689.  
  690.      H1 will automatically prepend an <H1>, and append a </H1>, to 
  691.      your header.
  692.      H2 will automatically prepend an <H2>, and append a </H2>, to
  693.      your header.
  694.  
  695.      You should only use one of HEADER, H1, or H2
  696.  
  697.      Example: 
  698.        <INPUT TYPE="hidden" NAME="header"  VALUE="<h2>Results of search</h2>">
  699.  
  700.  
  701. KEYWORD
  702.     A space delimited list of words to search for, with OR AND NOT used
  703.     as  (optional)logical controls (AND is assumed).
  704.  
  705.     If KEYWORD is not included, a keyword of HELP is used.
  706.  
  707.        Example (from a FORM):
  708.            <INPUT TYPE="text" NAME="keyword">
  709.          
  710.        Another example, assuming you defined a METANAME of AUTHOR
  711.           <INPUT TYPE="text" name="keyword" value="AUTHOR="> enter author's name
  712.             (the user should enter the author's name after the 
  713.              AUTHOR= in the input box) 
  714.  
  715. OPTION    
  716.     A search-modification option.  You can include multiple OPTION elements.
  717.     Valid OPTIONs include: 
  718.        -t HBthec  : search in head, body, title, header, emphasized, or comments
  719.        -m nn      : display nn maximum of nn matches
  720.     For a description of these options, see the SWISH documentation at:
  721.           http://www.eit.com/software/swish/swish.html
  722.     or run SWISH (from an OS/2 command prompt) for a short synopsis.
  723.  
  724.     Examples (display 10 matches, searching HTML documents only):
  725.        <INPUT TYPE="hidden" NAME="option" VALUE="-m10">
  726.        <INPUT TYPE="hidden" name="option" value="-t+HB">
  727.  
  728.     SPECIAL OPTIONS (requires a DCT_FILE)
  729.        Option="FILE"
  730.          Instead of looking for keywords, you can search for "URL names"
  731.          that contain a matching substrings.
  732.        Option="SUMMARY"
  733.           Searches the "automatic description" for matching substrings.
  734.  
  735.         *  The URL name will be displayed as the link (instead of
  736.            the TITLE).  However, the descriptions will be the same as
  737.            those used in regular keyword searches through the SWISH index.
  738.  
  739.         *  When file or summary search is selected, the HBthec options are 
  740.            ignored.
  741.  
  742.         Example: <INPUT TYPE="hidden" name="option" value="file">
  743.  
  744. SEARCH_LINK:
  745.         Specify the target for a "New Search?" link (which will be displayed
  746.         at the bottom of results pages.  This should be a valid URL pointing
  747.         to your search form.
  748.          Example:
  749.            <input type="hidden" name="SEARCH_LINK" value="http://mysite.net/search1.htm">
  750.  
  751.  
  752. SHOWPROP:
  753.        Specify "properties" to display (if available).
  754.        You can specify multiple occurences of SHOWPROP -- a cumulative
  755.        list is built.  
  756.  
  757.        In addition to property names, you can include a special "property"
  758.        of _SUMMARY_n (n=0, 1, or 2) These are synonymous with specifying
  759.        a SUMMARY=n option.
  760.  
  761.        Examples:
  762.             <input type="hidden" name="SUMMARY" value="Description">
  763.             <input type="hidden" name="SUMMARY" value="Author">
  764.         (note that BOTH of these could be specified simultaneously --
  765.          which would mean "display both the Description and the Author
  766.          properties for each matched file).
  767.         
  768.        Warning: in order to use SHOWPROP, you MUST have used an
  769.                 appropriate PropertyNames option when you created
  770.                 the SWISH configuraton file. For example:
  771.                      PropertyNames description Author
  772.  
  773. START:
  774.     Display the first m matches, starting with the START match.
  775.     By default, START=1.  
  776.  
  777.     The most frequent use of START is to tell GoSWISH to "make links
  778.     to the next 20 matches.  To do this, you should use a special
  779.     form of the START option:
  780.          START=1 0 
  781.     .... that is, a 1, a space, then a 0 (or, if used in url: START=1+0)
  782.  
  783.     GoSWISH will interpret this to mean 
  784.         * "start at the #1 match and display the selected quantity of matches
  785.         * if there are undisplayed matches, provides links to the
  786.           next (or prior) set of matches
  787.     Please note that an inefficient algorithim is use:GoSWISH will re-search
  788.     the SWISH index, and selectively display the appropriate matches (say, matches
  789.     21 to 40 if you specified "show 20 matches".
  790.     Nevertheless, this option does give you the ability to display lots of
  791.     matches " a page at a time".
  792.  
  793.    Examples:
  794.         START=20
  795.         START=1+0  (where the + is a URL-encoded space)
  796.  
  797.  
  798.    Note: the "m" (in "first m matches") is specified by using 
  799.    an OPTION. For example, to specify "display 10 matches
  800.    at a time, starting from the first match":
  801.        <INPUT TYPE="hidden" NAME="option" VALUE="-m 10">
  802.        <INPUT TYPE="hidden" NAME="start" VALUE="1 0">
  803.  
  804.  
  805. SUMMARY:
  806.         Display a summary.
  807.           summary=0 : do not display summaries
  808.           summary=1 : display summaries.
  809.           summary=2 : display summaries; if no summary
  810.                       is available, try to create one by reading
  811.                       the file, or the URL of the file (depending
  812.                       on what appears in the G.
  813.  
  814.         Notes:
  815.             * If summary=1, then a DCT_FILE must be specified.
  816.             * If summary=2, then a DCT_FILE  should be specified,
  817.               but need not be. However, we do NOT recommend using SUMMARY=2,
  818.               since creating summaries "on the fly" can bog down your server.
  819.             * See SHOWPROP for another way of requesting display of summaries.
  820.             * Summary display will indicate the "source" of the summary:
  821.                >> if from a "DESCRIBEFILE", or from a <META> element, then
  822.                   the standard font is used
  823.                >> if generated from a non-html text file, or from the <BODY>
  824.                   of an HTML file, <TT> font is used.
  825.  
  826. ** Example (note use of URL encoding):
  827. /CGI-BIN/GOSWISH?
  828.   MODE=S&
  829.   INDEX=index32.swi&
  830.   DCT_FILE=index32.dct&
  831.   KEYWORD=daniel&
  832.   COND=AND&
  833.   OPTION=-m+20&
  834.   SUMMARY=1&
  835.   HEADER=<b>Search+of+my+files</b>
  836.  
  837.  
  838.  
  839. *  Miscellaneous comments 
  840.  
  841.   *  Please remember that the SWISH "index" of your directory is a static
  842.      document, and will not reflect subsequent changes in the contents of
  843.      your site (this is also true of the "description file").
  844.      So, if you make substantial changes in site content, you should
  845.      rerun GoSWISH.
  846.  
  847.   *  If you do NOT need the "keyword search" features (that is, you only want
  848.      to search filenames or summaries), you can skip the use of SWISH.  This
  849.      does require providing MKDCT with a list-of-URLs (see MKDCT for
  850.      details).
  851.  
  852.   *  The "search documents" produced by GoSWISH can be easily modified.
  853.      In particular, you can add HEADER_FILE, FOOTER_FILE, and COMMENT options.
  854.  
  855.  
  856.   *  GoSWISH will auto-detect whether a the target SWISH index is version 1.1
  857.      or version 1.3, and will run the appropriate version of SWISH (assuming
  858.      that SWISH 1.1 is named SWISH.EXE and ver 1.3 is SWISH-E.EXE.
  859.  
  860.   *  When specifying multiple index files, you can NOT mix version 1.1 and
  861.      version 1.3 swish indices.
  862.  
  863.                         --------------------
  864.  
  865.  
  866.  
  867.                     --------------------------------
  868.  
  869. V. The MKDCT program
  870.  
  871.    MKDCT.CMD is a standalone program used to create a "description-cache" 
  872.    (DCT) file".  The output of MKDCT differs from the description file that 
  873.    can be (optionally) produced by GOSWISH.CMD in several ways:
  874.  
  875.      a) You can create either "regular" or "structured" DCT files (see
  876.         below for a description of these two forms of DCT files).
  877.  
  878.      b) You can run MKDCT at any time. In contrast, GOSWISH only produces it's
  879.         description file while producing the SWISH index.
  880.    
  881.      c) MKDCT has a few extra options. 
  882.  
  883.      d) MKDCT contains a simple "description-cache file" editor.
  884.  
  885.  
  886. MKDCT has two file selection modes: a "SWISH" mode and a "List of URL's" mode.  
  887.   * SWISH mode: The SWISH mode uses the ".CON" file you used to 
  888.      create the SWISH index; and the ".SWI" SWISH index file.
  889.  
  890.   * List-of-URLS mode: The List-of-URLs mode requires a text file containing 
  891.     "URLS" to be examined (see MKDCT.IN for a simple example). 
  892.     Entries in these files should have the following form:
  893.        URL " short description" byte_size fully_qualified_filename
  894.     where the URL should be a valid "link" to your site, and the 
  895.     last three terms are optional.
  896.  
  897. In general, if you've gone to the trouble of obtaining and using SWISH, 
  898. it's probably easier to use the SWISH mode.
  899.  
  900. When it comes to creating the descriptions, either generate
  901. descriptions for HTML and plain-text files by examining the
  902. contents of the file, or it will examine "directory-specific" description 
  903. files -- text files that may be in each of the (several) directories
  904. being indexed.  Each of these (possibly several) files should contain
  905. descriptions about the files in it's own directory.  
  906.  
  907. The basic structure of these "directory-specific" description files is
  908. simple.  It should contain entries that look like:
  909.  
  910.   filename.ext  a description
  911.   filenam2.ext  another description
  912.   filenam3.ext  another description, this one on
  913.      | two lines (this is the continuation of the filenam3.ext desciption)
  914.  
  915. These descriptions can be of any length -- just be sure to start the
  916. "continuation lines" with a | character.  Furthermore, the files can be
  917. of any mime type -- they need not be "HTML" or "plain text" files.
  918. Lastly, you should NOT include path information on the filename.ext 
  919. portion of an entry -- a given "directory-specific" description file 
  920. ONLY refers to files in "it's own directory".
  921.  
  922.  
  923. Structured vs. Regular DCT Files
  924.  
  925.  "Regular" DCT files are the same as  DCT files produced by GoSWISH.
  926.  
  927.  "Structured" DCT files (which can be read, but not generated, by
  928.  GoSWISH) contain the same information, but use structured records
  929.  to speed up data retrieval. While not important for an index of a small 
  930.  (say, less  then a few hundred) set of files, for large (several thousand)
  931.  indices, extraction of summaries from structured DCT files can be
  932.  several times faster.
  933.  
  934.  Other then the need to use MkDCT, there is one disadvantage to 
  935.  structured DCT files -- they can NOT be combined. Regular DCT
  936.  files can be combined, say by using an HTML form statement of:
  937.    <input type="hidden" name="DCT_FILE" value="index1.dct INDEX2.DCT">
  938.  
  939.  
  940.  
  941.  
  942.  
  943.  
  944. Notes:
  945.  
  946.   *  As with SWISH's index, the description file is permanent (at
  947.      least until you delete or replace it).  Thus, changes to the contents
  948.      of your files will not effect the descriptions (nor will such changes
  949.      effect the SWISH index).
  950.  
  951.   *  MKDCT will ask you to supply a fully qualified name for the
  952.      description file.
  953.  
  954.   *  At the top of MKDCT.CMD are a number of user changable parameters.
  955.      For example, you can modify the value of the  | "continuation flag".
  956.      Of more general use, if you intend to use MKDCT frequently (for 
  957.      example, if your site is changing rapidly), you may want to change 
  958.      some of the default file names.
  959.  
  960.   * Hint: Creating an DCT file for a large set of files can monopolize your 
  961.           CPU for several minutes.  If you do not want to bog your machine down,
  962.           and are willing to accept a longer completion time, you can
  963.           instruct MKDCT to "run at a lower priority". 
  964.  
  965.  
  966.                         --------------------
  967.  
  968.  
  969. Appendix A) Hints on using SWISH  
  970.  
  971. The following offers a brief description of how to run SWISH as 
  972. a standalone program.  We do not necessarily advocate running SWISH
  973. directly (i.e.; rather then running it via GoSWISH).... it's a matter 
  974. of taste.
  975.  
  976. Serious users should obtain and read the SWISH documentation,
  977. which can be found at http://sunsite.berkeley.edu/SWISH-E.
  978. It's actually fairly well written!
  979.  
  980. However, for those who aren't real ambitious, the following will probably
  981. be all they really need to know to use SWISH effectively!  Note that
  982. this example does NOT use features unique to SWISH 1.3 (it will work
  983. with both SWISH 1.1 and SWISH 1.3).
  984.  
  985. First,as mentioned in the installation section above, two samples files
  986. are included:
  987. two sample files:
  988.    SAMPLE.CON : A "configuration" file used by SWISH
  989.    SAMPLE.SWI : The results of using SAMPLES.CON, ready to be used
  990.                  as an "INDEX" file.
  991.    SRCHSAMP.HTM : An html document that calls uses GOSWISH to search            
  992.                   sample.swi.
  993.  
  994. Since SAMPLES.CON is tersely documented, let's discuss some of it's more 
  995. important variables.
  996.  
  997.   IndexDir  
  998.         A space delimited list of "directories" to search (note that
  999.         subdirectories of these directories are also searched).  These should
  1000.         be fully qualified directories (though you don't need the drive
  1001.         letter).  
  1002.  
  1003.         Note that in SAMPLES.CON, two directories are indexed:
  1004.         SAMPLES and IMGS.  Further note that we assume that
  1005.         the GoServe data directory is \WWW.
  1006.  
  1007.   IndexFile 
  1008.         The "index" file generated by SWISH, and used by the INDEX 
  1009.         option of GOSWISH.  Since we try to be FAT friendly, we usually 
  1010.         give it a .SWI extension, but you can call it anything.  
  1011.  
  1012.   IndexOnly 
  1013.         Only files with these extensions will be indexed. 
  1014.  
  1015.   NoContents
  1016.         Files with these extensions will only have their names
  1017.         indexed (that is, their contents will not be examined).
  1018.         This may not work all the time (SWISH has several such
  1019.         bugs in it).
  1020.  
  1021.   ReplaceRules
  1022.         Replaces the portion of the file name with some other string.
  1023.  
  1024.         THIS IS CRUCIAL -- if you don't get this one right,
  1025.                             the links created by GOSWISH will NOT work.
  1026.  
  1027.         Note that ReplaceRules only seems to work on strings listed
  1028.         in the IndexDir.  Thus, you can't give different ReplaceRules
  1029.         to different branches of a subdirectory tree (unless each
  1030.         branch was explicitily mentioned in the IndexDir option)
  1031.  
  1032.          You can use any string in the "convert to" portion of your 
  1033.          ReplaceRules. However, note the following:
  1034.  
  1035.  
  1036.    FileRules
  1037.         Used to suppress reporting certain directories.
  1038.         Caution: FileRules seem to be a bit flakey, you may want to
  1039.                  experiment them.
  1040.  
  1041. Once you've created your .CON file, you can run it through SWISH
  1042. (using the -c option).  Then, run it through SWISH again, using the
  1043. -f  swish_index_file_name -w word1 word2
  1044.  
  1045.                         ---------------------
  1046.  
  1047. Apppendix B. Acknowledgements and Legal Stuff 
  1048.  
  1049. The original creator of SWISH (in 1994) was Kevin Hughes (then of
  1050. EIT). Custody of the rights have since passed to UC Berkeley, which
  1051. distributes new versions of SWISH as GNU style freeware
  1052. (see http://www.fsf.org/copyleft/gpl.html for the generic
  1053. GNU license).
  1054.  
  1055. The current (February 1999) home page for the SWISH project is: 
  1056.     http://sunsite.berkeley.edu/SWISH-E/
  1057.  
  1058. If you are interested in the complete SWISH for OS/2 package, you can
  1059. look for it on:
  1060.    http://sunsite.berkeley.edu/SWISH-E/Ports/OS2/swishe131.zip,
  1061.    hobbes.nmsu.edu (search for SWISH)
  1062. or the SRE-http home page 
  1063.    http://www.srehttp.org/pubfiles/swish11.zip (swish 1.1), or 
  1064.    http://www.srehttp.org/pubfiles/swish13.zip (swish 1.3) 
  1065.  
  1066.  
  1067. GoSWISH was developed by Daniel Hellerstein (danielh@econ.ag.gov).
  1068. It too is freeware, with the following GNU-like disclaimer:
  1069.  
  1070.   Copyright 1998,1999 by Daniel Hellerstein. 
  1071.  
  1072.   Permission to use the GoSWISH software package for any purpose is hereby 
  1073.   granted  without fee, provided that the author's name not be used in
  1074.   advertising or publicity pertaining to distribution of the software 
  1075.   without specific written prior permision.
  1076.   With some provisos, this includes the right to subset and reuse the code,
  1077.   with proper attribution.
  1078.  
  1079.   Furthermore you may also charge a reasonable re-distribution fee for
  1080.   GoSWISH; with the understanding that this does not remove the
  1081.   work from the public domain and that the above provisos remain in effect.
  1082.  
  1083.   Note that this disclaimer is only in regard to the various files
  1084.   comprising GoSWISH, which does NOT include the SWISH executable(s) --
  1085.   see the GNU license for information on distribution of SWISH.
  1086.  
  1087.   GoSWISH was developed on the personal time of Daniel Hellerstein,
  1088.   and is not supported, approved, or in any way an official product
  1089.   of my employer (USDA/ERS).
  1090.  
  1091.  
  1092. Manu kudos to Christopher McRae (christopher.mcrae@mq.edu.au) who
  1093. ported the version 1.3 C source code (from Berkeley) to OS/2, and
  1094. who generously created rxSWISH.DLL.
  1095.  
  1096. Also thanks to Stewart Buckingham (stu@mailroom.com) who bravely
  1097. stepped up to the beta testing plate.
  1098.  
  1099.  
  1100.