
[This is a text-only version of guide.ps]


               The curl v2.0 User Guide



                   Andrew Davison
             Department of Computer Science
              The University of Melbourne
          Parkville, Victoria 3052, Australia
                Email: ad@cs.mu.oz.au
            URL: http://www.cs.mu.oz.au/ad

                      May 1996



CONTENTS
========

1  Introduction. . . . . . . . . . . . . . . . . . . . . . . .3

2  Motivation. . . . . . . . . . . . . . . . . . . . . . . . .3


3  An Overview of curl Features. . . . . . . . . . . . . . . .5
  3.1  Automatic Link Generation                              5
  3.2  Support for Incremental Link Change                    6
  3.3  Hierarchical Structuring                               6
  3.4  Recording of Keywords, Figures and Tables              6
  3.5  Link Style Files                                       6
  3.6  A Search Engine                                        6
  3.7  A New Additions Page                                   6
  3.8  Easy Removal of curl-generated Links                   7
  3.9  Tools for Analysing Word Occurrences                   7
  3.10  Tools for Manipulating Links Outside the Document Hierarchy   7


4  A Small Example. . . . . . . . . . . . . . . . . . . .  . .7
  4.1  Automatic Link Generation                             10
  4.2  Support for Change                                    16
  4.3  Hierarchical Structuring                              23
  4.4  Link Style Files                                      23
  4.5  Removing Links                                        30


5  curl Features in Detail. . . . . . . . . . . . . . . . . .30
  5.1  How curl is Called and What it Does                   31
  5.2  The Structure of a Contents File                      32
  5.3  Necessary Files and Directory                         33



			1
-----------------------------------------



      5.3.1  dheader.sty, dfooter.sty, and arrows            34
      5.3.2  The dcnts.sty Style File                        36
      5.3.3  The keys.html File                              38
      5.3.4  The figs.html and tables.html Files             39
      5.3.5  The new.html File                               40
      5.3.6  The search.html File and its Search Engine      41
      5.3.7  The prev_contents File                          42
  5.4  curl Commands in HTML Files                           43
      5.4.1  %cnts and %fcnts                                43
      5.4.2  <b>Keywords</b>:                                43
      5.4.3  <b>Figure</b>: and <b>Table</b>:                44


6  Utilities. . . . . . . . . . . . . . . . . . . . . . . . .45
  6.1  decurl                                                45
  6.2  modtime                                               46
  6.3  no_link                                               47
  6.4  Word Occurrence Tools                                 47
      6.4.1  occurs                                          48
      6.4.2  occ_filt                                        49
      6.4.3  usedby                                          49
  6.5  Link Manipulation Tools                               52
      6.5.1  linkup                                          54
      6.5.2  delink                                          56


7  curl Drawbacks. . . . . . . . . . . . . . . . . . . . . . 56
  7.1  How curl Decides What Files Need Processing           56
  7.2  Hierarchical Separation                               57
  7.3  Deletion of Figure and Table Links                    57


8  Troubleshooting. . . . . . . . . . . . . . . . . . . . . .58
  8.1  Reporting Bugs                                        58


9  Obtaining curl. . . . . . . . . . . . . . . . . . . . . . 59


10 Installing curl. . . . . . . . . . . . . . . . . . . . . .60
  10.1  Upgrading to curl version 2.0                        60


11 General Licence Agreement. . . . . . . . . . . . . . . . .61



			2
-----------------------------------------



1   Introduction
================


This document is a user guide for curl version 2.0, a tool
for automatically generating the links between the pages comprising a
World Wide Web (WWW) document. curl examines a contents file containing
the file names of the individual pages, and modifies each file to
include the necessary links to its neighbours, parent, initial page,
and to pages listing the figures, tables, keywords and new pages in
the document.  These figures, tables, keywords, and new
additions pages are generated automatically by curl. curl can also
produce two kinds of contents lists, which can be automatically
inserted into pages.
   There is a search engine, available from every page, which
can scan the document for specified strings.  The matching
pages can be accessed from a search results page via dynamically
generated links.
    If the author wishes to add extra pages, remove some, or to reorder
pages, this is achieved by modifying the contents file. When curl
is invoked on the new version of the contents file it will modify the
links necessary to reflect the new WWW document structure.
    curl comes with a range of additional tools. For instance the
frequency of word occurrences in the document can be analysed in a
number of ways. This is useful when the document hierarchy is being
developed, or for deciding on keywords.
    A set of tools are included for linking pages that cannot be
connected easily within a document hierarchy.  An example
would be a page in the humour section of a newsletter and an
article in the editorial section which both discuss street maps. They
already have well-defined positions in the document (in the humour and
editorial sections) but could also be usefully inter-linked to capture
the street maps theme.
    The next section motivates curl by means of a small example, which
is used in later sections. Section 3 presents an overview of curl,
while section 4 develops the example. Section 5 explains curl in more
detail, while section 6 looks at the utilities which come with the curl
distribution. Section 7 discusses some of curl's drawbacks, and
section 8 is on troubleshooting. The steps involved in obtaining and
installing curl are described in sections 9 and 10. Section 11
contains a general licence agreement.
    A medium sized document (consisting of over 350 pages) built using
curl can be found at http://www.cs.mu.oz.au/ad/alp/archive.html.



2   Motivation
==============


The motivation for this work was the realisation that large WWW
documents, consisting of tens (perhaps 100's) of pages linked together,
are incredibly difficult to build, maintain, change, and extend. This
is *not* due to the HTML coding of the information on the pages, but
rather because of the numerous links *between* the pages.



			3
-----------------------------------------



    For instance, a common kind of WWW document configuration is shown in
Figure 1.


                          newsletter
                              |
                              |
            --------------------------------------
            |                 |                  |
         editorial          humour          related-info
            |                 |
            |                 |
            |            -----------
            |            |         |
            |         streets     nono
            |
            |
    -------------------
    |       |         |
  marks  pathology  whome


			Figure 1: A WWW Document


    The document is hierarchical, hence its tree-like form, with each
node corresponding to a page of the document. newsletter
introduces the newsletter, and contains links to the editorial and
humour sections, and to the related-info page. The editorial and
humour sections consist of a series of related pages which are reached
by links.
    The tree format is very common: its hierarchical nature reflects
the chapter, section, sub-section partitioning used in books,
magazines, manuals, etc. However, representing this as a WWW
network requires an enormous amount of work, because of the large
number of links between the pages needed to support browsing over
related topics, and movement between sections.  For instance,
pathology should have links to marks, whome (related pages), editorial
(the section header), and newsletter (the overall contents page).
editorial should have links to marks, pathology, whome (its articles),
humour and related-info (other sections), and newsletter (the contents
page).
    Building these links is error-prone; changing them is probably even
harder to get right. For example, if pathology was moved after
whome, then some or all of the links in marks, pathology, whome and
editorial would need to be changed.
    Documents of this kind often have separate pages listing the
tables, figures, keywords, and new pages. These pages increase the
complexity of the links in the document even further.
    As the size of a document increases, it becomes harder to find
things even when the document has a keyword index and a
hierarchical structure. Therefore a search engine is essential for
scanning the document and dynamically generating a page of links to
the interesting pages. This links page can be viewed as a simple kind
of `personalised tour', based around the user's interests.
    Often documents cannot be structured in a completely hierarchical
manner. For instance in the example above, whome and streets may
share a common theme which should be represented by a link between
them. curl comes with tools for generating such links, while retaining
the overall document hierarchy.



			4
-----------------------------------------



3   An Overview of curl Features
================================


There are 10 main features:

   1. Automatic link generation.

   2. Support for incremental link change.

   3. Hierarchical structuring.

   4. Recording of keywords, figures and tables.

   5. Link style files.

   6. A search engine.

   7. A new additions page.

   8. Easy removal of curl-generated links.

   9. Tools for analysing word occurrences.

  10. Tools for manipulating links outside the document hierarchy.

These features are described in the following sections.



3.1   Automatic Link Generation
===============================

curl addresses the linkage problem discussed in section 2 by
automatically generating all the links between the pages of a
hierarchical WWW document. All the author needs to do is write a
contents file. For the example in section 2, this would be:


   newsletter {
     editorial {
       marks
       pathology
       whome
     }
     humour {
       streets
       nono
     }
     related-info
   }


    Each name corresponds to the HTML file which holds the document
page (e.g. the marks page is stored in marks.html). Although the
pages are assumed to be correctly written in HTML, they do not need to
include any links which reflect the document format defined by the
contents file (there may be links, but these will be for other
purposes).



			5
-----------------------------------------



   Using the contents file, curl will modify the HTML files to include
all the necessary links to create the document. It can also
generate two kinds of contents listings.



3.2   Support for Incremental Link Change
=========================================

Changing links is simply a matter of reordering the contents file and
reexecuting curl. The out of date links are removed and new ones
generated. Adding or removing extra pages from the document is
achieved by adding or removing their file names from the contents
file.



3.3   Hierarchical Structuring
==============================

The hierarchical nature of the WWW document can be utilised in the
directory organisation of its HTML files. For instance, the humour
files streets.html and nono.html can be placed in a humour
subdirectory. curl can search over a directory tree for the HTML files
named in the contents file.



3.4   Recording of Keywords, Figures and Tables
===============================================

The files being processed can contain keyword information, and figure
and table captions.  curl collects these into three special
HTML files and builds links between them and their original files.



3.5   Link Style Files
======================

The format of the automatically generated links is defined in style
files, allowing the style to be modified. By default, links are added
both to the top and bottom of a file, and so there are separate style
files for these two cases.
    Link styles can be applied to a subset of the pages of a document,
allowing different subsections of a document to be linked
differently.
    Links can be represented either by text (e.g. Next, Up) or by
user-specified icons.



3.6   A Search Engine
=====================

Every document has its own search page. Given a set of search strings,
this page invokes a CGI script (written in C for speed) which searches
over the HTML pages of the document. It dynamically generates a page
of links to the pages containing some or all of the search strings.



3.7   A New Additions Page
==========================

New pages can be marked in the contents file with a `*', which causes a
link to the new page to be added to a `New Pages' HTML file. This
permits a frequent user to discover new pages without a lengthy
search.



			6
-----------------------------------------



    In addition, any contents lists which refer to a new page will be
marked with the new.gif icon or the word `NEW!'.



3.8   Easy Removal of curl-generated Links
==========================================

The links added by curl to the HTML files can be quickly removed by
running an application called decurl. This causes the HTML files to
return to their original form.



3.9   Tools for Analysing Word Occurrences
==========================================

The curl release includes utilities for collecting information
about how frequently words occur in the pages of a
document. This is useful for deciding on a choice of keywords
utilised in pages, and also for refining the document hierarchy. For
instance, pages that make frequent references to the same words should
perhaps be grouped together.



3.10    Tools for Manipulating Links Outside the Document Hierarchy
===================================================================

The document hierarchy is a useful structuring tool, but is not always
entirely sufficient.  The curl distribution includes utilities
for linking and delinking related pages without disrupting their
position in the document hierarchy.



4   A Small Example
===================


The example in this section is a more detailed version of the
newsletter document described above. It can be found at:

    http://www.cs.mu.oz.au/~ad/curl/example/

It is derived from a medium sized document (consisting of over 350
pages) which starts at:

    http://www.cs.mu.oz.au/~ad/alp/archive.html

   The directory holding the various HTML files (newsletter.html,
editorial.html, etc) is called example.  The directory must
contain a contents file, which is called lpn-contents in this
example (but any name can be used). There must also be 8 curl-related
files and a directory (called arrows) in example:

     dheader.sty     dfooter.sty     dcnts.sty      arrows
     keys.html       figs.html       tables.html
     new.html        search.html



			7
-----------------------------------------



Figure 2: The original newsletter.html



    These files and directory can be found in the Defaults
directory of the curl release, and should be copied over to each
directory where a new WWW document is being created.
    newsletter.html is shown in Figure 2. The only non-standard
feature is the %fcnts command on its own line, which signals to
curl that a full contents listing should be inserted at this spot in
the file. This is a list of the <TITLE> lines of all the HTML files
`below' this one in the document.
    editorial.html is shown in Figure 3. The %cnts command will cause
curl to insert a single-level contents listing at this point in the
file. A single-level contents is a list of the <TITLE> lines of the
files one level `below' this page in the document. For this example,
the <TITLE> lines will be copied from marks.html, pathology.html, and
whome.html.
    streets.html is shown in Figure 4.  Note the use of an
image which is labelled with the curl figure command
<b>Figure</b>:. When curl processes this file, the string following
the <b>Figure</b>:, up to the `.' (i.e. A Street Map) will be added
to the figs.html file. As the name suggests, figs.html holds links to
all the figures in the document.
    In a similar fashion, if streets.html contained a table it could be
labelled with the <b>Table</b>: command which would cause curl to
add its string to the table.html file. table.html holds links to all
the tables in the document.
    streets.html also illustrates the use of keywords in curl. Near
the top of the file is the line:

    <b>Keywords</b>: street, map. <p>

This will cause curl to add street and map to keys.html as keywords.



			8
-----------------------------------------



Figure 3: The original editorial.html



Figure 4: The original streets.html



			9
-----------------------------------------



4.1   Automatic Link Generation
===============================

The contents list shown in section 3.1 is stored in the file
lpn-contents. It is processed by curl like so:

    $ curl lpn-contents

The $ is the UNIX prompt. Afterwards, the code in newsletter.html
(Figure 2) will be transformed as shown in Figure 5. Three
blocks of new text have been added: a series of links near the top
of the file, a series of links near the bottom, and the %fcnts command
has been replaced by a list of links to all the files beneath
newsletter.html in the document.
    The page as displayed by netscape in shown in Figure 6.
    Note that the previous and next icons (the left and right
arrows) have red crosses through them (they may look black in this
user manual, but they really are red :)). This means that there is no
previous or next page links for this page. Also, if the Up or the Home
link icons are clicked upon, they return to newsletter.html since it is
the top level page of the document. Keys, Figs, Tables, Search, and
New are links to the lists of keywords, figures, tables, new pages, and
a search engine stored in keys.html, figs.html, tables.html,
search.html, and new.html respectively.
    Clicking on Editorials in the contents listing, causes netscape to
display the contents of the modified version of editorial.html, as
shown in Figure 7. The HTML code for this page is given in Figure 8.
Note that the Next link icon (the right pointing arrow) in
editorial.html goes to humour.html, which is the next subsection in the
document.
    The curl modified version of streets.html in netscape is shown in
Figure 9.  The <b>Figure</b>: command now has a link to
figs.html, which is displayed by netscape in Figure 10. Clicking on
`A Street Map' in figs.html returns the user to the <b>Figure</b>:
line of streets.html.
    The <b>Keywords</b>:  line in streets.html is not
clickable, but the keys.html file can be accessed from the links
at the top or bottom of the file by clicking on Keys. The keys.html
file looks like Figure 11 under netscape. The figure shows that the
`M' entry includes the keyword `map' and a link back to streets.html,
by clicking upon `streets'.
    Clicking on the New link at the top or bottom of the page loads
new.html into the browser, as shown in Figure 12.
    There are currently no entries since new additions are only
registered if a file name in the contents file is followed by a
`*'. For instance, assume that the contents file contains the
following:


   newsletter {
     editorial {
       marks
       pathology *
       whome
     }



			10
-----------------------------------------



Figure 5: The modified newsletter.html



			11
-----------------------------------------



Figure 6: newsletter.html displayed by netscape



			12
-----------------------------------------



Figure 7: editorial.html displayed by netscape



			13
-----------------------------------------



Figure 8: The modified editorial.html



			14
-----------------------------------------



Figure 9: streets.html in netscape



			15
-----------------------------------------



Figure 10: figs.html in netscape



     humour * {
       streets
       nono
     }
     related-info *
   }

    This would cause new.html to be altered to include links to
pathology.html, humour.html and related-info.html, as shown in
Figure 13. In addition, any contents lists which refer to these pages
will be modified to include a new.gif icon against the entries.
    Activating the Search link on a page loads search.html, which is
shown in Figure 14 after the user has entered the strings `street'
and `map'. When the Start Search button is pressed, the search engine
generates the page of links shown in Figure 15.
    The copy of search.html in each document needs to be configured
before it will access the search engine correctly. See section
5.3.6 for details.



4.2   Support for Change
========================

The pathology.html code generated by curl is given in Figure 16. Note
that the Prev link icon (the left pointing arrow) goes to marks.html
and the Next link icon to whome.html, as dictated by the layout in
lpn-contents.
    If the user now wants pathology.html to go after whome.html, then
lpn-contents should be altered so that the editorial subsection is:

    editorial {



			16
-----------------------------------------



Figure 11: keys.html in netscape



			17
-----------------------------------------



Figure 12: Empty new.html in netscape



Figure 13: new.html with 3 entries



			18
-----------------------------------------



Figure 14: search.html in netscape



			19
-----------------------------------------



Figure 15: Search Results



     marks
     whome
     pathology
   }

Reexecuting curl on lpn-contents will cause the necessary links in
pathology.html, marks.html, whome.html and editorial.html to be
recalculated.  The reordered pathology.html is shown in Figure 17.
    Unfortunately, the full contents listing in newsletter.html (see
Figures 5 and 6) will not be updated since the changes to the
links of pathology.html cannot be `observed' from newsletter.html
which is two levels above it.
    This illustrates a weakness of curl in that it only relinks the
HTML files which are directly linked to a moved file according to
the layout of the contents file. This means that files using %fcnts may
become out of date because they are not directly linked to all the
files mentioned in their contents listings. However, it is likely that
%fcnts will only be used on a few pages, and so it is easy enough to
follow the steps below to make those pages current.
    Firstly, use the UNIX touch utility to update the modification time
of the file (or files) using %fcnts:

    $ touch newsletter.html

Now rerun curl on the contents file. curl not only relinks files which have been



			20
-----------------------------------------



Figure 16: The modified pathology.html



			21
-----------------------------------------



Figure 17: Reordered pathology.html



			22
-----------------------------------------



reordered in the contents file since its last execution, but also any
which have been modified. This means that newsletter.html will be
relinked and its full contents listing will be corrected.
    A related problem is caused by the addition (or removal) of a `*'
against a name in the contents file. The parent page with a
contents list will be updated to include a new.gif icon against the
child's entry (or be updated not to have one). However, pages using
%fcnts may not be updated. As before, touch is required to update the
relevant page so that curl will reprocess it.
    Adding and removing pages from the WWW document is achieved by
adding or removing the relevant file names of the pages
from the contents file and reexecuting curl.



4.3   Hierarchical Structuring
==============================

The hierarchical nature of the pages of the document can be used to
organise the HTML files. For instance, marks.html, pathology.html, and
whome.html can be placed in a subdirectory called editorials,
and streets.html and nono.html can be moved to humour. This file
arrangement is specified in the contents file with the path command:

   editorial {
   path = editorials
     marks
     whome
     pathology
   }

   humour {
   path = humour
     streets
     nono
   }

Note that editorial.html and humour.html are still in the example
directory. A path command's scope starts from the beginning of the `{'
preceding it, and extends to the matching `}'.



4.4   Link Style Files
======================

The look of the links at the top and the bottom of a HTML file are
defined in two files dheader.sty and dfooter.sty, which act as default
style files for the links. The contents of the dheader.sty file in the
curl release is:

    <hr>
    <br>
    <i>%prev(prev.gif)</i>.
    <i>%next(next.gif)</i>.



			23
-----------------------------------------



    <i>%up(up.gif)</i>.
    <i>%home(home.gif)</i>.
    <i>%keys</i>.
    <i>%figs</i>.
    <i>%tables</i>.
    <i>%search</i>.
    <i>%new</i> <p>


    <hr> <p>

The file can contain a mix of HTML code and curl link
labels.  All of the labels are shown in the listing above. When
curl adds this style information to HTML files, the labels are replaced
with links to the corresponding pages in the document.
    curl link labels come in two varieties, both shown above. A label
can either be textual (e.g. %prev) or graphical (e.g.
%prev(file-name)). If the label is textual then the resulting HTML
file uses a piece of text to represent the link (e.g. Prev). If the
label is graphical then the link is represented by the picture in the
named file. All picture files must be located in the arrows directory
which must be in the top level directory for the document (e.g. in
example).
    If a link is required for a non-existent page (e.g. there is not a
previous file) then there are two possible outcomes. If a graphics
file is specified for the link (e.g. prev.gif), then curl attempts to
use the corresponding file prefixed with `no_' (e.g. no_prev.gif).
This is assumed to represent the case when there is no suitable link.
If a `no_' image file cannot be found, then the text `No <label name>'
is inserted into the HTML code (e.g. %prev is replaced by `No Prev').
    The curl distribution comes with a graphics utility called no_link
which is useful for generating `no_' images from the graphics
representing the links. It takes a specified GIF file (e.g. prev.gif)
and generates the corresponding `no_' version (e.g. no_prev.gif),
by putting a red cross through the image. More details on
no_link can be found in section 6.3.
    The dfooter.sty file contains similar information to dheader.sty:

    <hr>
    <br>
    <i>%prev(prev.gif)</i>.
    <i>%next(next.gif)</i>.
    <i>%up(up.gif)</i>.
    <i>%home(home.gif)</i>.
    <i>%keys(keys.gif)</i>.
    <i>%figs(figs.gif)</i>.
    <i>%tables(tables.gif)</i>.
    <i>%search(search.gif)</i>.
    <i>%new(new.gif)</i> <p>


    <hr>



			24
-----------------------------------------



It is possible to edit the style files, or to create new ones which
apply to some subset of the pages that make up the document.
    For instance, assume that dheader.sty is changed to contain only:

    <b>%prev(plain-left.gif)</b>  <b>%next(plain-right.gif)</b> <p>
    <br>

It is not possible to simply reexecute curl on the contents file and
have the new header style affect all the files. In fact, nothing will
be altered because none of the links implicitly defined inside
lpn-contents have changed.
    One solution is to touch all the HTML files that make up the
document, but using touch to do this can be time consuming since it
cannot be applied recursively to subdirectories. In the curl release
there is a small utility that does this, called modtime (see section
6.2). Invoking modtime in the example directory will cause it to
update the modification times of all the HTML files in that directory
and in those below it:

    % modtime

Now typing:

    % curl lpn-contents

will regenerate the links of every page of the document, thereby using
the modifications to dheader.sty. In netscape, streets.html now
looks like Figure 18. The arrows directory does not contain a
no_plain-left.gif file, and so the text `No Prev' represents the
absence of a left link.
    It is not generally useful to remove the %prev, %next,
%up, %home and %search labels from a style file since it
restricts the navigational capabilities of the resulting WWW document.
However, if the document does not contain any keywords, figures,
tables or new pages then %keys, %figs, %tables and %new can be
usefully deleted.


    A less drastic way of changing the header (or footer) style is to
specify a new style file to be used by some subset of the pages in
the document. This is done by using the head command in the contents
file (foot command for a new footer file).
    For instance, a new header style file, called dhd-humour.sty, is
defined like so:

    <img src="gball.gif"><i>%prev(blue-left.gif)</i>.
                    <i>%next(blue-right.gif)</i>. <p>
    <img src="gball.gif"><i>%up(blue-up.gif)</i>.
                    <i>%home(home.gif)</i>. <p>
    <img src="gball.gif"><i>%keys</i>.  <i>%figs</i>.  <i>%tables</i> <p>
    <img src="gball.gif"><i>%search</i>.  <i>%new</i>.  <p>


    <hr> <p>



			25
-----------------------------------------



Figure 18: streets.html using a simple dheader.sty



			26
-----------------------------------------



It will be used to modify the header style of the humour pages by
including the following head command in lpn-contents:

   humour {
   path = humour
   head = dhd-humour
     streets
     nono
   }

If there were subsections below humour, dhd-humour.sty would apply to
them as well.
    dhd-humour.sty must be placed in the humour subdirectory because of
the preceding path command.
    The HTML files in the humour subdirectory must have their
modification times updated, and then be relinked, in order
for them to use the new style settings:

    $ modtime humour      // invoked from the example directory
    $ curl lpn-contents

The outcome of the change for streets.html is shown in Figure 19 and
the netscape display is given in Figure 20; nono.html will be similarly
altered.


    There is a third style file, dcnts.sty, which specifies the layout
of the two kinds of contents listings. In the curl release, it
contains the following:

    <hr>
    <h2><img src="gball.gif"> Contents (still under construction)</h2>
    <ul>
    <li>%item <p>
    </ul> <p>
    <hr>

curl inserts this information in a HTML file when it encounters a
%fcnts or %cnts command. However, when curl finds a line containing
the %item label in the style file, that line will be repeatedly
inserted with %item replaced by a link. If %fcnts is being processed
then the links will be to all the HTML files below this one in the
document hierarchy. If a %cnts is being processed then the links will
be restricted to the files immediately below the HTML file.
    It is inadvisable to alter the:

    <ul>
    <li> %item <p>
    </ul> <p>

part of the style file since this specifies a legal HTML unnumbered
list. However, a sensible change might be to replace <ul> by <ol>, to
define a numbered list.



			27
-----------------------------------------



Figure 19: streets.html using dhd-humour.sty



			28
-----------------------------------------



Figure 20: The new style streets.html in netscape



			29
-----------------------------------------



    dcnts.sty contains a reference to a GIF file; the path
to this file is not altered when the style information is added
to a HTML file in a subdirectory below example. Therefore, it is
necessary to have a copy of the GIF file in every directory which
contains pages using dcnts.sty.
    A new contents style file for a subset of the pages in
a document can be defined in a similar way to new header and
footer styles, by means of the cnts command. For instance, the
following fragment from lpn-contents would specify a new contents
style for the humour pages:

  humour {
  path = humour
  head = dhd-humour
  cnts = dcnts-humour
     streets
     nono
  }

dcnts-humour.sty would have to be placed in the humour subdirectory.



4.5   Removing Links
====================

A possible concern for a curl user is the way it changes the HTML files
of a document without making backups of the original text. However,
these changes are almost all additive -- none of the text of the
original HTML file is deleted apart from the %fcnts and %cnts commands
which are replaced by contents listings. Also, the changes can be
easily reversed by calling decurl, a utility included with the curl
distribution. decurl can be applied to a single file, or to all the
files in a directory:

    $ decurl newsletter.html   // remove links from newsletter.html
    $ decurl humour            // remove links from files in humour
    $ decurl                   // remove links from current dir

When decurl is applied to a directory, it also applies itself to all
the subdirectories until the directory tree hierarchy is exhausted.
This means that all curl changes can be removed by calling decurl in
the example directory. For more information on decurl, see section
6.1.



5   curl Features in Detail
===========================

For someone wanting an overview of the capabilities of curl, the
earlier sections should be consulted. This section covers much of the
same material but in more detail. It is assumed that the reader has
studied the earlier sections.
    The following subsections will look at:

    * How curl is called and what it does.

    * The structure of a contents file.



			30
-----------------------------------------



    * The files and directory that must be included with every WWW document.

    * The curl commands that can be embedded in HTML files.



5.1   How curl is Called and What it Does
=========================================

The format of a curl call is:

    curl [-s] contents-file

For instance:

    $ curl lpn-contents
    $ curl -s another-contents

The contents file must be in the current directory and should contain
contents information as specified in the next subsection.  The
optional -s flag causes curl to be silent about HTML files which it
examines but does not change.
    curl analyses the contents file, which should specify the layout of
a WWW document in terms of its component pages. It then modifies
the HTML files corresponding to those pages to include explicit
HTML links to support the structure of the document.
    If the contents file is altered (e.g. some of the entries are
reordered) then the next time curl is applied to the contents file,
the links in the HTML files involving the reordered entries will be
regenerated to mirror the new order.
    curl decides which files to reprocess by working out the
changes to the contents file since it was last processed.
However, there are several kinds of link alterations within a HTML file
which are not visible in the contents file. These include changes to
lines using:

    * <b>Keyword</b>:

    * <b>Figure</b>:

    * <b>Table</b>:

For instance, the addition of a new keyword in a file can be viewed as
a new link from the file to keys.html. However, the contents file
does not capture that relationship.
    curl deals with this problem by looking at the
modification times of the HTML files. If a file has been
modified since the contents file was last processed then the file's
links are regenerated. This captures the link alterations caused by
changes to the <b>Keyword</b>:, <b>Figure</b>:, and
<b>Table</b>: commands, but also means that any kind of editing of a
HTML file will cause curl to reprocess it.
    There are two further link-related alterations which are not
automatically caught by curl. The first is a change to a link
style file (e.g. dheader.sty), which means that all the HTML files
using it should be reprocessed. Unfortunately, a change to a style
file affects neither the contents file nor the modification times of
the HTML files. In this case, the modtime utility can be used to



			31
-----------------------------------------



update the modification times of the relevant HTML files so that they
will be relinked with the new style when curl is next executed.
    The second problem is related to the use of %fcnts.  If
several files are rearranged, added or deleted, their new links
will be generated when curl is executed. However, curl will not
automatically reprocess files containing a full contents list unless
they are directly `above' the files in the document hierarchy. To keep
such files up to date, the user must explicitly update their
modification times (with modtime or touch) so that curl can reprocess
them.
    A related problem is when a page is marked with a `*' in a contents
page (or a `*' is removed). The page will be reprocessed and a
page with a contents list `above' the altered page will be regenerated
to include a new.gif icon (or not to have one). However, any pages
with a full contents list may not be updated automatically. modtime or
touch must be applied to these so that curl will reprocess them.



5.2   The Structure of a Contents File
======================================

The EBNF for information in a contents file is:

   contents  ::=  page


   page   ::=  name  [ '*' ]  [ '{' style page page* '}' ]


   style  ::=  [ 'path' '=' dir-name ]    [ 'head' '=' style-name ]
               [ 'foot' '=' style-name ]  [ 'cnts' '=' style-name ]


   name  ::=  word
   dir-name  ::=  word
   style-name  ::=  word
   word  ::=  letter ( letter | digit | '_' | '-' )*

p* means 0 or more occurrences of p, [p] means either 0 or 1
occurrences of p, and p|q means p or q.
    The file can also include comments, of the form:

         // any comment to the end of the line

A word can be at most 40 characters long, and a letter is any upper or
lower case alphabetic character. A name represents a HTML file name
without the .html extension. The optional `*' after a name signals to
curl that a link to the corresponding file should be placed in
new.html.
    Of note is the order of the four assignments defined by style,
which cannot be varied. For instance, it is not possible to put a cnts
assignment before a foot assignment.
    An assignment affects every name up to the end of the block in
which the assignment occurs. A block is defined as the statements
between the braces `{' and `}'.
    A path assignment such as:



			32
-----------------------------------------



   foo {
   path = d
     hoo
   }

has a meaning relative to the current directory, and any path
assignments in enclosing blocks.  For instance, if the current
directory is example, then the path assignment specifies the
subdirectory example/d.
    All the assignments and names following a path assignment
are relative to the specified subdirectory until the end
of the block containing the path assignment.
    The style-names used by the head, foot and cnts
assignments refer to files ending with .sty. These style files
will be used by all the HTML files until processing reaches the end of
the block where the styles were defined. The one proviso is if new
styles of the same type are defined in a nested block. These override
the outermost styles until the end of their scope.
    If no head, foot or cnts assignments are used in the
contents file, then the default styles files, dheader.sty,
dfooter.sty and dcnts.sty are utilised. These default files must
be located in the top level directory of the WWW document
(i.e. the one containing the contents file).



5.3   Necessary Files and Directory
===================================

Before curl is first applied to a contents file, 8 files
and one directory must be copied from the Defaults directory of the
curl release into the directory containing the contents file:

       dheader.sty    keys.html      new.html
       dfooter.sty    figs.html      search.html
       dcnts.sty      tables.html    arrows



Also, the search engine used by search.html must be compiled
and stored in the machine's designated CGI scripts directory, and
search.html must be configured to use it. The details will be
explained in section 5.3.6.
    After curl has been called once, a file called
prev_contents will appear in the directory. These 9 files and
the arrows directory are explained in more detail below, in the
following groupings:

    * dheader.sty, dfooter.sty and arrows

    * dcnts.sty

    * keys.html

    * figs.html and tables.html

    * new.html



			33
-----------------------------------------



    * search.html and its search engine

    * prev_contents


5.3.1   dheader.sty, dfooter.sty, and arrows
============================================

dheader.sty and dfooter.sty specify the layout of the links added to
the top and bottom of the HTML files which comprise the WWW document.
The style files contain HTML code which is embedded inside the HTML
files, but their main purpose is to interpret the 9 types of link
labels which can appear in these style files. These link labels are:

     %prev      %next      %up        %home
     %keys      %figs      %tables    %new       %search

These are called textual link labels for reasons which are explained
below. Each of these textual link labels has a variant which has
(file-name) after the label word. These are known as graphical link
labels.
    dheader.sty illustrates how link labels are used:

    <hr>
    <br>
    <i>%prev(prev.gif)</i>.
    <i>%next(next.gif)</i>.
    <i>%up(up.gif)</i>.
    <i>%home(home.gif)</i>.
    <i>%keys</i>.
    <i>%figs</i>.
    <i>%tables</i>.
    <i>%search</i>.
    <i>%new</i> <p>


    <hr> <p>

The textual link label words must be in lower case, and be separated by
at least one non-word character. If the labels are misspelled, they
are treated as text and copied into the HTML file uninterpreted.
    Each textual link label is replaced (where possible) by a URL for
 another HTML file in the WWW document. The URL substituted is
informally specified below:



			34
-----------------------------------------



     Link Command       URL Substitution
     ============       ================
     %prev		Link to the previous file at the same level.
     %next		Link to the next file at the same level.
     %up		Link to the parent file.
     %home		Link to the file at the top of the hierarchy.
     %keys		Link to keys.html, the keywords file.
     %figs		Link to figs.html, the figures file.
     %tables		Link to tables.html, the tables file.
     %new		Link to new.html, the new pages file.
     %search		Link to search.html, the interface to a search engine.


    The link labels %keys, %figs, %tables, %new and %search specify
links to keys.html, figs.html, tables.html, new.html and
search.html respectively, which are assumed to be present in the
directory containing the contents file.
    If there is no suitable file for a given link, then one of two
things will occur. If a graphical link label has been
included in the link command then curl looks for a file with that
name but prefixed with `no_' (e.g. no_prev.gif). The assumption is
that this file contains an image denoting the absence of a link. In
the curl distribution, these files contain the same image as the normal
link label but with a red cross through them. Such images can be
created using the curl utility, no_link, described in section 6.3.
    If curl cannot find a `no_' version of the image file, then the
label is replaced by `No <label word>'. For instance, if a file
was the last one at its level in the document then %next would be
replaced by `No Next' in that file.
    The graphical link labels have the same URL interpretation as the
textual labels, except that the HTML code which is generated uses
the image in the specified file as the representation of the link.
    An important point is that all the graphics files for
links must be in the arrows directory. curl checks whether a
specified file is located in arrows and issues a warning if it cannot
be found. In that case, curl uses the textual link label translation.
    The outcome of the translation of a HTML file by curl where the
default style files, dheader.sty and dfooter.sty were utilised, is
shown in Figure 5.
    The header information starts immediately after the <BODY>
HTML line and continues down to the <!-end-of-header -->
HTML comment. The footer information starts at the 
<!-- start-of-footer --> comment line and continues to the </BODY> HTML
line.
    curl will only add the header and footer details if it
finds <BODY> and </BODY> HTML lines. <BODY> and </BODY> can be
written in lower case.
    Note that the HTML code generated for a graphical link label has
the form:

    <img src="arrows/up.gif" alt="Up">

The src attribute specifies the graphics file, but there is also an alt
attribute setting which will be used if the document is
viewed using a non-graphical browser such as lynx. The alt
attribute settings are the same as the textual labels.



			35
-----------------------------------------



    It is inadvisable to edit any part of the header or footer
additions, since the changes will disappear if the file is
reprocessed. Reprocessing uses the comment lines (and the <BODY> and
</BODY> HTML lines) to determine how much text to delete from the file
prior to the links being regenerated. If any of these lines are
missing or incorrectly spelled then curl assumes that the file does not
contain header and footer information, and adds new links without
deleting anything.
    The dheader.sty and dfooter.sty files can be altered or new style
files defined. Any or all of the link labels can be left out of a
style file but this will lead to a reduction in the richness of the
links in the WWW document.


5.3.2   The dcnts.sty Style File
================================

The dcnts.sty file specifies the look of the contents listing
information generated by the curl commands %fcnts and %cnts. In a
HTML file being processed by curl, %fcnts and %cnts are replaced by the
text in dcnts.sty, which contains the following in the curl release:

    <hr>
    <h2><img src="gball.gif"> Contents (still under construction)</h2>
    <ul>
    <li>%item <p>
    </ul> <p>
    <hr>

This text is inserted almost unchanged, except that the the label
%item, and the line containing it, are interpreted. The line will be
repeatedly printed with %item replaced by a link to the HTML files
beneath this one in the WWW document. Thus, the %cnts command in the
original version of editorial.html is replaced by:

    <!-start-of-cnts -->


    <hr>
    <h2><img src="gball.gif"> Contents (still under construction)</h2>
    <ul>
    <li><a href="marks.html">Exam Marking</a> <p>
    <li><a href="pathology.html">21st Century Pathology</a> <p>
    <li><a href="whome.html">Working At Home</a> <p>
    </ul> <p>
    <hr>


    <!-end-of-cnts -->

The order of the links is the same as the order of the names in the
contents file. Each line consists of the URL to the file and a label,
which is built from the string enclosed in the <TITLE>...</TITLE> HTML
line in the file. The title line can also use lower case letters
<title>...</title> but not a mix of upper and lower case. To reduce
the search task, curl assumes that the title line is



			36
-----------------------------------------



within 20 lines of the top of the file. If no title line is found then
the name of the file is used.
    The %item line is reused until all the files immediately beneath
the current file have had their links listed.
    If a name in the contents file has a `*' after it, then the <li>
line has an additional <IMG> tag at the end, which will load the
new.gif image from the document's arrows directory.  On a browser
with no graphics support, the phrase `NEW!' will be displayed.
    The comment lines <!-start-of-cnt --> and <!-end-of-cnt -->
play a similar role to the comments inserted when curl processes
the header and footer style files (see the last section). They are
used as markers to allow any reprocessing of the file to strip out the
correct amount of text. Editing these comment lines is not a good
idea. If the start comment is changed then the contents will not be
stripped out of the file. If the end comment is changed, reprocessing
will ignore that file after an error message has been issued. This
avoids an update which may delete too much text.
    The dcnts.sty file can be altered, or new style files defined, but
a HTML list construct with a single use of %item should always be
included. Multiple occurrences of %item are treated as ordinary text
after the first one has been processed.
    Files which use the %fcnts command are processed by curl in a
similar way to those using %cnts. The difference in output can be
seen by examining the full contents of the original version of
newsletter.html:

    <!-start-of-fcnts -->


    <hr>
    <h2><img src="gball.gif"> Contents (still under construction)</h2>
    <ul>
    <li><a href="editorial.html">Editorials</a> <p>
    <ul>
    <li><a href="marks.html">Exam Marking</a> <p>
    <li><a href="pathology.html">21st Century Pathology</a> <p>
    <li><a href="whome.html">Working At Home</a> <p>
    </ul> <p>
    <li><a href="humour.html">Humorous Implications</a> <p>
    <ul>
    <li><a href="streets.html">Where The Streets Have No Names</a> <p>
    <li><a href="nono.html">Nonograms</a> <p>
    </ul> <p>
    <li><a href="related-info.html">Some LP Links</a> <p>
    </ul> <p>
    <hr>


    <!-end-of-fcnts -->



			37
-----------------------------------------



The utilisation of the %item line in dcnts.sty is more complicated
since curl must produce a contents listing with multiple levels. When
a link is generated for a file, it is formatted using the %item line,
in a similar way to the %cnts command. However, if the page in the
file has subsections, then they must also be converted into contents
lines. This can be seen in newsletter.html where the three subsections
of the editorial page are listed before the humour page and its
subsections.
    The subsections are generated by adding a <ul> line to the HTML
file, then a contents line for each subsection, and a </ul> line to
conclude the nesting. Although the format of the contents lines for
the subsections is governed by the %item line, the inclusion of the
<ul> and </ul> lines is hardwired into curl. In other words, it is
only possible for a user to alter the list format at the outermost
level by changing the text in the style file.
    If a subsection has sub-subsections then these are output to the
HTML file before the other subsections.


5.3.3   The keys.html File
==========================

This file must be located in the directory holding the contents file,
and its name should not be changed.  The keys.html file
supplied with the curl release contains 26 empty unnumbered lists,
of the form:

    <!-a -->
    <img src="gball.gif" alt=""> <A NAME = "A">A</A>.
                          <a href="#TOP">To Top</a><p>
    <ul>
    </ul> <p>

At the top of the file, after the title, there is a paragraph of links
to the unnumbered lists.
    keys.html can be altered in several ways. For instance,
the title can be changed, and extra paragraphs added as a
preamble to the unnumbered lists. However, the links paragraph should
be retained so that the file can be searched efficiently. Extra text
can be added between the unnumbered lists, and at the end of the file
after the last list. The format of the unnumbered lists should not be
altered.
    As curl processes the HTML files, new <li> lines are added to each
list, of the form:

    <li>keyword: <a href="file1.html>name1</a> ...
                      <a href="fileN.html>nameN</a> <p>

Each <li> line is for a single keyword, and the lines are
sorted in ascending alphabetical order by keyword. The names in a
keyword line are also in ascending alphabetical order, and act as
references back to the files where the keywords occur. A name is taken
from the HTML file name, without the .html extension.
    A user can delete <li> lines without affecting the operation of
curl although it will regenerate them when next invoked, if the
keywords are still used. Also,



			38
-----------------------------------------



particular references within a <li> line can be deleted manually, but
care should be taken to delete all the characters from one `<a href'
up to the next (or up to the <p> at the end of the line).
    An alternative approach is to put a `-' in front of the keyword in
the HTML file, and reprocess it using curl. This will cause the
reference to that keyword to be correctly deleted from the keys.html
file. See section 5.4.2 for more details.
    A good choice of keywords is important, and often
requires a knowledge of how often words occur in the
document, or in a particular section.  The curl distribution
comes with three tools, occurs, occ_filt, and usedby, which generate
this kind of information. See section 6.4 for more details.


5.3.4   The figs.html and tables.html Files
===========================================

Both of these files must be located in the directory containing the
contents file, and their names should not be changed. The two files
are described together since they have a similar internal form
and have similar restrictions on their use. The figs.html file
made available in the Defaults directory of the curl release is:

    <html>
    <head>
    <TITLE>Figures File</TITLE>
    </head>
    <body>
    <H1>Figures File</H1>


    A list of the figures for this WWW document: <p>


    <ul>
    </ul> <p>


    </body>
    </html>

The version of tables.html in the release is:

    <html>
    <head>
    <TITLE>Tables File</TITLE>
    </head>
    <body>
    <H1>Tables File</H1>


    A list of the tables for this WWW document: <p>


    <ul>
    </ul> <p>



			39
-----------------------------------------



    </body>
    </html>

As curl finds <b>Figure</b>: and <b>Table</b>: lines in the HTML file
(see section 5.4.3 for more on these commands), keys.html and
tables.html are modified by having <li> lines added to their unnumbered
lists. The format of a <li> line is:

    <li> <a href="file#lineno">string</a> <p>

The lineno is a string representing the line number where the figure
(or table) appears in the original HTML file. It is used by an anchor
in that file to uniquely identify the figure (or table).
    The association of an anchor with each figure and table means that
when a link is followed from figs.html (or tables.html), the figure
(or table) will be displayed by the browser immediately, even if it is
some distance from the top of the page.
    Each time curl processes a HTML file containing figures or tables,
a list is built which is added to the end of the
unnumbered list in keys.html (or tables.html). When the new
figures (or tables) are added, any previous references to the file
are deleted from the list. Consequently, it is unlikely that the order
of the figures and tables in their lists will reflect the order of the
HTML files in the document.
    Users may alter the <TITLE> lines of keys.html and tables.html, and
add new paragraphs before and after the unnumbered list. However,
the format of the list should not be altered, although it is safe to
delete <li> lines or reorder them.


5.3.5   The new.html File
=========================

new.html must be located in the directory containing the contents file,
and its name should not be changed. The new.html file supplied with
the curl release has the form:

    <html>
    <head>
    <TITLE>New Pages in the Document</TITLE>
    </head>
    <body>
    <H1>New Pages in the Document</H1>


    The titles of the <b>new</b> pages in the document
    are listed below, along with links to the pages. <p>


    <ul>
    </ul> <p>



			40
-----------------------------------------



    </body>
    </html>

As curl processes the contents file, names followed by a `*' are tagged
as new pages.  For each new page, a <li> line is added to
the unnumbered list in new.html, of the form:


    <li> <a href="file">Title</a><p>


Each time curl processes the contents file, the new pages
list is completely rebuilt. Also, the addition or removal of a `*'
against a name in the contents file will cause curl to process the
associated HTML file.
    Everything in new.html can be modified except for the <ul> and
</ul> tags. Any changes to a <li> line will be lost when curl is
next executed.


5.3.6   The search.html File and its Search Engine
==================================================

search.html is a forms interface to sk, a CGI script written in C,
which carries out the actual search over the document.
    sk.c can be found in the src directory in the curl release, and
should be compiled like so:


    $ gcc -o sk sk.c


It can also be compiled with cc.
    sk should be placed in the CGI scripts directory on the local machine.
Although there needs to be a separate copy of search.html in each WWW
document processed by curl, only a single copy of sk is required in the CGI
scripts directory.
    The copy of search.html needs to be customised in three places:


    <FORM method="POST" action="URL-of-sk">


    <INPUT type="hidden" name="path"
             value="UNIX-path-to-directory">


    <INPUT type="hidden" name="upath"
             value="URL-of-directory">


    sk's URL must be placed in the action field of the
form, while the two value fields must be adjusted to
refer to the directory holding this copy of search.html.
    For instance, the URL of sk on my machine is:

    http://www.cs.mu.oz.au/cgi-bin/sk

The UNIX path to the directory holding the newsletter example of
section 4 is:

    /home/staff/ad/www_public/curl/example



			41
-----------------------------------------



The URL of that directory is:

    http://www.cs.mu.oz.au/~ad/curl/example

Thus, the relevant fields of search.html for the newsletter example are:


    <FORM method="POST"
             action="http://www.cs.mu.oz.au/cgi-bin/sk">


    <INPUT type="hidden" name="path"
             value="/home/staff/ad/www_public/curl/example">


    <INPUT type="hidden" name="upath"
             value="http://www.cs.mu.oz.au/~ad/curl/example">


    A search is initiated by the user entering up to 5 strings, as
shown in Figure 14 (case is ignored in the strings).
    sk searches over the document, restricting its examination
to files ending with `.html'.  Once the search is
completed, an HTML page is dynamically generated which contains a
list of page titles, together with links to the pages. If a title
cannot be found in a page, then the filename is used as the link label
(see Figure 15).
    Each line in the list includes a series of scores in brackets.
    These are the number of lines on the page that contain the search
strings (which are listed at the top of the results page).
    The lines are ordered using two sorting strategies. Firstly, they
are sorted into decreasing order using the values obtained by
multiplying the search scores together. If this gives two or
more lines with the same value, then they are sorted into
decreasing order using the values obtained by adding their search
scores.
    The output from sk lists the titles of at most 30
pages.  The number of matching pages is reduced by several
filtering criteria. Pages are rejected when over half of their search
string scores are 0. However, if one of the scores is 3 or greater
then it may be included regardless of the other scores.
    sk uses the UNIX utility fgrep with two options: -i to ignore
case, and -c to return matching line counts only. In
addition, it utilises some slightly unusual C headers, namely
fcntl.h, sys/types.h, sys/stat.h and dirent.h.


5.3.7   The prev_contents File
==============================

The prev_contents file is generated by curl at the end of
its processing in order to record details about the contents file.
This is useful when curl next processes the contents file, and changes
have to be detected.
    curl reprocesses a HTML file in two situations: (i) if the
contents file has been altered, necessitating a relinking of the
HTML file; (ii) if the file has been modified since curl was last
applied to the contents file. To be more precise about this second
case, the modification time of the HTML file is compared



			42
-----------------------------------------



with the modification time of prev_contents to see which is more
recent. Thus, curl can be controlled by the judicious use of touch on
the HTML file and/or prev_contents. However, this kind of `hacking' is
rarely required in practice.



5.4   curl Commands in HTML Files
=================================

This section looks at the curl commands which can appear in
HTML files. They will be considered in three groups:

    * %cnts and %fcnts

    * <b>Keywords</b>:

    * <b>Figure</b>: and <b>Table</b>:


5.4.1   %cnts and %fcnts
========================

Both %cnts and %fcnts must appear on their own lines, with no white
space before or after them, and be written in lower case. The actions
caused by the commands are detailed in section 5.3.2 on dcnts.sty.
    If a file with a %cnts or %fcnts does not possess any subsections
then an error message is issued and the commands are not
interpreted. If the default dcnts.sty file (or a user-defined version)
cannot be found, an error is output and the commands are not
processed.


5.4.2   <b>Keywords</b>:
========================

The format of this command is:

    <b>Keywords</b>: key1, key2, ... keyN.

<b>Keywords</b>: must start on a new line and be written exactly as
shown. White space before the beginning of a keyword is ignored, but
after the first alphabetic character, the key can include white space
until a `,' or `.' terminates the key. A syntax error is reported if
there is no `.' at the end of the line. If there are multiple
occurrences of the same keyword, the duplicates are ignored.
    A key can be preceded by a `-' which indicates that it should be
deleted from keys.html.
    As mentioned in section 5.3.3, keys.html separates keys into 26
unnumbered lists, one list for each lower case letter of the
alphabet. Thus, before the key is stored, its letters are converted
into lower case.
    The keywords are in ascending alphabetical order within each
unnumbered list, one keyword per line. The format of a keyword
line is:

     <li>keyword: <a href="file1.html>name1</a>  ...
                      <a href="fileN.html>nameN</a> <p>



			43
-----------------------------------------



The file names are the names of the HTML files containing the keywords,
and the names are the file names without the path or .html extension.
The name references are in ascending order.
    To illustrate keyword insertion, consider the affect of adding the
keyword anchor from the file foo.html to the keyword line:

    <li>anchor: <a href="bar.html>bar</a> <p>

A reference to foo is inserted after the bar reference:

    <li>anchor: <a href="bar.html>bar</a> <a href="foo.html>foo</a> <p>

If foo.html is subsequently reprocessed, the keyword is not
inserted again, and a message announces that the keyword and reference
pair already exists in keys.html:

    anchor key already has a foo reference

If the keyword line in foo.html is altered to:

     <b>Keywords</b>: -anchor.

then the reprocessing of foo.html will result in the reference being
removed, returning the keyword line to its original form.
    If foo.html is processed again, the fact that the reference does
not occur with the keyword is reported:

    foo reference cannot be deleted since not in anchor key


    It can be difficult to choose keywords which describe a page
without them being too general (and sometimes too narrow). curl
comes with tools for analysing the frequency of word occurrences within
pages, and across the entire document, which can help with the choice
(see section 6.4 for more information).


5.4.3   <b>Figure</b>: and <b>Table</b>:
========================================

The format for these commands is very similar:

    <b>Figure</b>: string. <p>
    <b>Table</b>: string. <p>

<b>Figure</b>: and <b>Table</b>: must start on a new line, and be
written as shown. White space will be ignored after the `:' until the
first alphabetic character. When a `.' is reached, the string is
completed; if the end of the line is encountered before a `.' then an
error is reported.
    Any text after the `.' apart from a <p> is ignored and will be
deleted when curl processes the command. In its place, curl adds a
link to the keys.html file (or tables.html) and an anchor label
generated from the line number of the command. For example, consider
the following Figure command in the original version of streets.html:



			44
-----------------------------------------



    <b>Figure</b>: A Street Map. <p>

curl converts it into:

    <b>Figure</b>: A Street Map. <a href="figs.html">To Figures</a>
                  <a name="24">.</a> <p>

In figs.html, the other end of the link is specified as:

    <li> <a href="streets.html#24">A Street Map</a> <p>

The use of the anchor name 24 as part of the figure allows the figure
line to be displayed immediately when a jump is made from figs.html to
streets.html.



6   Utilities
=============


The curl release comes with a range of utilities, which will be
described in the following groupings:

   1. decurl

   2. modtime

   3. no_link

   4. Word Occurrence Tools: occurs, occ_filt, usedby

   5. Link Manipulation Tools: linkup, delink



6.1   decurl
============

decurl removes the link information added by curl. The format of a call is:

    decurl [ HTML-file | directory ]

For example:

    $ decurl newsletter.html
    $ decurl humour         // decurl HTML files in humour
    $ decurl                // decurl HTML files in the current dir

    If decurl is supplied with a file argument, its extension should be
.html or an error is reported. Even if the file ends with .html,
decurl will not alter it unless it contains link information generated
by curl.
    The following link details are removed:

    * the header links

    * the footer links

    * the links added to the <b>Figure</b>: and <b>Table</b>: lines



			45
-----------------------------------------



    * contents listings, replacing them with the appropriate %fcnts 
      or %cnts commands

decurl deletes the header, footer and contents listing information by
searching each HTML file for the link comment lines added by
curl.  Therefore it is inadvisable to alter these lines:

      <!-end-of-header -->
      <!-start-of-footer -->
      <!-start-of-cnts -->
      <!-end-of-cnts -->
      <!-start-of-fcnts -->
      <!-end-of-fcnts -->

decurl also makes use of the <BODY> and </BODY> HTML commands to
delimit the curl information. Both of these commands should be on
their own lines.
    If any of these lines are altered, decurl will decide that the file
has not been processed by curl, leave it unaltered, and print a
message.
    The <b>Figure</b>: and <b>Figure</b>: links are removed by
searching for lines beginning with these strings. If they are
found then the text after the first `.' is deleted and replaced by
<p>. For instance:

    <b>Figure</b>: A Street Map. <a href="figs.html">To Figures</a>
                  <a name="24">.</a> <p>

becomes:

    <b>Figure</b>: A Street Map. <p>

    If decurl is given a directory argument then it applies itself to
all the suitable files in the directory, and to those in any
subdirectories.
    If decurl is called with no arguments then it applies itself to all
the suitable files in the current directory, and to those in any
subdirectories.



6.2   modtime
=============

modtime updates the modification time of HTML files. The format of a
call is:

    modtime [ HTML-file | directory ]

For example:

    $ modtime newsletter.html
    $ modtime humour         // modify HTML files in humour
    $ modtime                // modify HTML files in the current dir

If modtime is supplied with a file argument, its extension should be
.html or an error is reported. If the file ends with .html, then the
UNIX utility touch is used to update the file's modification time.



			46
-----------------------------------------



    If modtime is given a directory argument then it applies
itself to all the suitable files in the directory, and to those
in any subdirectories.
    If modtime is called with no arguments then it applies itself to
all the suitable files in the current directory, and to those in
any subdirectories.
    modtime extends the functionality of touch by being
implicitly recursive, but also restricts its actions to HTML
files.



6.3   no_link
==============

no_link generates a new version of the GIF file supplied to it,
placing a red cross through the image, and prefixing the filename with
`no_'. The format of a call is:

    no_link GIF-file

For example:

    $ no_link prev.gif       // generates no_prev.gif

The main reason for including no_link in the curl release is as a way
of easily creating icons which represent the absence of a suitable
link.
    When curl is processing a particular page, it attempts to use GIF
images to represent the links it is adding.  The choice
of GIF is obtained from the graphical link label (see section
4.4). For instance, %prev(prev.gif) means that prev.gif in the
arrows directory should be used to represent a link to the previous
page.  However, if such a link is not possible (because
there is no previous page) then curl tries to use the `no_'
version of the GIF (e.g. no_prev.gif).
    A potential drawback with no_link is its reliance on the gd
graphics library, developed by Thomas Boutell. This library can be
downloaded using anonymous FTP from isis.cshl.org in the subdirectory
pub/gd. After it has been installed, the gd and maths libraries
must be included in the compilation of no_link.c:

    $ gcc -o no_link no_link.c -lgd -lm

    gd contains a wide range of functions for manipulating GIF images,
allowing no_link to be easily altered to use a different `no link'
representation.
    An alternative to using no_link is to modify images using a tool
like xv. The original idea for `no link' images came from Adonis El
Fakih (eazl@gpd.plh.af.mil) who used xv to create gray versions of
icons to denote the `no link' meaning. This can be achieved by setting
the image's saturation to -80% and reducing its brightness.



6.4   Word Occurrence Tools
===========================

There are three curl utilities concerned with word occurrences:

   1. occurs



			47
-----------------------------------------



   2. occ_filt

   3. usedby

One way of using these utilities is to analyse a document to improve
its hierarchical structure. For instance, if several pages are
concerned with `constraints', then this might indicate that a section
on constraints should be present in the document.
    A second use of these tools is to develop a set of keywords which
describe a broad range of pages. These keywords can be added to
the relevant pages, and curl can use them to extend keys.html (see
section 5.4.2 for more information).


6.4.1   occurs
==============

occurs can analyse an HTML file, or a directory (and all its
subdirectories), producing a list of words in alphabetical order
together with their number of occurrences.  The recursive
subdirectory search employed by occurs can be switched off with
the -s command line option. Also, the -m option can be used to set
a minimum number of occurrences which must be registered
before a word/frequency pair is printed out. The format of a call
is:

    occurs [ -s ] [ -m number ]  HTML-file | directory

For instance:

    $ occurs newsletter.html  // list word occurrences in the file


    $ occurs "."            // list word occurrences in the
                            // current directory and all its
                            // subdirectories


    $ occurs -m 3 "."       // list words with 3 or more
                            // occurrences


    $ occurs -s humour      // list words occurrences from
                            // the humour directory only

    occurs looks for a file called ignores.txt in the directory where
the analysis begins. A suitable ignores.txt file is included in
the curl distribution in the utils/occurs directory. It contains list
of words which can be ignored, such as HTML tags (head, body, etc) and
common words (the, of, and, etc). The common words were obtained
from the Brown corpus; for details see Computational Analysis of
Present-day American English, H. Kucera and W.H. Francis, Brown
University Press, 1967. My thanks to Alistair Moffat
(alistair@cs.mu.oz.au) for suggesting this useful source.
    If ignores.txt is not found then occurs processes every word. It
makes no distinction between upper and lower case words, and
assumes that a word consists of only alphabetical characters.
    For the newsletter example of section 4, the call:



			48
-----------------------------------------



    $ occurs -m 2 "."

produces the output shown in Figure 21.
    A minor drawback with occurs is that when it analyses an entire
document (e.g. occurs ".") then the processing includes the files
keys.html, figs.html, tables.html, search.html, and new.html.  In
particular, the presense of keys.html may skew the results. This
can be avoided by temporarily renaming keys.html so it does not have a
`.html' extension.


6.4.2   occ_filt
================

occ_filt selects word/frequency pairs from the output of
occurs, based on minimum and maximum word frequencies supplied by the
user. The format of a call is:

    occ_filt occurs-list min max

The occurs-list can be obtained from a prior call to occurs:

    $ occurs -m 2 "." > ol
    $ occ_filt ol 6 8

occ_filt helps to deal with the problem of developing a meaningful set
of keywords based on the often voluminous output from
occurs.  Useful keywords typically occur in the middle of the
frequency range for all the words. occ_filt allows words with
frequencies in this middle area to be extracted, without requiring
occurs to be called again.
    occ_filt assumes the occurrences list contains the line:

    Word Occurrences

It also assumes that the word/frequency pairs are given in the form
`word:  number'. Thus, it is safe to delete the Reading: lines at
the beginning of the occurrences list, and even the underlined letter
headings.
    If the output of occurs shown in Figure 21 is passed to occ_filt
with a frequency range of 6 to 8, then the results are as shown in
Figure 22.
    The missing underlined letter headings mean that there are no words
under that heading in the original occurrences list. A letter
heading with no entries means that there are entries in the original
list, but they occur with a frequency outside the prescribed range
given to occ_filt.


6.4.3   usedby
==============

Given a list of words, usedby lists all the HTML files containing those
words.
    This utility can be used to relate a set of keywords (perhaps
selected with the aid of occurs and occ_filt) back to
their original files.  Once the user knows the source of the
keywords, those files can be edited to contain suitable
<b>Keywords</b>: lines.



			49
-----------------------------------------



Figure 21: Word Occurrences in the newsletter Document



			50
-----------------------------------------



Figure 22: Filtered Word Occurrences in the newsletter Document



			51
-----------------------------------------



Figure 23: usedby search of the newsletter Document



    Another use of usedby is as a search utility, which can be deployed
without going via search.html and the CGI search engine.
    usedby can process a single HTML file, a single directory, or a
directory and all of its subdirectories. The words used in the
search can be entered at the command line or be read from a file with a
`.txt' extension. A maximum of 30 search words are allowed (on the
command line or in the file), and the search does not distinguish
between upper and lower case. A file is listed if it contains at least
one of the search words.
    An additional command line parameter (-m number) sets the minimum
number of occurrences. The only HTML filenames printed will be
those containing at least one search word occurring with that frequency
(or higher).
    The format of a call is:

    usedby [-s] [-m num] (HTML-file | directory) wd1 [wd2] ... [wd30]
or
    usedby [-s] [-m num] (HTML-file | directory) txt-file

For example:

    $ usedby -m 3 "." street pathology  
                     // search the HTML files in the
                     // current directory and below for
                     // at least 3 occurrences of 'street'
                     // and 'pathology'


    $ usedby -s humour wds.txt   
                      // search in the humour directory
                      // for the words in wds.txt

The output generated by the first example when applied to the
newsletter example of section 4 is shown in Figure 23.



6.5   Link Manipulation Tools
=============================

linkup and delink, support a form of page linking not possible with
curl. For instance, consider the newsletter document in Figure 24.



			52
-----------------------------------------



                          newsletter
                              |
                              |
            --------------------------------------
            |                 |                  |
         editorial          humour          related-info
            |                 |
            |                 |
            |            -----------
            |            |         |
            |         streets     nono
            |
            |
    -------------------
    |       |         |
  marks  pathology  whome


			Figure 24: The newsletter Document



    This grouping reflects the fact that mark, pathology, and
whome are all editorials, while streets and nono are humorous
pieces. However, there may be other ways of relating some of these
articles, which it would be helpful to include in the hierarchy.
    For example, if whome, nono and related-info mention a common
topic, such as street lighting, then it may be useful to link them
together, as in Figure 25.


                          newsletter
                              |
                              |
            --------------------------------------
            |                 |                  |
         editorial          humour          related-info
            |                 |               /
            |                 |              /
            |            -----------        /
            |            |         |       /
            |         streets     nono----/
            |                    /
            |                ---/
    -------------------     /
    |       |         |    /
  marks  pathology  whome-/



Figure 25: The Extended newsletter Document


    This linking can be carried out by linkup, and such links can be
removed with delink.
    It should be emphasised that this form of linking is separate from
curl. If a page is changed by curl (e.g. whome is moved) then the
user must still use delink and linkup to modify the additional links.



			53
-----------------------------------------



Figure 26: Linked marks.html



6.5.1   linkup
==============

linkup alters a specified group of files so that they each
contain a labelled unnumbered list of links to the other files in the
group. These links are labelled with the titles of the other files.
    The format of a call to linkup is:

    linkup links-file

The links-file must contain the URL of the top-level directory of the
document (i.e. the one holding the contents file). The URL should
end with a '/'. Next, there must be a title line for the unnumbered
lists added by linkup. Finally, there must be a sequence of
filenames (one per line), together with their UNIX paths from the
top-level directory.
    A links file (called links-info) for the example above would
contain:

    http://www.cs.mu.oz.au/~ad/curl/example/


    Street Lighting


    editorials/marks.html
    humour/nono.html
    related-info.html

Blank lines in the links file are ignored by linkup.
    The specified HTML files each have an unnumbered list
added to them, inserted either just before the </body> tag or the
<!-start-of-footer --> tag. This latter case deals with HTML files
which have already been processed by curl_
    Figure 26 shows the processing of links-info by linkup.
marks.html is updated as shown in Figure 27.



			54
-----------------------------------------



Figure 27: Linked marks.html



			55
-----------------------------------------



    The text of the unnumbered list can be altered, but the
<!-start of links --> and <!-end of links --> lines
should not be touched. These are used by delink for removing the links
text.


6.5.2   delink
==============

A call to delink has the form:

    delink links-file

The same links file can be used with delink as employed by linkup.
    delink removes the text it finds between the 
<!-start of links --> and <!-end of links --> comment lines in the
files named in links-file. If any of the comments are missing from a
particular file then that file is left untouched.



7   curl Drawbacks
==================


This section outlines some of the known drawbacks with curl.
Undoubtedly, other problems will be identified, and I will endevour to
address them in future releases. For my contact address, see the start
of this user guide.
    Currently, there seem to be three main drawbacks:

   1. How curl decides what files need processing.

   2. Hierarchical separation.

   3. Deletion of figure and table links.



7.1   How curl Decides What Files Need Processing
=================================================

Section 5.1 describes how curl uses changes to the contents file and
the modification times of HTML files to decide what files should be
processed.
    The problem with using the modification time is that it is too
permissive a criteria, and also still manages to exclude two
important cases. These are: (i) the reprocessing of files when a
style file (for headers, footers, or contents listings) is altered;
(ii) the reprocessing of files that use %fcnts when contents file
entries many levels deeper in the hierarchy are changed.
    One of the aims of the curl implementation is to avoid reparsing
all the files each time a change is made to the WWW document. The
reason being that such a document may consist of tens (or 100's) of
pages and files. Complete reparsing of all the files after every
change would be inefficient and slow.
    Originally, it was hoped that the contents file would supply
enough information to determine what needed to be reprocessed.
However, the presence of HTML files containing links related to
keywords, figures and tables means this is impossible. Using
modification times to check the files is less expensive than reparsing
them.



			56
-----------------------------------------



    A possible alternative approach is to modify the contents
file format to include extra details about keywords,
figures and tables used by each page. However, no simple
syntax suggests itself, and it also seems more natural to
place such information in the associated HTML file.



7.2   Hierarchical Separation
=============================

The syntax of the contents file allows pages to be grouped in blocks
specified by `{' and `}'. For instance:

   humour {
     streets
     nono
   }

The humour page can be viewed as having two subsections, called streets
and nono.
    Using a path assignment, it is possible to specify that the
streets.html and nono.html files are in a subdirectory called
humour:

   humour {
   path = humour
     streets
     nono
   }

However, humour.html remains in the directory above humour.
    Perhaps humour.html, which is probably only a contents page for the
humorous pages, should be located in the humour subdirectory?
However, if the path assignment is moved out to the level containing
the humour page, it will also force all the other pages at that level
(e.g. editorial and related-info) to be in the humour subdirectory.
    A solution may be to change the syntax and/or semantics of the
contents file so that a path assignment also applies to the name
immediately before the `{'.



7.3   Deletion of Figure and Table Links
========================================

When a keyword needs to be deleted from keys.html, it is possible to
add a `-' prefix to the keyword in the relevant <b>Figure</b>:
line.  When curl encounters this symbol it knows that the keyword
entry in keys.html should be deleted.
    There is no such similar operation for deleting figure and table
links from figs.html and tables.html. A user must manually delete
the offending li lines.



			57
-----------------------------------------



8   Troubleshooting
===================

Many errors, such as missing files or incorrect syntax in the contents
file and HTML files, are reported by curl. A close examination of the
messages issued by curl will allow most errors to be detected.
    It is a good idea to examine the HTML files generated by curl, and
especially to check the file names used by the links. If a link
command has been misspelled in a style file, the text will be copied
into the HTML file unchanged.
    Perhaps the most common error is to generate a link to a file which
does not exist. This is usually due to a misspelling of its name
in the contents file, or to a misspelling of its subdirectory in a path
assignment. The fact that the file cannot be found will be reported
when curl tries to process it.
    Care should be taken with the spelling of style file names in the
contents file, and these should be checked against the actual file
names which should end with .sty. However, curl will report a
`missing' style file when it tries to use the style to modify a HTML
file.
    Don't forget the decurl and modtime utilities, which are very
useful when a document is being built.



8.1   Reporting Bugs
====================

Although the code in the curl release has been tested in
depth, bugs still occasionally arise (three in the last year).
    Any bugs should be reported to Andrew Davison (see my
address at the start of this manual), and they will be fixed as
quickly as possible.
    It would be a great help if a bug report could include output from
curl (or the utility) which has the problem.
    The three reported faults caused curl to crash in the middle of
processing, without reporting an error beforehand. In such cases,
a report would be much more useful if it included an execution of the
faulty code inside a source-level debugger, such as gdb or dbx.
    To utilise gdb with curl, compile curl.c with a -g option:

    $ gcc -g -o curl curl.c

curl can then be invoked inside gdb:

    $ gdb curl

Note that the contents file is not included on the command line. At
the gdb prompt, type:

    (gdb) run contents-file

curl will now start executing. When the crash occurs, control will be
returned to gdb, and the user should type:

    (gdb) bt



			58
-----------------------------------------



This causes a `back trace', which lists the current nested sequence of
function calls.
    Incidentally, the corresponding operation in dbx is where.



9   Obtaining curl
==================


A compressed tar file, called curl.tar.Z, can be obtained by anonymous
FTP from turiel.cs.mu.oz.au (128.250.1.10) in the directory pub/curl.
To decompress and untar it, type:

    $ uncompress curl.tar.Z
    $ tar xvf curl.tar

This will create a directory called curl_release which contains the
file README and five subdirectories called src, utils, docs, Defaults
and example.
    The src directory contains the ANSI C source code for
curl, decurl, modtime and sk, in files called curl.c,
decurl.c, modtime.c and sk.c respectively.
    The utils directory contains the ANSI C source for no_link in
no_link.c, and two subdirectories called occurs and links.
    The occurs directory contains the ANSI C source for
occurs, occ_filt and usedby (in occurs.c, occ_filt.c and usedby.c
respectively), and a file of ignorable words, ignores.txt.
    The links directory contains the ANSI C source for linkup and
delink (in linkup.c and delink.c).
    The docs directory contains this user guide in Postscript form,
and some brief text files on various topics; namely, a summary of
curl, the announcement of curl's release, a summary of the changes
since curl v1.0, a copyright notice, and the GNU General Public
license.
    The Defaults directory contains the 8 files and one directory
(called arrows) required for the creation of a WWW document by
curl:

     dheader.sty     dfooter.sty     dcnts.sty      arrows
     keys.html       figs.html       tables.html
     new.html        search.html


    Copies of these files and directory should be placed in each
directory where a new WWW document is being built.
    Each copy of search.html needs to be configured to utilise sk (the
search engine), and refer to the right document. See section 5.3.6
for details.
    The example directory contains the initial version of the example
in section 4.



			59
-----------------------------------------



10    Installing curl
=====================


The ANSI C programs in the src and utils directories of the
curl release should be copied to the applications directory on your
system and compiled.
    Under gcc, the GNU C compiler, the following format
should be used to compile all the C files (apart from
no_link.c):

    gcc -o name name.c

For example:

    $ gcc -o curl curl.c
    $ gcc -o decurl decurl.c
    $ gcc -o sk sk.c

Once sk has been created, it needs to be moved to the
local machine's CGI scripts directory.
    Due to no_link's use of the gd graphics library (which requires C's
maths library), its compilation is slightly more complicated:

    $ gcc -o no_link no_link.c -lgd -lm

I have also compiled these programs using cc.
    It should be straightforward to port these programs to other ANSI C
dialects. Perhaps the biggest problem is whether some of the less
common C header files are supported by every machine and dialect.
    The core tools (curl, decurl, modtime and sk) use sys/types.h,
sys/stat.h, fcntl.h, fwh.h and dirent.h. The other utilities also
use some of these less common header files, so should compile if the
core tools can be compiled. The one exception is no_link.c which
utilises Thomas Boutell's gd graphics library. Details on how to
download this can be found in section 6.3.
    Another issue is the use of UNIX tools: modtime calls touch, and
sk relies on fgrep. These may not be present in non-UNIX
environments.
    I have included all the C source code in the release to encourage
curl (and the other utilities) to be ported and extended.
Please could any changes be documented by adding comments to the
beginning of the C files. In addition, I would appreciate being
informed of any modifications or extensions.



10.1    Upgrading to curl version 2.0
=====================================

This subsection is for existing curl uses who want to know
how to upgrade their documents to use the new features in version
2.0.
    no_link, the word occurrence tools, and the link tools are
additional to the main curl application, and do not require any
changes to documents created by earlier versions of curl.
    However, the changes to the curl application mean that documents
created in earlier versions will need to be reprocessed to
take advantage of the new features.



			60
-----------------------------------------



    The most visible changes to the curl application are the
introduction of a new additions page, a search page (and engine),
and the use of icons to represent the absence of links.
    The easiest way of adding these features to a document
is to decurl it, delete prev_contents, and start afresh.
    The following tasks need to be carried out in order to upgrade:

    * Update curl and decurl (modtime has not been altered).

    * Add the new GIF images to the arrows directory: new.gif, 
      search.gif, and any `no_' GIF files.

    * Modify the style files to include references to %new and %search.

    * Compile sk.c (the search engine) and install it in the local 
      machine's CGI scripts directory.

    * Places copies of new.html and search.html in the top-level
      directory of the document. Modify search.html to refer to 
      the directory and sk. See section 5.3.6 for details.

The document can now be reprocessed by curl.



11    General Licence Agreement
===============================


Copyright (c) 1995-1996 Andrew Davison.
All Rights Reserved.



Summary:

Permission is granted to use, copy, modify this program, except that
the copyright notice must be reproduced on copies, and credit should
be given to the author where it is due.  I make no warranty
and accept no liability for this program.



In detail:

1. Permission to use, copy, modify this software and its documentation
for any purpose is hereby granted without fee, provided that

   * the above copyright notice appear in all copies,

   * both that copyright notice and this permission notice appear in 
     supporting documentation, and that

   * you cause modified files to carry prominent notices stating that you
     changed the files and the date of any change.

2. Please notify me if you are going to sell this software or its
documentation for profit.



			61
-----------------------------------------



3. I disclaim all warranties with regard to this software, including
all implied warranties of merchantability and fitness. In no event
shall I be liable for any special, indirect or consequential damages or
any damages whatsoever resulting from loss of use, data or profits,
whether in an action of contract, negligence or other tortuous action,
arising out of or in connection with the use or performance of this
software.


Additionally:

This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 as
published by the Free Software Foundation; see the GNU-GPL file
in the docs directory of the curl release.
    This program is distributed in the hope that it will be useful, but
without any warranty ; without even the implied warranty of
merchantability or fitness for a particular purpose. See the GNU
General Public License for more details.
    You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.



Author: Andrew Davison
Email address (May 1996): ad@cs.mu.oz.au



			62
