Annotation of libwww/Library/src/HTAnchor.html, revision 2.42
2.7 timbl 1: <HTML>
2: <HEAD>
2.42 ! frystyk 3: <!-- Changed by: Henrik Frystyk Nielsen, 17-Apr-1996 -->
! 4: <TITLE>W3C Reference Library libwww Anchor Class and Link Class</TITLE>
2.8 timbl 5: </HEAD>
2.6 timbl 6: <BODY>
2.42 ! frystyk 7: <H1>
! 8: The Anchor Class and the Link Class
! 9: </H1>
2.15 frystyk 10: <PRE>
11: /*
2.23 frystyk 12: ** (c) COPYRIGHT MIT 1995.
2.15 frystyk 13: ** Please first read the full copyright statement in the file COPYRIGH.
14: */
15: </PRE>
2.42 ! frystyk 16: <P>
! 17: An anchor represents a region of a hypertext document which is linked to
! 18: another anchor in the same or a different document. Another name for anchors
! 19: would be URLs as an anchor represents all we know about a URL - including
! 20: where it points to and who points to it. Because the anchor objects
! 21: represent the part of the Web, the application has been in touch, it is often
! 22: useful to maintain the anchors throughout the lifetime of the application.
! 23: It would actually be most useful if we had persistent anchors so that an
! 24: application could build up a higher knowledge about the Web topology. In
! 25: this module you find:
! 26: <P>
2.18 frystyk 27: <UL>
2.42 ! frystyk 28: <LI>
! 29: <A HREF="#creation">Creation and deletion methods</A>
! 30: <LI>
! 31: <A HREF="#links">Manipulation of Link Objects</A>
! 32: <LI>
! 33: <A HREF="#access">Access Methods for information</A>
2.18 frystyk 34: </UL>
2.42 ! frystyk 35: <P>
! 36: This module is implemented by <A HREF="HTAnchor.c">HTAnchor.c</A>, and it
! 37: is a part of the <A HREF="http://www.w3.org/pub/WWW/Library/"> W3C Reference
! 38: Library</A>.
2.15 frystyk 39: <PRE>
40: #ifndef HTANCHOR_H
1.1 timbl 41: #define HTANCHOR_H
2.24 frystyk 42:
2.17 frystyk 43: #include "HTList.h"
44: #include "HTAtom.h"
2.25 frystyk 45: #include "HTMethod.h"
2.18 frystyk 46: </PRE>
2.42 ! frystyk 47: <H2>
! 48: Types defined and used by the Anchor Object
! 49: </H2>
! 50: <P>
! 51: This is a set of videly used type definitions used through out the Library:
2.24 frystyk 52: <PRE>
2.35 frystyk 53: typedef struct _HTLink HTLink;
54:
2.24 frystyk 55: typedef HTAtom * HTFormat;
56: typedef HTAtom * HTLevel; /* Used to specify HTML level */
2.40 frystyk 57: typedef HTAtom * HTEncoding; /* C-E and C-T-E */
2.24 frystyk 58: typedef HTAtom * HTCharset;
59: typedef HTAtom * HTLanguage;
2.35 frystyk 60:
61: typedef struct _HTAnchor HTAnchor;
62: typedef struct _HTParentAnchor HTParentAnchor;
63: typedef struct _HTChildAnchor HTChildAnchor;
2.24 frystyk 64: </PRE>
2.42 ! frystyk 65: <H2>
! 66: <A NAME="links">The Link Class</A>
! 67: </H2>
! 68: <P>
! 69: Anchors are bound together using link objects. Each anchor can be the source
! 70: or destination of zero, one, or more links from and to other anchors.
! 71: <H3>
! 72: Link Destination
! 73: </H3>
2.18 frystyk 74: <PRE>
2.35 frystyk 75: extern BOOL HTLink_setDestination (HTLink * link, HTAnchor * dest);
76: extern HTAnchor * HTLink_destination (HTLink * link);
2.18 frystyk 77: </PRE>
2.42 ! frystyk 78: <H3>
! 79: Link Result
! 80: </H3>
! 81: <P>
! 82: When a link has been used for posting an object from a source to a destination
! 83: link, the result of the operation is stored as part of the link information.
2.18 frystyk 84: <PRE>
2.35 frystyk 85: typedef enum _HTLinkResult {
2.28 frystyk 86: HT_LINK_INVALID = -1,
87: HT_LINK_NONE = 0,
88: HT_LINK_ERROR,
89: HT_LINK_OK
90: } HTLinkResult;
91:
2.35 frystyk 92: extern BOOL HTLink_setResult (HTLink * link, HTLinkResult result);
93: extern HTLinkResult HTLink_result (HTLink * link);
94: </PRE>
2.42 ! frystyk 95: <H3>
! 96: Link Method
! 97: </H3>
! 98: <P>
2.35 frystyk 99: The method used in a link can be PUT, or POST, for example
100: <PRE>
101: extern BOOL HTLink_setMethod (HTLink * link, HTMethod method);
102: extern HTMethod HTLink_method (HTLink * link);
103: </PRE>
2.42 ! frystyk 104: <H3>
! 105: Link Type
! 106: </H3>
! 107: <P>
2.35 frystyk 108: This is used for typed links.
109: <PRE>
110: typedef HTAtom * HTLinkType;
111:
112: extern BOOL HTLink_setType (HTLink * link, HTLinkType type);
113: extern HTLinkType HTLink_type (HTLink * link);
114: </PRE>
2.42 ! frystyk 115: <H2>
! 116: Relations between Links and Anchors
! 117: </H2>
! 118: <H3>
! 119: Link this Anchor to another given one
! 120: </H3>
! 121: <P>
! 122: A single anchor may have many outgoing links of which the default is the
! 123: <EM>main link</EM>. If one already exists then this new link is simply added
! 124: to the list.
2.35 frystyk 125: <PRE>
126: extern BOOL HTAnchor_link (HTAnchor * source,
127: HTAnchor * destination,
128: HTLinkType type,
129: HTMethod method);
130: </PRE>
2.42 ! frystyk 131: <H3>
! 132: Find the Link Object that Binds two Anchors
! 133: </H3>
! 134: <P>
! 135: If the destination anchor is a target of a link from the source anchor then
! 136: return the link object, else NULL.
2.35 frystyk 137: <PRE>
138: extern HTLink * HTAnchor_findLink (HTAnchor *src, HTAnchor *dest);
139: </PRE>
2.42 ! frystyk 140: <H3>
! 141: Find destination with given relationship
! 142: </H3>
! 143: <P>
2.35 frystyk 144: Return the anchor with a given typed link.
145: <PRE>
146: extern HTAnchor * HTAnchor_followTypedLink (HTAnchor *me, HTLinkType type);
147: </PRE>
2.42 ! frystyk 148: <H3>
! 149: Handling the Main Link
! 150: </H3>
! 151: <P>
2.35 frystyk 152: Any outgoing link can at any time be the main destination.
153: <PRE>
154: extern BOOL HTAnchor_setMainLink (HTAnchor * anchor, HTLink * link);
155: extern HTLink * HTAnchor_mainLink (HTAnchor * anchor);
156:
157: extern HTAnchor * HTAnchor_followMainLink (HTAnchor * anchor);
158: </PRE>
2.42 ! frystyk 159: <H3>
! 160: Handling the Sub Links
! 161: </H3>
2.35 frystyk 162: <PRE>
163: extern BOOL HTAnchor_setSubLinks (HTAnchor * anchor, HTList * list);
164: extern HTList * HTAnchor_subLinks (HTAnchor * anchor);
2.18 frystyk 165: </PRE>
2.42 ! frystyk 166: <H3>
! 167: Move Link Information
! 168: </H3>
! 169: <P>
! 170: Move all link information form one anchor to another. This is useful when
! 171: we get a redirection on a request and want to inherit the link information
! 172: to the new anchor and change the link information in the old one to "redirect".
2.35 frystyk 173: <PRE>
174: extern BOOL HTAnchor_moveAllLinks (HTAnchor *src, HTAnchor *dest);
175: </PRE>
2.42 ! frystyk 176: <H3>
! 177: Remove Link Information
! 178: </H3>
! 179: <P>
2.35 frystyk 180: Delete link information between two or more anchors
181: <PRE>
182: extern BOOL HTAnchor_removeLink (HTAnchor *src, HTAnchor *dest);
183: extern BOOL HTAnchor_removeAllLinks (HTAnchor * me);
184: </PRE>
2.42 ! frystyk 185: <H3>
! 186: Move a child anchor to the head of the list of its siblings
! 187: </H3>
! 188: <P>
! 189: This is to ensure that an anchor which might have already existed is put
! 190: in the correct order as we load the document.
2.35 frystyk 191: <PRE>
192: extern void HTAnchor_makeLastChild (HTChildAnchor *me);
193: </PRE>
2.42 ! frystyk 194: <H2>
! 195: The Anchor Class
! 196: </H2>
! 197: <P>
! 198: We have three variants of the Anchor object - I guess some would call them
! 199: superclass and subclasses ;-) <A NAME="Generic"></A>
! 200: <H3>
! 201: <A NAME="Generic">Generic Anchor Class</A>
! 202: </H3>
! 203: <P>
! 204: This is the super class of anchors. We often use this as an argument to the
! 205: functions that both accept parent anchors and child anchors. We separate
! 206: the first link from the others to avoid too many small mallocs involved by
! 207: a list creation. Most anchors only point to one place. <A NAME="parent"></A>
! 208: <H3>
! 209: <A NAME="parent">Anchor for a Parent Object</A>
! 210: </H3>
! 211: <P>
! 212: These anchors points to the whole contents of a graphic object (document).
! 213: The parent anchor of a parent anchor is itself. The parent anchor now contains
! 214: all meta information about the object. This is largely the entity headers
! 215: in the HTTP specification. <A NAME="child"></A>
! 216: <H3>
! 217: <A NAME="child">Anchor for a Child Object</A>
! 218: </H3>
! 219: <P>
! 220: A child anchor is a anchor object that points to a subpart of a graphic object
! 221: (document) <A NAME="creation"></A>
! 222: <H2>
! 223: <A NAME="creation">Creation and Deletion Methods</A>
! 224: </H2>
! 225: <P>
! 226: After we have defined the data structures we must define the methods that
! 227: can be used on them. All anchors are kept in an internal hash table so that
! 228: they are easier to find again.
! 229: <H3>
! 230: Find/Create a Parent Anchor
! 231: </H3>
! 232: <P>
! 233: This one is for a reference (link) which is found in a document, and might
! 234: not be already loaded. The parent anchor returned can either be created on
! 235: the spot or is already in the hash table.
2.18 frystyk 236: <PRE>
2.37 frystyk 237: extern HTAnchor * HTAnchor_findAddress (const char * address);
2.18 frystyk 238: </PRE>
2.42 ! frystyk 239: <H3>
! 240: Find/Create a Child Anchor
! 241: </H3>
! 242: <P>
! 243: This one is for a new child anchor being edited into an existing document.
! 244: The parent anchor must already exist but the child returned can either be
! 245: created on the spot or is already in the hash table. The <EM>tag</EM> is
! 246: the part that's after the '#' sign in a URI.
2.18 frystyk 247: <PRE>
2.32 frystyk 248: extern HTChildAnchor * HTAnchor_findChild (HTParentAnchor *parent,
2.37 frystyk 249: const char * tag);
2.7 timbl 250: </PRE>
2.42 ! frystyk 251: <H3>
! 252: Find/Create a Child Anchor and Link to Another Parent
! 253: </H3>
! 254: <P>
! 255: Find a child anchor anchor with a given parent and possibly a <EM>tag</EM>,
! 256: and (if passed) link this child to the URI given in the <EM>href</EM>. As
! 257: we really want typed links to the caller should also indicate what the type
! 258: of the link is (see HTTP spec for more information). The link is
! 259: <EM>relative</EM> to the address of the parent anchor.
2.18 frystyk 260: <PRE>
261: extern HTChildAnchor * HTAnchor_findChildAndLink
2.32 frystyk 262: (HTParentAnchor * parent, /* May not be 0 */
2.37 frystyk 263: const char * tag, /* May be "" or 0 */
264: const char * href, /* May be "" or 0 */
2.35 frystyk 265: HTLinkType ltype); /* May be 0 */
2.18 frystyk 266: </PRE>
2.42 ! frystyk 267: <H3>
! 268: Delete an Anchor
! 269: </H3>
! 270: <P>
! 271: All outgoing links from parent and children are deleted, and this anchor
! 272: is removed from the sources list of all its targets. We also delete the targets.
! 273: If this anchor's source list is empty, we delete it and its children.
2.18 frystyk 274: <PRE>
2.32 frystyk 275: extern BOOL HTAnchor_delete (HTParentAnchor *me);
2.20 frystyk 276: </PRE>
2.42 ! frystyk 277: <H3>
! 278: Delete all Anchors
! 279: </H3>
! 280: <P>
! 281: Deletes <EM>all</EM> anchors and return a list of all the objects (hyperdoc)
! 282: hanging of the parent anchors found while doing it. The application may keep
! 283: its own list of <CODE>HyperDoc</CODE>s, but this function returns it anyway.
! 284: It is <EM>always</EM> for the application to delete any
! 285: <CODE>HyperDoc</CODE>s. If NULL then no hyperdocs are returned. Return YES
! 286: if OK, else NO.
! 287: <P>
! 288: <B>Note:</B> This function is different from cleaning up the history list!
2.20 frystyk 289: <PRE>
2.32 frystyk 290: extern BOOL HTAnchor_deleteAll (HTList * objects);
2.18 frystyk 291: </PRE>
2.42 ! frystyk 292: <H2>
! 293: <A NAME="access">Anchor Methods</A>
! 294: </H2>
! 295: <P>
2.18 frystyk 296: These functions should be used to access information within the anchor
297: structures.
2.42 ! frystyk 298: <H3>
! 299: Relations to Other Anchors
! 300: </H3>
! 301: <H4>
! 302: Who is Parent?
! 303: </H4>
! 304: <P>
2.18 frystyk 305: For parent anchors this returns the anchor itself
306: <PRE>
2.32 frystyk 307: extern HTParentAnchor * HTAnchor_parent (HTAnchor *me);
2.18 frystyk 308: </PRE>
2.42 ! frystyk 309: <H4>
! 310: Does it have any Anchors within it?
! 311: </H4>
2.18 frystyk 312: <PRE>
2.32 frystyk 313: extern BOOL HTAnchor_hasChildren (HTParentAnchor *me);
2.18 frystyk 314: </PRE>
2.42 ! frystyk 315: <H3>
! 316: Binding a Data Object to an Anchor
! 317: </H3>
! 318: <P>
! 319: A parent anchor can have a data object bound to it. This data object does
! 320: can for example be a parsed version of a HTML that knows how to present itself
! 321: to the user, or it can be an unparsed data object. It's completely free for
! 322: the application to use this possibility, but a typical usage would to manage
! 323: the data object as part of a memory cache.
2.18 frystyk 324: <PRE>
2.35 frystyk 325: extern void HTAnchor_setDocument (HTParentAnchor *me, void * doc);
326: extern void * HTAnchor_document (HTParentAnchor *me);
2.18 frystyk 327: </PRE>
2.42 ! frystyk 328: <H3>
! 329: URI Information of Anchors
! 330: </H3>
! 331: <P>
! 332: There are two addresses of an anchor. The URI that was passed when the anchor
! 333: was crated and the physical address that's used when the URI is going to
! 334: be requested. The two addresses may be different if the request is going
! 335: through a proxy or a gateway.
! 336: <H4>
! 337: Get URI Address
! 338: </H4>
! 339: <P>
! 340: Returns the full URI of the anchor, child or parent as a malloc'd string
! 341: to be freed by the caller as when the anchor was created.
! 342: <PRE>
! 343: extern char * HTAnchor_address (HTAnchor * me);
! 344: </PRE>
! 345: <H3>
! 346: Cache Information
! 347: </H3>
! 348: <P>
! 349: If the cache manager finds a cached object, it is registered in the anchor
! 350: object. This way the <A HREF="HTFile.html">file loader</A> knows that it
! 351: is a MIME data object. The cache manager does not know whether the data object
! 352: is out of date (for example if a <EM>Expires:</EM> header is in the MIME
! 353: header. This is for the <A HREF="HTMIME.html">MIME parser</A> to find out.
! 354: <PRE>
! 355: extern BOOL HTAnchor_cacheHit (HTParentAnchor * me);
! 356: extern void HTAnchor_setCacheHit (HTParentAnchor * me, BOOL cacheHit);
! 357: </PRE>
! 358: <H3>
! 359: Physical address
! 360: </H3>
! 361: <P>
2.18 frystyk 362: Contains the physical address after we haved looked for proxies etc.
363: <PRE>
2.32 frystyk 364: extern char * HTAnchor_physical (HTParentAnchor * me);
2.18 frystyk 365:
2.32 frystyk 366: extern void HTAnchor_setPhysical (HTParentAnchor * me, char * protocol);
2.7 timbl 367: </PRE>
2.42 ! frystyk 368: <H3>
! 369: Is the Anchor searchable?
! 370: </H3>
! 371: <PRE>
! 372: extern void HTAnchor_clearIndex (HTParentAnchor * me);
! 373: extern void HTAnchor_setIndex (HTParentAnchor * me);
! 374: extern BOOL HTAnchor_isIndex (HTParentAnchor * me);
! 375: </PRE>
! 376: <H3>
! 377: Title handling
! 378: </H3>
! 379: <P>
! 380: We keep the title in the anchor as we then can refer to it later in the history
! 381: list etc. We can also obtain the title element if it is passed as a HTTP
! 382: header in the response. Any title element found in an HTML document will
! 383: overwrite a title given in a HTTP header.
2.18 frystyk 384: <PRE>
2.37 frystyk 385: extern const char * HTAnchor_title (HTParentAnchor *me);
2.18 frystyk 386:
2.32 frystyk 387: extern void HTAnchor_setTitle (HTParentAnchor *me,
2.37 frystyk 388: const char * title);
2.18 frystyk 389:
2.32 frystyk 390: extern void HTAnchor_appendTitle (HTParentAnchor *me,
2.37 frystyk 391: const char * title);
2.18 frystyk 392: </PRE>
2.42 ! frystyk 393: <H3>
! 394: Media Types (Content-Type)
! 395: </H3>
2.18 frystyk 396: <PRE>
2.32 frystyk 397: extern HTFormat HTAnchor_format (HTParentAnchor *me);
398: extern void HTAnchor_setFormat (HTParentAnchor *me,
399: HTFormat form);
2.18 frystyk 400: </PRE>
2.42 ! frystyk 401: <H3>
! 402: Charset parameter to Content-Type
! 403: </H3>
2.18 frystyk 404: <PRE>
2.32 frystyk 405: extern HTCharset HTAnchor_charset (HTParentAnchor *me);
406: extern void HTAnchor_setCharset (HTParentAnchor *me,
407: HTCharset charset);
2.18 frystyk 408: </PRE>
2.42 ! frystyk 409: <H3>
! 410: Level parameter to Content-Type
! 411: </H3>
2.21 frystyk 412: <PRE>
2.32 frystyk 413: extern HTLevel HTAnchor_level (HTParentAnchor * me);
414: extern void HTAnchor_setLevel (HTParentAnchor * me,
415: HTLevel level);
2.22 frystyk 416: </PRE>
2.42 ! frystyk 417: <H3>
! 418: Content Language
! 419: </H3>
2.22 frystyk 420: <PRE>
2.39 frystyk 421: extern HTList * HTAnchor_language (HTParentAnchor * me);
422: extern BOOL HTAnchor_addLanguage (HTParentAnchor *me, HTLanguage lang);
2.21 frystyk 423: </PRE>
2.42 ! frystyk 424: <H3>
! 425: Content Encoding
! 426: </H3>
2.18 frystyk 427: <PRE>
2.39 frystyk 428: extern HTList * HTAnchor_encoding (HTParentAnchor * me);
429: extern BOOL HTAnchor_addEncoding (HTParentAnchor * me, HTEncoding enc);
2.18 frystyk 430: </PRE>
2.42 ! frystyk 431: <H3>
! 432: Content Transfer Encoding
! 433: </H3>
2.18 frystyk 434: <PRE>
2.40 frystyk 435: extern HTEncoding HTAnchor_transfer (HTParentAnchor *me);
436: extern void HTAnchor_setTransfer (HTParentAnchor *me,
437: HTEncoding transfer);
2.18 frystyk 438: </PRE>
2.42 ! frystyk 439: <H3>
! 440: Content Length
! 441: </H3>
2.18 frystyk 442: <PRE>
2.41 frystyk 443: extern long int HTAnchor_length (HTParentAnchor * me);
444: extern void HTAnchor_setLength (HTParentAnchor * me, long int length);
445: extern void HTAnchor_addLength (HTParentAnchor * me, long int deltalength);
2.18 frystyk 446: </PRE>
2.42 ! frystyk 447: <H3>
! 448: Allowed methods (Allow)
! 449: </H3>
2.18 frystyk 450: <PRE>
2.36 frystyk 451: extern HTMethod HTAnchor_methods (HTParentAnchor * me);
452: extern void HTAnchor_setMethods (HTParentAnchor * me, HTMethod methodset);
453: extern void HTAnchor_appendMethods (HTParentAnchor * me, HTMethod methodset);
2.18 frystyk 454: </PRE>
2.42 ! frystyk 455: <H3>
! 456: Version
! 457: </H3>
2.18 frystyk 458: <PRE>
2.35 frystyk 459: extern char * HTAnchor_version (HTParentAnchor * me);
2.37 frystyk 460: extern void HTAnchor_setVersion (HTParentAnchor * me, const char * version);
2.28 frystyk 461: </PRE>
2.42 ! frystyk 462: <H3>
! 463: Date
! 464: </H3>
! 465: <P>
2.28 frystyk 466: Returns the date that was registered in the RFC822 header "Date"
467: <PRE>
2.35 frystyk 468: extern time_t HTAnchor_date (HTParentAnchor * me);
2.37 frystyk 469: extern void HTAnchor_setDate (HTParentAnchor * me, const time_t date);
2.28 frystyk 470: </PRE>
2.42 ! frystyk 471: <H3>
! 472: Last Modified Date
! 473: </H3>
! 474: <P>
2.28 frystyk 475: Returns the date that was registered in the RFC822 header "Last-Modified"
476: <PRE>
2.35 frystyk 477: extern time_t HTAnchor_lastModified (HTParentAnchor * me);
2.37 frystyk 478: extern void HTAnchor_setLastModified (HTParentAnchor * me, const time_t lm);
2.28 frystyk 479: </PRE>
2.42 ! frystyk 480: <H3>
! 481: Expires Date
! 482: </H3>
2.28 frystyk 483: <PRE>
2.35 frystyk 484: extern time_t HTAnchor_expires (HTParentAnchor * me);
2.37 frystyk 485: extern void HTAnchor_setExpires (HTParentAnchor * me, const time_t exp);
2.18 frystyk 486: </PRE>
2.42 ! frystyk 487: <H3>
! 488: Derived from
! 489: </H3>
2.18 frystyk 490: <PRE>
2.35 frystyk 491: extern char * HTAnchor_derived (HTParentAnchor *me);
2.37 frystyk 492: extern void HTAnchor_setDerived (HTParentAnchor *me, const char *derived_from);
2.18 frystyk 493: </PRE>
2.42 ! frystyk 494: <H3>
! 495: Extra Headers
! 496: </H3>
! 497: <P>
2.18 frystyk 498: List of unknown headers coming in from the network. Do not use the
2.42 ! frystyk 499: <CODE>HTAnchor_addExtra()</CODE> function to extra headers here, but use
! 500: the field in the <A HREF="HTReq.html#z1">request structure</A> for sending
! 501: test headers.
2.7 timbl 502: <PRE>
2.32 frystyk 503: extern HTList * HTAnchor_Extra (HTParentAnchor *me);
504: extern void HTAnchor_addExtra (HTParentAnchor *me,
2.37 frystyk 505: const char * header);
2.18 frystyk 506: </PRE>
2.42 ! frystyk 507: <H3>
! 508: Status of Header Parsing
! 509: </H3>
! 510: <P>
2.18 frystyk 511: These are primarily for internal use
512: <PRE>
2.32 frystyk 513: extern BOOL HTAnchor_headerParsed (HTParentAnchor *me);
514: extern void HTAnchor_setHeaderParsed (HTParentAnchor *me);
2.7 timbl 515: </PRE>
2.42 ! frystyk 516: <H3>
! 517: We want to clear the header information...
! 518: </H3>
2.18 frystyk 519: <PRE>
2.32 frystyk 520: extern void HTAnchor_clearHeader (HTParentAnchor *me);
2.10 timbl 521:
2.18 frystyk 522: #endif /* HTANCHOR_H */
523: </PRE>
2.42 ! frystyk 524: <P>
! 525: <HR>
2.39 frystyk 526: <ADDRESS>
2.42 ! frystyk 527: @(#) $Id: HTAnchor.html,v 2.41 1996/04/18 01:41:37 frystyk Exp $
2.39 frystyk 528: </ADDRESS>
2.42 ! frystyk 529: </BODY></HTML>
Webmaster