about summary refs log tree commit diff stats
path: root/WWW/Library/Implementation/HTMLDTD.c
diff options
context:
space:
mode:
authorThomas E. Dickey <dickey@invisible-island.net>1996-09-02 19:39:24 -0400
committerThomas E. Dickey <dickey@invisible-island.net>1996-09-02 19:39:24 -0400
commite087f6d44e87f489fcb3056e86319ebba4218156 (patch)
treed045b58011bfbbf5186d34c4fed9e0dedb363275 /WWW/Library/Implementation/HTMLDTD.c
downloadlynx-snapshots-e087f6d44e87f489fcb3056e86319ebba4218156.tar.gz
snapshot of project "lynx", label v2_6
Diffstat (limited to 'WWW/Library/Implementation/HTMLDTD.c')
-rw-r--r--WWW/Library/Implementation/HTMLDTD.c1122
1 files changed, 1122 insertions, 0 deletions
diff --git a/WWW/Library/Implementation/HTMLDTD.c b/WWW/Library/Implementation/HTMLDTD.c
new file mode 100644
index 00000000..3a982b2f
--- /dev/null
+++ b/WWW/Library/Implementation/HTMLDTD.c
@@ -0,0 +1,1122 @@
+/*		Our Static DTD for HTML
+**		-----------------------
+*/
+
+/* Implements:
+*/
+
+#include "HTUtils.h"
+#include "HTMLDTD.h"
+#include "LYLeaks.h"
+
+/* 	Entity Names
+**	------------
+**
+**	This table must be matched exactly with ALL the translation tables
+*/
+static CONST char* entities[] = {
+  "AElig",	/* capital AE diphthong (ligature) */ 
+  "Aacute",	/* capital A, acute accent */ 
+  "Acirc",	/* capital A, circumflex accent */ 
+  "Agrave",	/* capital A, grave accent */ 
+  "Aring",	/* capital A, ring */ 
+  "Atilde",	/* capital A, tilde */ 
+  "Auml",	/* capital A, dieresis or umlaut mark */ 
+  "Ccedil",	/* capital C, cedilla */ 
+  "Dstrok",	/* capital Eth, Icelandic */ 
+  "ETH",	/* capital Eth, Icelandic */ 
+  "Eacute",	/* capital E, acute accent */ 
+  "Ecirc",	/* capital E, circumflex accent */ 
+  "Egrave",	/* capital E, grave accent */ 
+  "Euml",	/* capital E, dieresis or umlaut mark */ 
+  "Iacute",	/* capital I, acute accent */ 
+  "Icirc",	/* capital I, circumflex accent */ 
+  "Igrave",	/* capital I, grave accent */ 
+  "Iuml",	/* capital I, dieresis or umlaut mark */ 
+  "Ntilde",	/* capital N, tilde */ 
+  "Oacute",	/* capital O, acute accent */ 
+  "Ocirc",	/* capital O, circumflex accent */ 
+  "Ograve",	/* capital O, grave accent */ 
+  "Oslash",	/* capital O, slash */ 
+  "Otilde",	/* capital O, tilde */ 
+  "Ouml",	/* capital O, dieresis or umlaut mark */ 
+  "THORN",	/* capital THORN, Icelandic */ 
+  "Uacute",	/* capital U, acute accent */ 
+  "Ucirc",	/* capital U, circumflex accent */ 
+  "Ugrave",	/* capital U, grave accent */ 
+  "Uuml",	/* capital U, dieresis or umlaut mark */ 
+  "Yacute",	/* capital Y, acute accent */ 
+  "aacute",	/* small a, acute accent */ 
+  "acirc",	/* small a, circumflex accent */ 
+  "acute",	/* spacing acute */
+  "aelig",	/* small ae diphthong (ligature) */ 
+  "agrave",	/* small a, grave accent */ 
+  "amp",	/* ampersand */ 
+  "aring",	/* small a, ring */ 
+  "atilde",	/* small a, tilde */ 
+  "auml",	/* small a, dieresis or umlaut mark */ 
+  "brkbar",	/* broken vertical bar */
+  "brvbar",	/* broken vertical bar */
+  "ccedil",	/* small c, cedilla */ 
+  "cedil",	/* spacing cedilla */
+  "cent",	/* cent sign */
+  "copy",	/* copyright sign */
+  "curren",	/* currency sign */
+  "deg",	/* degree sign */
+  "die",	/* spacing diaresis */
+  "divide",	/* division sign */
+  "eacute",	/* small e, acute accent */ 
+  "ecirc",	/* small e, circumflex accent */ 
+  "egrave",	/* small e, grave accent */ 
+  "emdash",	/* dash the width of emsp */
+  "emsp",	/* em space - not collapsed */
+  "endash",	/* dash the width of ensp */
+  "ensp",	/* en space - not collapsed */
+  "eth",	/* small eth, Icelandic */ 
+  "euml",	/* small e, dieresis or umlaut mark */ 
+  "frac12",	/* fraction 1/2 */
+  "frac14",	/* fraction 1/4 */
+  "frac34",	/* fraction 3/4 */
+  "gt",		/* greater than */ 
+  "hibar",	/* spacing macron */
+  "iacute",	/* small i, acute accent */ 
+  "icirc",	/* small i, circumflex accent */ 
+  "iexcl",	/* inverted exclamation mark */
+  "igrave",	/* small i, grave accent */ 
+  "iquest",	/* inverted question mark */
+  "iuml",	/* small i, dieresis or umlaut mark */ 
+  "laquo",	/* angle quotation mark, left */
+  "lt",		/* less than */ 
+  "macr",	/* spacing macron */
+  "mdash",	/* dash the width of emsp */
+  "micro",	/* micro sign */
+  "middot",	/* middle dot */
+  "nbsp",       /* non breaking space */
+  "ndash",	/* dash the width of ensp */
+  "not",	/* negation sign */
+  "ntilde",	/* small n, tilde */ 
+  "oacute",	/* small o, acute accent */ 
+  "ocirc",	/* small o, circumflex accent */ 
+  "ograve",	/* small o, grave accent */ 
+  "ordf",	/* feminine ordinal indicator */
+  "ordm",	/* masculine ordinal indicator */
+  "oslash",	/* small o, slash */ 
+  "otilde",	/* small o, tilde */ 
+  "ouml",	/* small o, dieresis or umlaut mark */ 
+  "para",	/* paragraph sign */
+  "plusmn",	/* plus-or-minus sign */
+  "pound",	/* pound sign */
+  "quot",	/* quot '"' */
+  "raquo",	/* angle quotation mark, right */
+  "reg",	/* circled R registered sign */
+  "sect",	/* section sign */
+  "shy",	/* soft hyphen */
+  "sup1",	/* superscript 1 */
+  "sup2",	/* superscript 2 */
+  "sup3",	/* superscript 3 */
+  "szlig",	/* small sharp s, German (sz ligature) */ 
+  "thinsp",	/* thin space (not collapsed) */ 
+  "thorn",	/* small thorn, Icelandic */ 
+  "times",	/* multiplication sign */ 
+  "trade",	/* registerd trademark */ 
+  "uacute",	/* small u, acute accent */ 
+  "ucirc",	/* small u, circumflex accent */ 
+  "ugrave",	/* small u, grave accent */ 
+  "uml",	/* spacing diaresis */
+  "uuml",	/* small u, dieresis or umlaut mark */ 
+  "yacute",	/* small y, acute accent */ 
+  "yen",	/* yen sign */
+  "yuml",	/* small y, dieresis or umlaut mark */ 
+};
+
+#define HTML_ENTITIES 112
+
+
+/*		Attribute Lists
+**		---------------
+**
+**	Lists must be in alphatbetical order by attribute name
+**	The tag elements contain the number of attributes
+*/
+
+static attr a_attr[] = {			/* Anchor attributes */
+	{ "ACCESSKEY" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "COORDS" },
+	{ "DIR" },
+	{ "HREF" },
+	{ "ID" },
+	{ "ISMAP" },
+	{ "LANG" },
+	{ "MD" },
+	{ "NAME" },
+	{ "NOTAB" },
+	{ "ONCLICK" },
+	{ "ONMOUSEOUT" },
+	{ "ONMOUSEOVER" },
+	{ "REL" },
+	{ "REV" },
+	{ "SHAPE" },
+	{ "STYLE" },
+	{ "TABINDEX" },
+	{ "TARGET" },
+	{ "TITLE" },
+	{ "TYPE" },
+	{ "URN" },
+	{ 0 }	/* Terminate list */
+};	
+
+static attr address_attr[] = {			/* ADDRESS attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "NOWRAP" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr applet_attr[] = {			/* APPLET attributes */
+	{ "ALIGN" },
+	{ "ALT" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "CODE" },
+	{ "CODEBASE" },
+	{ "DIR" },
+	{ "DOWNLOAD" },
+	{ "HEIGHT" },
+	{ "HSPACE" },
+	{ "ID" },
+	{ "LANG" },
+	{ "NAME" },
+	{ "STYLE" },
+	{ "TITLE" },
+	{ "VSPACE" },
+	{ "WIDTH" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr area_attr[] = {			/* AREA attributes */
+	{ "ALT" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "COORDS" },
+	{ "DIR" },
+	{ "HREF" },
+	{ "ID" },
+	{ "LANG" },
+	{ "NOHREF" },
+	{ "NOTAB" },
+	{ "ONCLICK" },
+	{ "ONMOUSEOUT" },
+	{ "ONMOUSEOVER" },
+	{ "SHAPE" },
+	{ "STYLE" },
+	{ "TABINDEX" },
+	{ "TARGET" },
+	{ "TITLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr base_attr[] = {			/* BASE attributes */
+	{ "HREF" },
+	{ "TARGET" },
+	{ 0 }	/* Terminate list */
+};	
+
+static attr bgsound_attr[] = {			/* BGSOUND attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "LOOP" },
+	{ "SRC" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr body_attr[] = {			/* BODY attributes */
+	{ "ALINK" },
+	{ "BACKGROUND" },
+	{ "BGCOLOR" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "LINK" },
+	{ "STYLE" },
+	{ "ONLOAD" },
+	{ "ONUNLOAD" },
+	{ "TEXT" },
+	{ "VLINK" },
+	{ 0 } /* Terminate list */
+};
+
+static attr bodytext_attr[] = {			/* BODYTEXT attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DATA" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "NAME" },
+	{ "OBJECT" },
+	{ "REF" },
+	{ "STYLE" },
+	{ "TYPE" },
+	{ "VALUE" },
+	{ "VALUETYPE" },
+	{ 0 } /* Terminate list */
+};
+
+static attr bq_attr[] = {			/* BQ (BLOCKQUOTE) attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "NOWRAP" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr caption_attr[] = {			/* CAPTION attributes */
+	{ "ACCESSKEY" },
+	{ "ALIGN" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr col_attr[] = {		/* COL and COLGROUP attributes */
+	{ "ALIGN" },
+	{ "CHAR" },
+	{ "CHAROFF" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "SPAN" },
+	{ "STYLE" },
+	{ "VALIGN" },
+	{ "WIDTH" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr credit_attr[] = {			/* CREDIT attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr div_attr[] = {			/* DIV attribures */
+	{ "ALIGN" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr embed_attr[] = {			/* EMBED attributes */
+	{ "ALIGN" },	/* (including, for now, those from FIG and IMG) */
+	{ "ALT" },
+	{ "BORDER" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "HEIGHT" },
+	{ "ID" },
+	{ "IMAGEMAP" },
+	{ "ISMAP" },
+	{ "LANG" },
+	{ "MD" },
+	{ "NAME" },
+	{ "NOFLOW" },
+	{ "PARAMS" },
+	{ "SRC" },
+	{ "STYLE" },
+	{ "UNITS" },
+	{ "USEMAP" },
+	{ "WIDTH" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr fig_attr[] = {			/* FIG attributes */
+	{ "ALIGN" },
+	{ "BORDER" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "HEIGHT" },
+	{ "ID" },
+	{ "IMAGEMAP" },
+	{ "ISOBJECT" },
+	{ "LANG" },
+	{ "MD" },
+	{ "NOFLOW" },
+	{ "SRC" },
+	{ "STYLE" },
+	{ "UNITS" },
+	{ "WIDTH" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr fieldset_attr[] = {			/* FIELDSET attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "STYLE" },
+	{ "TITLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr fn_attr[] = {			/* FN attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr font_attr[] = {			/* FONT attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "COLOR" },
+	{ "DIR" },
+	{ "END" },
+	{ "FACE" },
+	{ "ID" },
+	{ "LANG" },
+	{ "SIZE" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr form_attr[] = {			/* FORM attributes */
+	{ "ACTION"},
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ENCTYPE" },
+	{ "ID" },
+	{ "LANG" },
+	{ "METHOD" },
+	{ "ONSUBMIT" },
+	{ "SCRIPT" },
+	{ "STYLE" },
+	{ "SUBJECT" },
+	{ "TARGET" },
+	{ "TITLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr frame_attr[] = {			/* FRAME attributes */
+	{ "MARGINHEIGHT"},
+	{ "MARGINWIDTH" },
+	{ "NAME" },
+	{ "NORESIZE" },
+	{ "SCROLLING" },
+	{ "SRC" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr frameset_attr[] = {			/* FRAMESET attributes */
+	{ "COLS"},
+	{ "ROWS" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr gen_attr[] = {			/* Minimum HTML 3.0 */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr glossary_attr[] = {			/* DL (and DLC) attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "COMPACT" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr h_attr[] = {			/* H1 - H6 attributes */
+	{ "ALIGN" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DINGBAT" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "MD" },
+	{ "NOWRAP" },
+	{ "SEQNUM" },
+	{ "SKIP" },
+	{ "SRC" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr hr_attr[] = {			/* HR attributes */
+	{ "ALIGN" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "MD" },
+	{ "NOSHADE" },
+	{ "SIZE" },
+	{ "SRC" },
+	{ "STYLE" },
+	{ "WIDTH" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr img_attr[] = {			/* IMG attributes */
+	{ "ALIGN" },
+	{ "ALT" },
+	{ "BORDER" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "HEIGHT" },
+	{ "ID" },
+	{ "ISMAP" },
+	{ "ISOBJECT" },
+	{ "LANG" },
+	{ "MD" },
+	{ "SRC" },
+	{ "STYLE" },
+	{ "TITLE" },
+	{ "UNITS" },
+	{ "USEMAP" },
+	{ "WIDTH" },
+	{ 0 }	/* Terminate list */
+};	
+
+static attr input_attr[] = {			/* INPUT attributes */
+	{ "ACCEPT" },
+	{ "ALIGN" },
+	{ "CHECKED" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "DISABLED" },
+	{ "ERROR" },
+	{ "HEIGHT" },
+	{ "ID" },
+	{ "LANG" },
+	{ "MAX" },
+	{ "MAXLENGTH" },
+	{ "MD" },
+	{ "MIN" },
+	{ "NAME" },
+	{ "NOTAB" },
+	{ "ONBLUR" },
+	{ "ONCHANGE" },
+	{ "ONCLICK" },
+	{ "ONFOCUS" },
+	{ "ONSELECT" },
+	{ "SIZE" },
+	{ "SRC" },
+	{ "STYLE" },
+	{ "TABINDEX" },
+	{ "TITLE" },
+	{ "TYPE" },
+	{ "VALUE" },
+	{ "WIDTH" },
+	{ 0 } /* Terminate list */
+};
+
+static attr isindex_attr[] = {			/* ISINDEX attributes */
+	{ "ACTION" },	/* Not in spec.  Lynx treats it as HREF. - FM */
+	{ "DIR" },
+	{ "HREF" },	/* HTML 3.0 attritute for search action. - FM */ 
+	{ "LANG" },
+	{ "PROMPT" },	/* HTML 3.0 attribute for prompt string. - FM */
+	{ 0 }	/* Terminate list */
+};	
+
+static attr label_attr[] = {			/* LABEL attributes */
+	{ "ACCESSKEY" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "FOR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "ONCLICK" },
+	{ "STYLE" },
+	{ "TITLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr link_attr[] = {			/* LINK attributes */
+	{ "CLASS" },
+	{ "HREF" },
+	{ "ID" },
+	{ "REL" },
+	{ "REV" },
+	{ "STYLE" },
+	{ "TARGET" },
+	{ "TITLE" },
+	{ "TYPE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr list_attr[] = {			/* LI attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DINGBAT" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "MD" },
+	{ "SRC" },
+	{ "SKIP" },
+	{ "STYLE" },
+	{ "TYPE" },
+	{ "VALUE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr map_attr[] = {			/* MAP attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "NAME" },
+	{ "STYLE" },
+	{ "TITLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr math_attr[] = {			/* MATH attributes */
+	{ "BOX" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr meta_attr[] = {			/* META attributes */
+	{ "CONTENT" },
+	{ "HTTP-EQUIV" },
+	{ "NAME" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr nextid_attr[] = {			/* NEXTID attribures */
+	{ "N" }
+};
+
+static attr note_attr[]	= {			/* NOTE attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "MD" },
+	{ "ROLE" },
+	{ "SRC" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr object_attr[] = {			/* OBJECT attributes */
+	{ "ALIGN" },
+	{ "BORDER" },
+	{ "CLASS" },
+	{ "CLASSID" },
+	{ "CODEBASE" },
+	{ "CODETYPE" },
+	{ "DATA" },
+	{ "DECLARE" },
+	{ "DIR" },
+	{ "HEIGHT" },
+	{ "HSPACE" },
+	{ "ID" },
+	{ "ISMAP" },
+	{ "LANG" },
+	{ "NAME" },
+	{ "NOTAB" },
+	{ "SHAPES" },
+	{ "STANDBY" },
+	{ "STYLE" },
+	{ "TABINDEX" },
+	{ "TITLE" },
+	{ "TYPE" },
+	{ "USEMAP" },
+	{ "VSPACE" },
+	{ "WIDTH" },
+	{ 0 } /* Terminate list */
+};
+
+static attr olist_attr[] = {			/* OL attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "COMPACT" },
+	{ "CONTINUE" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "SEQNUM" },
+	{ "START" },
+	{ "STYLE" },
+	{ "TYPE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr option_attr[] = {			/* OPTION attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "DISABLED" },
+	{ "ERROR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "SELECTED" },
+	{ "SHAPE" },
+	{ "STYLE" },
+	{ "VALUE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr overlay_attr[] = {			/* OVERLAY attributes */
+	{ "CLASS" },
+	{ "HEIGHT" },
+	{ "ID" },
+	{ "IMAGEMAP" },
+	{ "MD" },
+	{ "SRC" },
+	{ "STYLE" },
+	{ "UNITS" },
+	{ "WIDTH" },
+	{ "X" },
+	{ "Y" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr p_attr[] = {			/* P attributes */
+	{ "ALIGN" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "NOWRAP" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr param_attr[] = {			/* PARAM attribures */
+	{ "ACCEPT" },
+	{ "ACCEPT-CHARSET" },
+	{ "ACCEPT-ENCODING" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "DATA" },
+	{ "NAME" },
+	{ "OBJECT" },
+	{ "REF" },
+	{ "STYLE" },
+	{ "TYPE" },
+	{ "VALUE" },
+	{ "VALUEREF" },
+	{ "VALUETYPE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr script_attr[] = {			/* SCRIPT attribures */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "EVENT" },
+	{ "FOR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "LANGUAGE" },
+	{ "NAME" },
+	{ "SCRIPTENGINE" },
+	{ "SRC" },
+	{ "TYPE" },
+	{ "STYLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr select_attr[] = {			/* SELECT attributes */
+	{ "ALIGN" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "DISABLED" },
+	{ "ERROR" },
+	{ "HEIGHT" },
+	{ "ID" },
+	{ "LANG" },
+	{ "MD" },
+	{ "MULTIPLE" },
+	{ "NAME" },
+	{ "NOTAB" },
+	{ "ONBLUR" },
+	{ "ONCHANGE" },
+	{ "ONFOCUS" },
+	{ "SIZE" },
+	{ "STYLE" },
+	{ "TABINDEX" },
+	{ "TITLE" },
+	{ "UNITS" },
+	{ "WIDTH" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr style_attr[] = {			/* STYLE attributes */
+	{ "DIR" },
+	{ "LANG" },
+	{ "NOTATION" },
+	{ "TITLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr tab_attr[] = {			/* TAB attributes */
+	{ "ALIGN" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "DP" },
+	{ "ID" },
+	{ "INDENT" },
+	{ "LANG" },
+	{ "STYLE" },
+	{ "TO" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr table_attr[] = {			/* TABLE attributes */
+	{ "ALIGN" },
+	{ "BORDER" },
+	{ "CELLPADDING" },
+	{ "CELLSPACING" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "COLS" },
+	{ "COLSPEC" },
+	{ "DIR" },
+	{ "DP" },
+	{ "FRAME" },
+	{ "ID" },
+	{ "LANG" },
+	{ "NOFLOW" },
+	{ "NOWRAP" },
+	{ "RULES" },
+	{ "STYLE" },
+	{ "UNITS" },
+	{ "WIDTH" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr td_attr[] = {			/* TD and TH attributes */
+	{ "ALIGN" },
+	{ "AXES" },
+	{ "AXIS" },
+	{ "CHAR" },
+	{ "CHAROFF" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "COLSPAN" },
+	{ "DIR" },
+	{ "DP" },
+	{ "ID" },
+	{ "LANG" },
+	{ "NOWRAP" },
+	{ "ROWSPAN" },
+	{ "STYLE" },
+	{ "VALIGN" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr textarea_attr[] = {			/* TEXTAREA attributes */
+	{ "ALIGN" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "COLS" },
+	{ "DIR" },
+	{ "DISABLED" },
+	{ "ERROR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "NAME" },
+	{ "NOTAB" },
+	{ "ONBLUR" },
+	{ "ONCHANGE" },
+	{ "ONFOCUS" },
+	{ "ONSELECT" },
+	{ "ROWS" },
+	{ "STYLE" },
+	{ "TABINDEX" },
+	{ "TITLE" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr tr_attr[] = {	/* TR, THEAD, TFOOT, and TBODY attributes */
+	{ "ALIGN" },
+	{ "CHAR" },
+	{ "CHAROFF" },
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "DIR" },
+	{ "DP" },
+	{ "ID" },
+	{ "LANG" },
+	{ "NOWRAP" },
+	{ "STYLE" },
+	{ "VALIGN" },
+	{ 0 }	/* Terminate list */
+};
+
+static attr ulist_attr[] = {			/* UL attributes */
+	{ "CLASS" },
+	{ "CLEAR" },
+	{ "COMPACT" },
+	{ "DINGBAT" },
+	{ "DIR" },
+	{ "ID" },
+	{ "LANG" },
+	{ "MD" },
+	{ "PLAIN" },
+	{ "SRC" },
+	{ "STYLE" },
+	{ "TYPE" },
+	{ "WRAP" },
+	{ 0 }	/* Terminate list */
+};
+
+/*	Elements
+**	--------
+**
+**	Must match definitions in HTMLDTD.html!
+**	Must be in alphabetical order.
+**
+**    Name, 	Attributes, 		content
+*/
+static HTTag tags[HTML_ELEMENTS] = {
+    { "A"	, a_attr,	HTML_A_ATTRIBUTES,	SGML_MIXED },
+    { "ABBREV"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "ACRONYM"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "ADDRESS"	, address_attr,	HTML_ADDRESS_ATTRIBUTES, SGML_MIXED },
+    { "APPLET"	, applet_attr,	HTML_APPLET_ATTRIBUTES, SGML_MIXED },
+    { "AREA"	, area_attr,	HTML_AREA_ATTRIBUTES,   SGML_EMPTY },
+    { "AU"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "AUTHOR"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "B"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "BANNER"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "BASE"	, base_attr,	HTML_BASE_ATTRIBUTES,	SGML_EMPTY },
+    { "BASEFONT", font_attr,	HTML_FONT_ATTRIBUTES,	SGML_EMPTY },
+    { "BDO"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "BGSOUND"	, bgsound_attr,	HTML_BGSOUND_ATTRIBUTES, SGML_EMPTY },
+    { "BIG"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "BLINK"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "BLOCKQUOTE", bq_attr,	HTML_BQ_ATTRIBUTES,	SGML_MIXED },
+    { "BODY"	, body_attr,	HTML_BODY_ATTRIBUTES,	SGML_MIXED },
+    { "BODYTEXT", bodytext_attr,HTML_BODYTEXT_ATTRIBUTES, SGML_MIXED },
+    { "BQ"	, bq_attr,	HTML_BQ_ATTRIBUTES,	SGML_MIXED },
+    { "BR"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_EMPTY },
+    { "CAPTION"	, caption_attr,	HTML_CAPTION_ATTRIBUTES, SGML_MIXED },
+    { "CENTER"	, div_attr,	HTML_DIV_ATTRIBUTES,	SGML_MIXED },
+    { "CITE"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "CODE"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "COL"	, col_attr,	HTML_COL_ATTRIBUTES,	SGML_EMPTY },
+    { "COLGROUP", col_attr,	HTML_COL_ATTRIBUTES,	SGML_EMPTY },
+    { "COMMENT"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "CREDIT"	, credit_attr,	HTML_CREDIT_ATTRIBUTES,	SGML_MIXED },
+    { "DD"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_EMPTY },
+    { "DEL"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "DFN"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "DIR"	, ulist_attr,	HTML_UL_ATTRIBUTES,	SGML_MIXED },
+    { "DIV"	, div_attr,	HTML_DIV_ATTRIBUTES,	SGML_MIXED },
+    { "DL"	, glossary_attr, HTML_DL_ATTRIBUTES,	SGML_MIXED },
+    { "DLC"	, glossary_attr, HTML_DL_ATTRIBUTES,	SGML_MIXED },
+    { "DT"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_EMPTY },
+    { "EM"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "EMBED"	, embed_attr,	HTML_EMBED_ATTRIBUTES,	SGML_EMPTY },
+    { "FIELDSET", fieldset_attr,HTML_FIELDSET_ATTRIBUTES, SGML_MIXED },
+    { "FIG"	, fig_attr,	HTML_FIG_ATTRIBUTES,	SGML_MIXED },
+    { "FN"	, fn_attr,	HTML_FN_ATTRIBUTES,	SGML_MIXED },
+    { "FONT"	, font_attr,	HTML_FONT_ATTRIBUTES,	SGML_EMPTY },
+    { "FORM"	, form_attr,	HTML_FORM_ATTRIBUTES,	SGML_MIXED },
+    { "FRAME"	, frame_attr,	HTML_FRAME_ATTRIBUTES,	SGML_EMPTY },
+    { "FRAMESET", frameset_attr,HTML_FRAMESET_ATTRIBUTES, SGML_MIXED },
+    { "H1"	, h_attr,	HTML_H_ATTRIBUTES,	SGML_MIXED },
+    { "H2"	, h_attr,	HTML_H_ATTRIBUTES,	SGML_MIXED },
+    { "H3"	, h_attr,	HTML_H_ATTRIBUTES,	SGML_MIXED },
+    { "H4"	, h_attr,	HTML_H_ATTRIBUTES,	SGML_MIXED },
+    { "H5"	, h_attr,	HTML_H_ATTRIBUTES,	SGML_MIXED },
+    { "H6"	, h_attr,	HTML_H_ATTRIBUTES,	SGML_MIXED },
+    { "HEAD"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "HR"	, hr_attr,	HTML_HR_ATTRIBUTES,	SGML_EMPTY },
+    { "HTML"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "I"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "IMG"     , img_attr,	HTML_IMG_ATTRIBUTES,	SGML_EMPTY },
+    { "INPUT"   , input_attr,	HTML_INPUT_ATTRIBUTES,	SGML_EMPTY },
+    { "INS"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "ISINDEX" , isindex_attr,	HTML_ISINDEX_ATTRIBUTES,SGML_EMPTY },
+    { "KBD"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "LABEL"	, label_attr,	HTML_LABEL_ATTRIBUTES,	SGML_MIXED },
+    { "LH"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_EMPTY },
+    { "LI"	, list_attr,	HTML_LI_ATTRIBUTES,	SGML_EMPTY },
+    { "LINK"	, link_attr,	HTML_LINK_ATTRIBUTES,	SGML_EMPTY },
+    { "LISTING"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_LITTERAL },
+    { "MAP"	, map_attr,	HTML_MAP_ATTRIBUTES,	SGML_MIXED },
+    { "MARQUEE"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "MATH"	, math_attr,	HTML_MATH_ATTRIBUTES,	SGML_LITTERAL },
+    { "MENU"	, ulist_attr,	HTML_UL_ATTRIBUTES,	SGML_MIXED },
+    { "META"	, meta_attr,	HTML_META_ATTRIBUTES,	SGML_EMPTY },
+    { "NEXTID"  , nextid_attr,	1,			SGML_EMPTY },
+    { "NOFRAMES", gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "NOTE"	, note_attr,	HTML_NOTE_ATTRIBUTES,	SGML_MIXED },
+    { "OBJECT"	, object_attr,	HTML_OBJECT_ATTRIBUTES,	SGML_LITTERAL },
+    { "OL"	, olist_attr,	HTML_OL_ATTRIBUTES,	SGML_MIXED },
+    { "OPTION"	, option_attr,	HTML_OPTION_ATTRIBUTES,	SGML_EMPTY },
+    { "OVERLAY"	, overlay_attr,	HTML_OVERLAY_ATTRIBUTES, SGML_EMPTY },
+    { "P"	, p_attr,	HTML_P_ATTRIBUTES,	SGML_EMPTY },
+    { "PARAM"	, param_attr,	HTML_PARAM_ATTRIBUTES,	SGML_EMPTY },
+    { "PLAINTEXT", gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_LITTERAL },
+    { "PRE"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "Q"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "S"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "SAMP"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "SCRIPT"	, script_attr,	HTML_SCRIPT_ATTRIBUTES,	SGML_LITTERAL },
+    { "SELECT"	, select_attr,	HTML_SELECT_ATTRIBUTES,	SGML_MIXED },
+    { "SMALL"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "SPAN"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "SPOT"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_EMPTY },
+    { "STRIKE"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "STRONG"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "STYLE"	, style_attr,	HTML_STYLE_ATTRIBUTES,	SGML_LITTERAL },
+    { "SUB"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "SUP"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "TAB"	, tab_attr,	HTML_TAB_ATTRIBUTES,	SGML_EMPTY },
+    { "TABLE"	, table_attr,	HTML_TABLE_ATTRIBUTES,	SGML_MIXED },
+    { "TBODY"	, tr_attr,	HTML_TR_ATTRIBUTES,	SGML_EMPTY },
+    { "TD"	, td_attr,	HTML_TD_ATTRIBUTES,	SGML_EMPTY },
+    { "TEXTAREA", textarea_attr,HTML_TEXTAREA_ATTRIBUTES, SGML_LITTERAL },
+    { "TEXTFLOW", bodytext_attr,HTML_BODYTEXT_ATTRIBUTES, SGML_MIXED },
+    { "TFOOT"	, tr_attr,	HTML_TR_ATTRIBUTES,	SGML_EMPTY },
+    { "TH"	, td_attr,	HTML_TD_ATTRIBUTES,	SGML_EMPTY },
+    { "THEAD"	, tr_attr,	HTML_TR_ATTRIBUTES,	SGML_EMPTY },
+    { "TITLE", 	  gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_RCDATA },
+    { "TR"	, tr_attr,	HTML_TR_ATTRIBUTES,	SGML_EMPTY },
+    { "TT"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "U"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "UL"	, ulist_attr,	HTML_UL_ATTRIBUTES,	SGML_MIXED },
+    { "VAR"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_MIXED },
+    { "XMP"	, gen_attr,	HTML_GEN_ATTRIBUTES,	SGML_LITTERAL },
+};
+
+
+PUBLIC CONST SGML_dtd HTML_dtd = {
+	tags,
+	HTML_ELEMENTS,
+	entities,
+	sizeof(entities)/sizeof(char**)
+};
+
+/*	Utility Routine: useful for people building HTML objects */
+
+/*	Start anchor element
+**	--------------------
+**
+**	It is kinda convenient to have a particulr routine for
+**	starting an anchor element, as everything else for HTML is
+**	simple anyway.
+*/
+struct _HTStructured {
+    HTStructuredClass * isa;
+	/* ... */
+};
+
+PUBLIC void HTStartAnchor ARGS3(HTStructured *, obj,
+		CONST char *,  name,
+		CONST char *,  href)
+{
+    BOOL		present[HTML_A_ATTRIBUTES];
+    CONST char * 	value[HTML_A_ATTRIBUTES];
+    
+    {
+    	int i;
+    	for(i=0; i<HTML_A_ATTRIBUTES; i++)
+	    present[i] = NO;
+    }
+    if (name) {
+    	present[HTML_A_NAME] = YES;
+	value[HTML_A_NAME] = (CONST char *)name;
+    }
+    if (href) {
+        present[HTML_A_HREF] = YES;
+        value[HTML_A_HREF] = (CONST char *)href;
+    }
+    
+    (*obj->isa->start_element)(obj, HTML_A , present, value, 0);
+
+}
+
+PUBLIC void HTStartIsIndex ARGS3(HTStructured *, obj,
+		CONST char *,  prompt,
+		CONST char *,  href)
+{
+    BOOL		present[HTML_ISINDEX_ATTRIBUTES];
+    CONST char * 	value[HTML_ISINDEX_ATTRIBUTES];
+    
+    {
+    	int i;
+    	for(i=0; i<HTML_ISINDEX_ATTRIBUTES; i++)
+	    present[i] = NO;
+    }
+    if (prompt) {
+    	present[HTML_ISINDEX_PROMPT] = YES;
+	value[HTML_ISINDEX_PROMPT] = (CONST char *)prompt;
+    }
+    if (href) {
+        present[HTML_ISINDEX_HREF] = YES;
+        value[HTML_ISINDEX_HREF] = (CONST char *)href;
+    }
+    
+    (*obj->isa->start_element)(obj, HTML_ISINDEX , present, value, 0);
+
+}
+