if (TRACE) { fprintf(tfp, "Bad HTML: SELECT start tag in SELECT element.  Faking SELECT end tag. *****\n"); } else if (!me->inBadHTML) { HTUserMsg(BAD_HTML_USE_TRACE); me->inBadHTML = TRUE; }
if (LYBadHTML(me)) CTRACE((tfp, "Bad HTML: SELECT start tag in SELECT element.  Faking SELECT end tag. *****\n"));
PRIVATE void HTML_start_element ARGS6(	HTStructured *,		me,	int,			element_number,	CONST BOOL*,		present,	CONST char **,		value,	int,			tag_charset,	char **,		include){    char *alt_string = NULL;    char *id_string = NULL;    char *newtitle = NULL;    char **pdoctitle = NULL;    char *href = NULL;    char *map_href = NULL;    char *title = NULL;    char *I_value = NULL;    char *I_name = NULL;    char *temp = NULL;    int dest_char_set = UCLYhndl_for_unrec;    HTParentAnchor *dest = NULL;	     /* An anchor's destination */    BOOL dest_ismap = FALSE;		     /* Is dest an image map script? */    BOOL UseBASE = TRUE;		     /* Resoved vs. BASE if present? */    HTChildAnchor *ID_A = NULL;		     /* HTML_foo_ID anchor */    int url_type = 0, i = 0;    char *cp = NULL;    int ElementNumber = element_number;    BOOL intern_flag = FALSE;#ifdef USE_COLOR_STYLE    char* class_name;#  if OPT_SCN#    if !OMIT_SCN_KEEPING    char* Style_className_end_was = Style_className_end+1;#    endif    /* assume ';' will be appended*/#  endif#endif#ifdef USE_PSRC    if (psrc_view && !sgml_in_psrc_was_initialized) {	if (!psrc_nested_call) {	    HTTag * tag = &HTML_dtd.tags[element_number];	    char buf[200];	    CONST char* p;	    if (psrc_first_tag) {		psrc_first_tag=FALSE;		/* perform the special actions on the begining of the document.		   It's assumed that all lynx modules start generating html		   from tag (ie not a text) so we are able to trap this moment		   and initialize.		*/		psrc_nested_call=TRUE;		HTML_start_element(me,HTML_BODY, NULL,NULL,tag_charset,NULL);		HTML_start_element(me,HTML_PRE, NULL,NULL,tag_charset,NULL);		PSRCSTART(entire);		psrc_nested_call=FALSE;	    }	    psrc_nested_call=TRUE;	    /*write markup for tags and exit*/	    PSRCSTART(abracket); PUTC('<'); PSRCSTOP(abracket);	    PSRCSTART(tag);	    if (tagname_transform!=0)		PUTS(tag->name);	    else {		strcpy(buf,tag->name);		LYLowerCase(buf);		PUTS(buf);	    }	    if (present) {		for (i = 0; i < tag->number_of_attributes; i++)		    if (present[i]) {			PUTC(' ');			PSRCSTART(attrib);			if (attrname_transform!=0)			    PUTS(tag->attributes[i].name);			else {			    strcpy(buf,tag->attributes[i].name);			    LYLowerCase(buf);			    PUTS(buf);			}			if (value[i]) {			    char q='"';				/*0 in dquotes, 1 - in quotes, 2 mixed*/			    char kind= ( !strchr(value[i], '"') ?					 0 :					 !strchr(value[i], '\'') ?					 q='\'',1 :					 2);			    PUTC('=');			    PSRCSTOP(attrib);			    PSRCSTART(attrval);			    PUTC(q);			    /*is it special ? */			    if (tag->attributes[i].type == HTMLA_ANAME) {				HTStartAnchor(me,value[i],NULL);				HTML_end_element(me,HTML_A,NULL);			    } else if (tag->attributes[i].type == HTMLA_HREF) {				PSRCSTART(href);				HTStartAnchor(me,NULL,value[i]);			    }			    if (kind!=2)				PUTS(value[i]);			    else				for (p = value[i]; *p; p++)				    if (*p != '"')					PUTC(*p);				    else					PUTS("&#34;");			    /*is it special ? */			    if (tag->attributes[i].type == HTMLA_HREF) {				HTML_end_element(me,HTML_A,NULL);				PSRCSTOP(href);			    }			    PUTC(q);			    PSRCSTOP(attrval);			} /* if value */		    } /* if present[i] */	    }/* if present*/	    PSRCSTOP(tag);	    PSRCSTART(abracket); PUTC('>'); PSRCSTOP(abracket);	    psrc_nested_call=FALSE;	    return;	} /*if (!psrc_nested_call) */	/*fall through*/    }#endif /* USE_PSRC */    if (LYMapsOnly) {	if (!(ElementNumber == HTML_MAP || ElementNumber == HTML_AREA ||	      ElementNumber == HTML_BASE)) {	    return;	}    } else if (!me->text) {	UPDATE_STYLE;    }    {	/*  me->tag_charset  is charset for attribute values.  */	int j = ((tag_charset < 0) ? me->UCLYhndl : tag_charset);	if ((me->tag_charset != j) || (j < 0  /* for trace entry */)) {	    CTRACE(tfp, "me->tag_charset: %d -> %d", me->tag_charset, j );	    CTRACE(tfp, " (me->UCLYhndl: %d, tag_charset: %d)\n",		   me->UCLYhndl, tag_charset);	    me->tag_charset = j;	}    }/* this should be done differently */#if defined(USE_COLOR_STYLE)#if !OPT_SCN    HTSprintf (&Style_className, ";%s", HTML_dtd.tags[element_number].name);#else# if !OMIT_SCN_KEEPING    *Style_className_end=';';    /*strcpy(Style_className_end+1,HTML_dtd.tags[element_number].name);*/    memcpy(Style_className_end+1,	   HTML_dtd.tags[element_number].name,	   HTML_dtd.tags[element_number].name_len+1);    Style_className_end += HTML_dtd.tags[element_number].name_len+1;# endif#endif    class_name = (force_classname ? forced_classname : class_string);    force_classname = FALSE;    if (force_current_tag_style == FALSE) {	current_tag_style = class_name[0]			  ? -1			  : cached_tag_styles[element_number];    } else {	force_current_tag_style = FALSE;    }    if (current_tag_style == -1) {#if !OPT_SCN	strcpy (myHash, HTML_dtd.tags[element_number].name);#else	hcode=hash_code_lowercase_on_fly(HTML_dtd.tags[element_number].name);#endif	if (class_name[0])	{#if !OPT_SCN	    HTSprintf (&Style_className, ".%s", class_name);	    strcat (myHash, ".");	    strcat (myHash, class_name);#else#   if !OMIT_SCN_KEEPING	    int l=strlen(class_name);	    *Style_className_end = '.';	    memcpy(Style_className_end+1, class_name, l+1 );	    Style_className_end += l+1;#   endif	    hcode = hash_code_aggregate_char('.', hcode);	    hcode = hash_code_aggregate_lower_str(class_name, hcode);#endif	}#if !OPT_SCN	strtolower(myHash);	hcode = hash_code(myHash);#endif	class_string[0] = '\0';#if !OPT_SCN    if (TRACE)    {	fprintf(tfp, "CSSTRIM:%s -> %d", myHash, hcode);	if (hashStyles[hcode].code!=hcode)	{	    char *rp=strrchr(myHash, '.');	    fprintf(tfp, " (undefined) %s\n", myHash);	    if (rp)	    {		int hcd;		*rp='\0'; /* trim the class */		hcd = hash_code(myHash);		fprintf(tfp, "CSS:%s -> %d", myHash, hcd);		if (hashStyles[hcd].code!=hcd)		    fprintf(tfp, " (undefined) %s\n", myHash);		else		    fprintf(tfp, " ca=%d\n", hashStyles[hcd].color);	    }	}	else	    fprintf(tfp, " ca=%d\n", hashStyles[hcode].color);    }#endif	/* seems that this condition is always true - HV */	if (displayStyles[element_number + STARTAT].color > -2) /* actually set */	{	    CTRACE(tfp, "CSSTRIM: start_element: top <%s>\n", HTML_dtd.tags[element_number].name);	    HText_characterStyle(me->text, hcode, 1);	}    } else { /* (current_tag_style!=-1)	 */	if (class_name[0]) {#if !OPT_SCN	    HTSprintf (&Style_className, ".%s", class_name);	    strcat (myHash, ".");	    strcat (myHash, class_name);#else#     if !OMIT_SCN_KEEPING	    int l = strlen(class_name);	    *Style_className_end='.';	    memcpy(Style_className_end+1,class_name, l+1 );	    Style_className_end+=l+1;#     endif#endif	    class_string[0] = '\0';	}	hcode = current_tag_style;	HText_characterStyle(me->text, hcode , 1);	current_tag_style = -1;    }#if !OPT_SCN    strtolower(Style_className);#else#  if !OMIT_SCN_KEEPING    strtolower(Style_className_end_was);/*only the part that wasn't					  lowercased yet*/#   endif#endif#endif /* USE_COLOR_STYLE */    /*     *	Handle the start tag. - FM     */    switch (ElementNumber) {    case HTML_HTML:	break;    case HTML_HEAD:	break;    case HTML_BASE:	if (present && present[HTML_BASE_HREF] && !local_host_only &&	    value[HTML_BASE_HREF] && *value[HTML_BASE_HREF]) {	    char *base = NULL;	    char *related = NULL;	    StrAllocCopy(base, value[HTML_BASE_HREF]);	    if (!(url_type = LYLegitimizeHREF(me, &base, TRUE, TRUE))) {		CTRACE(tfp, "HTML: BASE '%s' is not an absolute URL.\n",			    (base ? base : ""));		if (me->inBadBASE == FALSE)		    HTAlert(BASE_NOT_ABSOLUTE);		me->inBadBASE = TRUE;	    }	    if (url_type == LYNXIMGMAP_URL_TYPE) {		/*		 *  These have a non-standard form, basically		 *  strip the prefix or the code below would insert		 *  a nonsense host into the pseudo URL.  These		 *  should never occur where they would be used for		 *  resolution of relative URLs anyway.  We can		 *  also strip the #map part. - kw		 */		temp = HTParse(base + 11, "",			       PARSE_ACCESS+PARSE_HOST+PARSE_PATH			       +PARSE_PUNCTUATION);		if (temp) {		    FREE(base);		    base = temp;		    temp = NULL;		}	    }	    /*	     *	Get parent's address for defaulted fields.	     */	    StrAllocCopy(related, me->node_anchor->address);	    /*	     *	Create the access field.	     */	    if ((temp = HTParse(base, related,				PARSE_ACCESS+PARSE_PUNCTUATION)) &&		*temp != '\0') {		StrAllocCopy(me->base_href, temp);	    } else {		FREE(temp);		StrAllocCopy(me->base_href, (temp = HTParse(related, "",					 PARSE_ACCESS+PARSE_PUNCTUATION)));	    }	    FREE(temp);	    /*	     *	Create the host[:port] field.	     */	    if ((temp = HTParse(base, "",				PARSE_HOST+PARSE_PUNCTUATION)) &&		!strncmp(temp, "//", 2)) {		StrAllocCat(me->base_href, temp);		if (!strcmp(me->base_href, "file://")) {		    StrAllocCat(me->base_href, "localhost");		}	    } else {		if (!strcmp(me->base_href, "file:")) {		    StrAllocCat(me->base_href, "//localhost");		} else if (strcmp(me->base_href, "news:")) {		    FREE(temp);		    StrAllocCat(me->base_href, (temp = HTParse(related, "",					    PARSE_HOST+PARSE_PUNCTUATION)));		}	    }	    FREE(temp);	    FREE(related);	    /*	     *	Create the path field.	     */	    if ((temp = HTParse(base, "",				PARSE_PATH+PARSE_PUNCTUATION)) &&		*temp != '\0') {		StrAllocCat(me->base_href, temp);	    } else if (!strcmp(me->base_href, "news:")) {		StrAllocCat(me->base_href, "*");	    } else if (!strncmp(me->base_href, "news:", 5) ||		       !strncmp(me->base_href, "nntp:", 5) ||		       !strncmp(me->base_href, "snews:", 6)) {		StrAllocCat(me->base_href, "/*");	    } else {		StrAllocCat(me->base_href, "/");	    }	    FREE(temp);	    FREE(base);	    me->inBASE = TRUE;	    StrAllocCopy(me->node_anchor->content_base, me->base_href);	}	break;    case HTML_META:	if (present)	    LYHandleMETA(me, present, value, include);	break;    case HTML_TITLE:	HTChunkClear(&me->title);	break;    case HTML_LINK:#ifndef DONT_TRACK_INTERNAL_LINKS	intern_flag = FALSE;#endif	if (present && present[HTML_LINK_HREF]) {	    CHECK_FOR_INTERN(value[HTML_LINK_HREF]);	    /*	     *	Prepare to do housekeeping on the reference. - FM	     */	    if (!value[HTML_LINK_HREF]) {		if (me->inBASE && me->base_href && *me->base_href) {		    StrAllocCopy(href, me->base_href);		} else {		    StrAllocCopy(href, me->node_anchor->address);		}	    } else {		StrAllocCopy(href, value[HTML_LINK_HREF]);		url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);	    }	    /*	     *	Check whether a base tag is in effect. - FM	     */	    if ((me->inBASE && *href != '\0' && *href != '#') &&		(temp = HTParse(href, me->base_href, PARSE_ALL)) &&		*temp != '\0')		/*		 *  Use reference related to the base.		 */		StrAllocCopy(href, temp);	    FREE(temp);	    /*	     *	Check whether to fill in localhost. - FM	     */	    LYFillLocalFileURL(&href,			       ((*href != '\0' && *href != '#' &&				 me->inBASE) ?			       me->base_href : me->node_anchor->address));	    /*	     *	Handle links with a REV attribute. - FM	     */	    if (present &&		present[HTML_LINK_REV] && value[HTML_LINK_REV]) {		/*		 *  Handle REV="made" or REV="owner". - LM & FM		 */		if (!strcasecomp("made", value[HTML_LINK_REV]) ||		    !strcasecomp("owner", value[HTML_LINK_REV])) {		    /*		     *	Load the owner element. - FM		     */		    if (!is_url(href)) {			temp = HTParse(href,				       (me->inBASE ?				     me->base_href : me->node_anchor->address),					PARSE_ALL);			StrAllocCopy(href, temp);			FREE(temp);			LYFillLocalFileURL(&href,					   (me->inBASE ?					 me->base_href :					 me->node_anchor->address));		    }		    HTAnchor_setOwner(me->node_anchor, href);		    CTRACE(tfp, "HTML: DOC OWNER '%s' found\n", href);		    FREE(href);		    /*		     *	Load the RevTitle element if a TITLE attribute		     *	and value are present. - FM		     */		    if (present && present[HTML_LINK_TITLE] &&			value[HTML_LINK_TITLE] &&			*value[HTML_LINK_TITLE] != '\0') {			StrAllocCopy(title, value[HTML_LINK_TITLE]);			TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);			LYTrimHead(title);			LYTrimTail(title);			if (*title != '\0')			    HTAnchor_setRevTitle(me->node_anchor, title);			FREE(title);		    }		    break;		}	    }	    /*	     *	Handle REL links. - FM	     */	    if (present &&		present[HTML_LINK_REL] && value[HTML_LINK_REL]) {		/*		 *  Ignore style sheets, for now. - FM		 *//*  lss and css has different syntax - lynx shouldn't try to    parse them now (it tries to parse them as lss, so it exits with    error message the 1st non-empty line) - HVV*/#ifndef USE_COLOR_STYLE		if (!strcasecomp(value[HTML_LINK_REL], "StyleSheet") ||		    !strcasecomp(value[HTML_LINK_REL], "Style")) {		    CTRACE(tfp, "HTML: StyleSheet link found.\n");#ifdef LINKEDSTYLES		    if (href && *href != '\0')		    {			int res = -999;			if ((url_type = is_url(href)) == 0 ||			    (url_type == FILE_URL_TYPE && LYisLocalFile(href))) {			    if (url_type == FILE_URL_TYPE) {				temp = HTParse(href, "", PARSE_PATH+PARSE_PUNCTUATION);				HTUnEscape(temp);				if (temp && *temp != '\0') {				    res = style_readFromFile(temp);				    if (res != 0)					StrAllocCopy(href, temp);				}				FREE(temp);			    } else {				res = style_readFromFile(href);			    }			}			CTRACE(tfp, "CSS: StyleSheet=%s %d\n", href, res);			if (res == 0)			    HTAnchor_setStyle (me->node_anchor, href);		    }		    else {			CTRACE(tfp,				"        non-local StyleSheets not yet implemented.\n");		    }#else		    CTRACE(tfp,				"        StyleSheets not yet implemented.\n");#endif		    FREE(href);		    break;		}#endif /* ! USE_COLOR_STYLE */		/*		 *  Ignore anything not registered in the the 28-Mar-95		 *  IETF HTML 3.0 draft and W3C HTML 3.2 draft, or not		 *  appropriate for Lynx banner links in the expired		 *  Maloney and Quin relrev draft.  We'll make this more		 *  efficient when the situation stabilizes, and for now,		 *  we'll treat "Banner" as another toolbar element. - FM		 */		if (!strcasecomp(value[HTML_LINK_REL], "Home") ||		    !strcasecomp(value[HTML_LINK_REL], "ToC") ||		    !strcasecomp(value[HTML_LINK_REL], "Contents") ||		    !strcasecomp(value[HTML_LINK_REL], "Index") ||		    !strcasecomp(value[HTML_LINK_REL], "Glossary") ||		    !strcasecomp(value[HTML_LINK_REL], "Copyright") ||		    !strcasecomp(value[HTML_LINK_REL], "Help") ||		    !strcasecomp(value[HTML_LINK_REL], "Search") ||		    !strcasecomp(value[HTML_LINK_REL], "Bookmark") ||		    !strcasecomp(value[HTML_LINK_REL], "Banner") ||		    !strcasecomp(value[HTML_LINK_REL], "Top") ||		    !strcasecomp(value[HTML_LINK_REL], "Origin") ||		    !strcasecomp(value[HTML_LINK_REL], "Navigator") ||		    !strcasecomp(value[HTML_LINK_REL], "Disclaimer") ||		    !strcasecomp(value[HTML_LINK_REL], "Author") ||		    !strcasecomp(value[HTML_LINK_REL], "Editor") ||		    !strcasecomp(value[HTML_LINK_REL], "Publisher") ||		    !strcasecomp(value[HTML_LINK_REL], "Trademark") ||		    !strcasecomp(value[HTML_LINK_REL], "Hotlist") ||		    !strcasecomp(value[HTML_LINK_REL], "Begin") ||		    !strcasecomp(value[HTML_LINK_REL], "First") ||		    !strcasecomp(value[HTML_LINK_REL], "End") ||		    !strcasecomp(value[HTML_LINK_REL], "Last") ||		    !strcasecomp(value[HTML_LINK_REL], "Documentation") ||		    !strcasecomp(value[HTML_LINK_REL], "Biblioentry") ||		    !strcasecomp(value[HTML_LINK_REL], "Bibliography") ||		    !strcasecomp(value[HTML_LINK_REL], "Start") ||		    !strcasecomp(value[HTML_LINK_REL], "Appendix")) {		    StrAllocCopy(title, value[HTML_LINK_REL]);		    pdoctitle = &title;	/* for setting HTAnchor's title */		} else		if (!strcasecomp(value[HTML_LINK_REL], "Up") ||		    !strcasecomp(value[HTML_LINK_REL], "Next") ||		    !strcasecomp(value[HTML_LINK_REL], "Previous") ||		    !strcasecomp(value[HTML_LINK_REL], "Prev") ||		    !strcasecomp(value[HTML_LINK_REL], "Child") ||		    !strcasecomp(value[HTML_LINK_REL], "Sibling") ||		    !strcasecomp(value[HTML_LINK_REL], "Parent") ||		    !strcasecomp(value[HTML_LINK_REL], "Meta") ||		    !strcasecomp(value[HTML_LINK_REL], "URC") ||		    !strcasecomp(value[HTML_LINK_REL], "Pointer") ||		    !strcasecomp(value[HTML_LINK_REL], "Translation") ||		    !strcasecomp(value[HTML_LINK_REL], "Definition") ||		    !strcasecomp(value[HTML_LINK_REL], "Alternate") ||		    !strcasecomp(value[HTML_LINK_REL], "Section") ||		    !strcasecomp(value[HTML_LINK_REL], "Subsection") ||		    !strcasecomp(value[HTML_LINK_REL], "Chapter")) {		    StrAllocCopy(title, value[HTML_LINK_REL]);		    /* not setting target HTAnchor's title, for these		       links of highly relative character.  Instead,		       try to remember the REL attribute as a property		       of the link (but not the destination), in the		       (otherwise underused) link type in a special format;		       the LIST page generation code may later use it. - kw */		    if (!intern_flag) {			StrAllocCopy(temp, "RelTitle: ");			StrAllocCat(temp, value[HTML_LINK_REL]);		    }		} else {		    CTRACE(tfp, "HTML: LINK with REL=\"%s\" ignored.\n",				 value[HTML_LINK_REL]);		    FREE(href);		    break;		}	    }	} else if (present &&		   present[HTML_LINK_REL] && value[HTML_LINK_REL]) {	    /*	     *	If no HREF was specified, handle special REL links	     *	with self-designated HREFs. - FM	     */	    if (!strcasecomp(value[HTML_LINK_REL], "Home")) {		StrAllocCopy(href, LynxHome);	    } else if (!strcasecomp(value[HTML_LINK_REL], "Help")) {		StrAllocCopy(href, helpfile);	    } else if (!strcasecomp(value[HTML_LINK_REL], "Index")) {		StrAllocCopy(href, indexfile);	    } else {		CTRACE(tfp, "HTML: LINK with REL=\"%s\" and no HREF ignored.\n",			    value[HTML_LINK_REL]);		break;	    }	    StrAllocCopy(title, value[HTML_LINK_REL]);	    pdoctitle = &title;	}	if (href) {	    /*	     *	Create a title (link name) from the TITLE value,	     *	if present, or default to the REL value that was	     *	loaded into title. - FM	     */	    if (present && present[HTML_LINK_TITLE] &&		value[HTML_LINK_TITLE] && *value[HTML_LINK_TITLE] != '\0') {		StrAllocCopy(title, value[HTML_LINK_TITLE]);		TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);		LYTrimHead(title);		LYTrimTail(title);		pdoctitle = &title;		FREE(temp); /* forget about recording RelTitle - kw */	    }	    if (!(title && *title)) {		FREE(href);		FREE(title);		break;	    }	    if (me->inA) {		/*		 *  Ugh!  The LINK tag, which is a HEAD element,		 *  is in an Anchor, which is BODY element.  All		 *  we can do is close the Anchor and cross our		 *  fingers. - FM		 */		SET_SKIP_STACK(HTML_A);		HTML_end_element(me, HTML_A, include);	    }	    /*	     *	Create anchors for the links that simulate	     *	a toolbar. - FM	     */	    me->CurrentA = HTAnchor_findChildAndLink(				me->node_anchor,	/* Parent */				NULL,			/* Tag */				href,			/* Addresss */				temp				   ? (HTLinkType*)HTAtom_for(temp)				   : INTERN_LT);	/* Type */	    FREE(temp);	    if ((dest = HTAnchor_parent(			    HTAnchor_followMainLink((HTAnchor*)me->CurrentA)				      )) != NULL) {		if (pdoctitle && !HTAnchor_title(dest))		    HTAnchor_setTitle(dest, *pdoctitle);		dest = NULL;		if (present[HTML_LINK_CHARSET] &&		    value[HTML_LINK_CHARSET] && *value[HTML_LINK_CHARSET] != '\0') {		    dest_char_set = UCGetLYhndl_byMIME(value[HTML_LINK_CHARSET]);		    if (dest_char_set < 0)			dest_char_set = UCLYhndl_for_unrec;		    if (dest_char_set < 0)  /* recover if not defined :-( */			dest_char_set = UCLYhndl_for_unspec; /* always >= 0 */		}		if (dest)		    HTAnchor_setUCInfoStage(dest, dest_char_set,					    UCT_STAGE_PARSER,					    UCT_SETBY_LINK);	    }	    UPDATE_STYLE;	    if (!HText_hasToolbar(me->text) &&		(ID_A = HTAnchor_findChildAndLink(					me->node_anchor,	/* Parent */					LYToolbarName,		/* Tag */					NULL,			/* Addresss */					(HTLinkType*)0))) {	/* Type */		HText_appendCharacter(me->text, '#');		HText_setLastChar(me->text, ' ');  /* absorb white space */		HText_beginAnchor(me->text, me->inUnderline, ID_A);		HText_endAnchor(me->text, 0);		HText_setToolbar(me->text);	    }	    HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);	    if (me->inBoldH == FALSE)		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);#ifdef USE_COLOR_STYLE	    if (present && present[HTML_LINK_CLASS] &&	    value && *value[HTML_LINK_CLASS]!='\0')	    {		char *tmp = 0;		HTSprintf0(&tmp, "link.%s.%s", value[HTML_LINK_CLASS], title);		CTRACE(tfp, "CSSTRIM:link=%s\n", tmp);		HText_characterStyle(me->text, hash_code(tmp), 1);		HTML_put_string(me, title);		HTML_put_string(me, " (");		HTML_put_string(me, value[HTML_LINK_CLASS]);		HTML_put_string(me, ")");		HText_characterStyle(me->text, hash_code(tmp), 0);		FREE(tmp);	    }	    else#endif	    HTML_put_string(me, title);	    if (me->inBoldH == FALSE)		HText_appendCharacter(me->text, LY_BOLD_END_CHAR);	    HText_endAnchor(me->text, 0);	}	FREE(href);	FREE(title);	break;    case HTML_ISINDEX:	if (((present)) &&	    ((present[HTML_ISINDEX_HREF] && value[HTML_ISINDEX_HREF]) ||	     (present[HTML_ISINDEX_ACTION] && value[HTML_ISINDEX_ACTION]))) {	    char * action = NULL;	    char * isindex_href = NULL;	    /*	     *	Lynx was supporting ACTION, which never made it into	     *	the HTML 2.0 specs.  HTML 3.0 uses HREF, so we'll	     *	use that too, but allow use of ACTION as an alternate	     *	until people have fully switched over. - FM	     */	    if (present[HTML_ISINDEX_HREF] && value[HTML_ISINDEX_HREF])		StrAllocCopy(isindex_href, value[HTML_ISINDEX_HREF]);	    else		StrAllocCopy(isindex_href, value[HTML_ISINDEX_ACTION]);	    url_type = LYLegitimizeHREF(me, &isindex_href, TRUE, TRUE);	    /*	     *	Check whether a base tag is in effect.	     */	    if (me->inBASE && *isindex_href != '\0' && *isindex_href != '#')		action = HTParse(isindex_href, me->base_href, PARSE_ALL);	    if (!(action && *action))		action = HTParse(isindex_href,				 me->node_anchor->address, PARSE_ALL);	    FREE(isindex_href);	    if (action && *action) {		HTAnchor_setIndex(me->node_anchor, action);	    } else {		HTAnchor_setIndex(me->node_anchor, me->node_anchor->address);	    }	    FREE(action);	} else {	    if (me->inBASE)		/*		 *  Use base.		 */		HTAnchor_setIndex(me->node_anchor, me->base_href);	    else		/*		 *  Use index's address.		 */		HTAnchor_setIndex(me->node_anchor, me->node_anchor->address);	}	/*	 *  Support HTML 3.0 PROMPT attribute. - FM	 */	if (present &&	    present[HTML_ISINDEX_PROMPT] &&	    value[HTML_ISINDEX_PROMPT] && *value[HTML_ISINDEX_PROMPT]) {	    StrAllocCopy(temp, value[HTML_ISINDEX_PROMPT]);	    TRANSLATE_AND_UNESCAPE_ENTITIES(&temp, TRUE, FALSE);	    LYTrimHead(temp);	    LYTrimTail(temp);	    if (*temp != '\0') {		StrAllocCat(temp, " ");		HTAnchor_setPrompt(me->node_anchor, temp);	    } else {		HTAnchor_setPrompt(me->node_anchor, ENTER_DATABASE_QUERY);	    }	    FREE(temp);	} else {	    HTAnchor_setPrompt(me->node_anchor, ENTER_DATABASE_QUERY);	}	break;    case HTML_NEXTID:	/* if (present && present[NEXTID_N] && value[NEXTID_N])		HText_setNextId(me->text, atoi(value[NEXTID_N])); */	break;    case HTML_STYLE:	/*	 *  We're getting it as Literal text, which, for now,	 *  we'll just ignore. - FM	 */	HTChunkClear(&me->style_block);	break;    case HTML_SCRIPT:	/*	 *  We're getting it as Literal text, which, for now,	 *  we'll just ignore. - FM	 */	HTChunkClear(&me->script);	break;    case HTML_BODY:	CHECK_ID(HTML_BODY_ID);	if (HText_hasToolbar(me->text))	    HText_appendParagraph(me->text);	break;    case HTML_FRAMESET:	break;    case HTML_FRAME:	if (present && present[HTML_FRAME_NAME] &&	    value[HTML_FRAME_NAME] && *value[HTML_FRAME_NAME]) {	    StrAllocCopy(id_string, value[HTML_FRAME_NAME]);	    TRANSLATE_AND_UNESCAPE_ENTITIES(&id_string, TRUE, FALSE);	    LYTrimHead(id_string);	    LYTrimTail(id_string);	}	if (present && present[HTML_FRAME_SRC] &&	    value[HTML_FRAME_SRC] && *value[HTML_FRAME_SRC] != '\0') {	    StrAllocCopy(href, value[HTML_FRAME_SRC]);	    CHECK_FOR_INTERN(href);	    url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);	    /*	     *	Check whether a base tag is in effect. - FM	     */	    if ((me->inBASE && *href != '\0' && *href != '#') &&		(temp = HTParse(href, me->base_href, PARSE_ALL)) &&		*temp != '\0')		/*		 *  Use reference related to the base.		 */		StrAllocCopy(href, temp);	    FREE(temp);	    /*	     *	Check whether to fill in localhost. - FM	     */	    LYFillLocalFileURL(&href,			       ((*href != '\0' && *href != '#' &&				 me->inBASE) ?			       me->base_href : me->node_anchor->address));	    if (me->inA) {		SET_SKIP_STACK(HTML_A);		HTML_end_element(me, HTML_A, include);	    }	    me->CurrentA = HTAnchor_findChildAndLink(				me->node_anchor,	/* Parent */				NULL,			/* Tag */				href,			/* Addresss */				INTERN_LT);		/* Type */	    LYEnsureSingleSpace(me);	    if (me->inUnderline == FALSE)		HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);	    HTML_put_string(me, "FRAME:");	    if (me->inUnderline == FALSE)		HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);	    HTML_put_character(me, ' ');	    me->in_word = NO;	    CHECK_ID(HTML_FRAME_ID);	    HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);	    if (me->inBoldH == FALSE)		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);	    HTML_put_string(me, (id_string ? id_string : href));	    FREE(href);	    if (me->inBoldH == FALSE)		HText_appendCharacter(me->text, LY_BOLD_END_CHAR);	    HText_endAnchor(me->text, 0);	    LYEnsureSingleSpace(me);	} else {	    CHECK_ID(HTML_FRAME_ID);	}	FREE(id_string);	break;    case HTML_NOFRAMES:	LYEnsureDoubleSpace(me);	LYResetParagraphAlignment(me);	break;    case HTML_IFRAME:	if (present && present[HTML_IFRAME_NAME] &&	    value[HTML_IFRAME_NAME] && *value[HTML_IFRAME_NAME]) {	    StrAllocCopy(id_string, value[HTML_IFRAME_NAME]);	    TRANSLATE_AND_UNESCAPE_ENTITIES(&id_string, TRUE, FALSE);	    LYTrimHead(id_string);	    LYTrimTail(id_string);	}	if (present && present[HTML_IFRAME_SRC] &&	    value[HTML_IFRAME_SRC] && *value[HTML_IFRAME_SRC] != '\0') {	    StrAllocCopy(href, value[HTML_IFRAME_SRC]);	    CHECK_FOR_INTERN(href);	    url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);	    /*	     *	Check whether a base tag is in effect. - FM	     */	    if ((me->inBASE && *href != '\0' && *href != '#') &&		(temp = HTParse(href, me->base_href, PARSE_ALL)) &&		*temp != '\0')		/*		 *  Use reference related to the base.		 */		StrAllocCopy(href, temp);	    FREE(temp);	    /*	     *	Check whether to fill in localhost. - FM	     */	    LYFillLocalFileURL(&href,			       ((*href != '\0' && *href != '#' &&				 me->inBASE) ?			       me->base_href : me->node_anchor->address));	    if (me->inA)		HTML_end_element(me, HTML_A, include);	    me->CurrentA = HTAnchor_findChildAndLink(				me->node_anchor,	/* Parent */				NULL,			/* Tag */				href,			/* Addresss */				INTERN_LT);		/* Type */	    LYEnsureDoubleSpace(me);	    LYResetParagraphAlignment(me);	    if (me->inUnderline == FALSE)		HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);	    HTML_put_string(me, "IFRAME:");	    if (me->inUnderline == FALSE)		HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);	    HTML_put_character(me, ' ');	    me->in_word = NO;	    CHECK_ID(HTML_IFRAME_ID);	    HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);	    if (me->inBoldH == FALSE)		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);	    HTML_put_string(me, (id_string ? id_string : href));	    FREE(href);	    if (me->inBoldH == FALSE)		HText_appendCharacter(me->text, LY_BOLD_END_CHAR);	    HText_endAnchor(me->text, 0);	    LYEnsureSingleSpace(me);	} else {	    CHECK_ID(HTML_IFRAME_ID);	}	FREE(id_string);	break;    case HTML_BANNER:    case HTML_MARQUEE:	change_paragraph_style(me, styles[HTML_BANNER]);	UPDATE_STYLE;	if (me->sp->tag_number == ElementNumber)	    LYEnsureDoubleSpace(me);	/*	 *  Treat this as a toolbar if we don't have one	 *  yet, and we are in the first half of the	 *  first page. - FM	 */	if ((!HText_hasToolbar(me->text) &&	     HText_getLines(me->text) < (display_lines/2)) &&	    (ID_A = HTAnchor_findChildAndLink(					me->node_anchor,	/* Parent */					LYToolbarName,		/* Tag */					NULL,			/* Addresss */					(HTLinkType*)0))) {	/* Type */	    HText_beginAnchor(me->text, me->inUnderline, ID_A);	    HText_endAnchor(me->text, 0);	    HText_setToolbar(me->text);	}	CHECK_ID(HTML_GEN_ID);	break;    case HTML_CENTER:    case HTML_DIV:	if (me->Division_Level < (MAX_NESTING - 1)) {	    me->Division_Level++;	} else {	    CTRACE(tfp,		"HTML: ****** Maximum nesting of %d divisions exceeded!\n",		MAX_NESTING);	}	if (ElementNumber == HTML_CENTER) {	    me->DivisionAlignments[me->Division_Level] = HT_CENTER;	    change_paragraph_style(me, styles[HTML_DCENTER]);	    UPDATE_STYLE;	    me->current_default_alignment = styles[HTML_DCENTER]->alignment;	} else if (present && present[HTML_DIV_ALIGN] &&		   value[HTML_DIV_ALIGN] && *value[HTML_DIV_ALIGN]) {	    if (!strcasecomp(value[HTML_DIV_ALIGN], "center")) {		me->DivisionAlignments[me->Division_Level] = HT_CENTER;		change_paragraph_style(me, styles[HTML_DCENTER]);		UPDATE_STYLE;		me->current_default_alignment = styles[HTML_DCENTER]->alignment;	    } else if (!strcasecomp(value[HTML_DIV_ALIGN], "right")) {		me->DivisionAlignments[me->Division_Level] = HT_RIGHT;		change_paragraph_style(me, styles[HTML_DRIGHT]);		UPDATE_STYLE;		me->current_default_alignment = styles[HTML_DRIGHT]->alignment;	    } else {		me->DivisionAlignments[me->Division_Level] = HT_LEFT;		change_paragraph_style(me, styles[HTML_DLEFT]);		UPDATE_STYLE;		me->current_default_alignment = styles[HTML_DLEFT]->alignment;	    }	} else {	    me->DivisionAlignments[me->Division_Level] = HT_LEFT;	    change_paragraph_style(me, styles[HTML_DLEFT]);	    UPDATE_STYLE;	    me->current_default_alignment = styles[HTML_DLEFT]->alignment;	}	CHECK_ID(HTML_DIV_ID);	break;    case HTML_H1:    case HTML_H2:    case HTML_H3:    case HTML_H4:    case HTML_H5:    case HTML_H6:	/*	 *  Close the previous style if not done by HTML doc.	 *  Added to get rid of core dumps in BAD HTML on the net.	 *		GAB 07-07-94	 *  But then again, these are actually allowed to nest.  I guess	 *  I have to depend on the HTML writers correct style.	 *		GAB 07-12-94	if (i_prior_style != -1) {	    HTML_end_element(me, i_prior_style);	}	i_prior_style = ElementNumber;	 */	/*	 *  Check whether we have an H# in a list,	 *  and if so, treat it as an LH. - FM	 */	if ((me->List_Nesting_Level >= 0) &&	    (me->sp[0].tag_number == HTML_UL ||	     me->sp[0].tag_number == HTML_OL ||	     me->sp[0].tag_number == HTML_MENU ||	     me->sp[0].tag_number == HTML_DIR)) {	    if (HTML_dtd.tags[HTML_LH].contents == SGML_EMPTY) {		ElementNumber = HTML_LH;	    } else {		me->new_style = me->sp[0].style;		ElementNumber = me->sp[0].tag_number;		UPDATE_STYLE;	    }	    /*	     *	Some authors use H# headers as a substitute for	     *	FONT, so check if this one immediately followed	     *	an LI.	If so, both me->inP and me->in_word will	     *	be FALSE (though the line might not be empty due	     *	to a bullet and/or nbsp) and we can assume it is	     *	just for a FONT change.  We thus will not create	     *	another line break nor add to the current left	     *	indentation. - FM	     */	    if (!(me->inP == FALSE && me->in_word == NO)) {		HText_appendParagraph(me->text);		HTML_put_character(me, HT_NON_BREAK_SPACE);		HText_setLastChar(me->text, ' ');		me->in_word = NO;		me->inP = FALSE;	    }	    CHECK_ID(HTML_H_ID);	    break;	}	if (present && present[HTML_H_ALIGN] &&	    value[HTML_H_ALIGN] && *value[HTML_H_ALIGN]) {	    if (!strcasecomp(value[HTML_H_ALIGN], "center"))		change_paragraph_style(me, styles[HTML_HCENTER]);	    else if (!strcasecomp(value[HTML_H_ALIGN], "right"))		change_paragraph_style(me, styles[HTML_HRIGHT]);	    else if (!strcasecomp(value[HTML_H_ALIGN], "left") ||		     !strcasecomp(value[HTML_H_ALIGN], "justify"))		change_paragraph_style(me, styles[HTML_HLEFT]);	    else		change_paragraph_style(me, styles[ElementNumber]);	} else if (me->Division_Level >= 0) {	    if (me->DivisionAlignments[me->Division_Level] == HT_CENTER) {		change_paragraph_style(me, styles[HTML_HCENTER]);	    } else if (me->DivisionAlignments[me->Division_Level] == HT_LEFT) {		change_paragraph_style(me, styles[HTML_HLEFT]);	    } else if (me->DivisionAlignments[me->Division_Level] == HT_RIGHT) {		change_paragraph_style(me, styles[HTML_HRIGHT]);	    }	} else {	    change_paragraph_style(me, styles[ElementNumber]);	}	UPDATE_STYLE;	CHECK_ID(HTML_H_ID);	if ((bold_headers == TRUE ||	     (ElementNumber == HTML_H1 && bold_H1 == TRUE)) &&	    (styles[ElementNumber]->font&HT_BOLD)) {	    if (me->inBoldA == FALSE && me->inBoldH == FALSE) {		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);	    }	    me->inBoldH = TRUE;	}	break;    case HTML_P:	LYHandleP(me, present, value, include, TRUE);	break;    case HTML_BR:	UPDATE_STYLE;	CHECK_ID(HTML_GEN_ID);	  /* Add a \r (new line) if these three conditions are true:	   *   1. We are not collapsing BR's, and	   *   2. The previous line has text on it, or	   *   3. This line has text on it.	   * Otherwise, don't do anything. -DH 980814, TD 980827	   */	if ((LYCollapseBRs == FALSE &&	     HText_PreviousLineSize(me->text, FALSE)) ||	    HText_LastLineSize(me->text, FALSE)) {	    HText_setLastChar(me->text, ' ');  /* absorb white space */	    HText_appendCharacter(me->text, '\r');	}	me->in_word = NO;	me->inP = FALSE;	break;    case HTML_WBR:	UPDATE_STYLE;	CHECK_ID(HTML_GEN_ID);	HText_setBreakPoint(me->text);	break;    case HTML_HY:    case HTML_SHY:	UPDATE_STYLE;	CHECK_ID(HTML_GEN_ID);	HText_appendCharacter(me->text, LY_SOFT_HYPHEN);	break;    case HTML_HR:	{	    int width;	    /*	     *	Start a new line only if we had printable	     *	characters following the previous newline,	     *	or remove the previous line if both it and	     *	the last line are blank. - FM	     */	    UPDATE_STYLE;	    if (HText_LastLineSize(me->text, FALSE)) {		HText_setLastChar(me->text, ' ');  /* absorb white space */		HText_appendCharacter(me->text, '\r');	    } else if (!HText_PreviousLineSize(me->text, FALSE)) {		HText_RemovePreviousLine(me->text);	    }	    me->in_word = NO;	    me->inP = FALSE;	    /*	     *	Add an ID link if needed. - FM	     */	    CHECK_ID(HTML_HR_ID);	   /*	    *  Center lines within the current margins, if	    *  a right or left ALIGNment is not specified.	    *  If WIDTH="#%" is given and not garbage,	    *  use that to calculate the width, otherwise	    *  use the default width. - FM	    */	    if (present && present[HTML_HR_ALIGN] && value[HTML_HR_ALIGN]) {		if (!strcasecomp(value[HTML_HR_ALIGN], "right")) {		    me->sp->style->alignment = HT_RIGHT;		} else if (!strcasecomp(value[HTML_HR_ALIGN], "left")) {		    me->sp->style->alignment = HT_LEFT;		} else {		    me->sp->style->alignment = HT_CENTER;		}	    } else {		me->sp->style->alignment = HT_CENTER;	    }	    width = LYcols - 1 -		    me->new_style->leftIndent - me->new_style->rightIndent;	    if (present && present[HTML_HR_WIDTH] && value[HTML_HR_WIDTH] &&		isdigit(*value[HTML_HR_WIDTH]) &&		value[HTML_HR_WIDTH][strlen(value[HTML_HR_WIDTH])-1] == '%') {		char *percent = NULL;		int Percent, Width;		StrAllocCopy(percent, value[HTML_HR_WIDTH]);		percent[strlen(percent)-1] = '\0';		Percent = atoi(percent);		if (Percent > 100 || Percent < 1)		    width -= 5;		else {		    Width = (width * Percent) / 100;		    if (Width < 1)			width = 1;		    else			width = Width;		}		FREE(percent);	    } else {		width -= 5;	    }	    for (i = 0; i < width; i++)		HTML_put_character(me, '_');	    HText_appendCharacter(me->text, '\r');	    me->in_word = NO;	    me->inP = FALSE;	    /*	     *	Reset the alignment appropriately	     *	for the division and/or block. - FM	     */	    if (me->List_Nesting_Level < 0 &&		me->Division_Level >= 0) {		me->sp->style->alignment =				me->DivisionAlignments[me->Division_Level];	    } else if (!strcmp(me->sp->style->name, "HeadingCenter") ||		       !strcmp(me->sp->style->name, "Heading1")) {		me->sp->style->alignment = HT_CENTER;	    } else if (!strcmp(me->sp->style->name, "HeadingRight")) {		me->sp->style->alignment = HT_RIGHT;	    } else {		me->sp->style->alignment = HT_LEFT;	    }	    /*	     *	Add a blank line and set the second line	     *	indentation for lists and addresses, or a	     *	paragraph separator for other blocks. - FM	     */	    if (me->List_Nesting_Level >= 0 ||		me->sp[0].tag_number == HTML_ADDRESS) {		HText_setLastChar(me->text, ' ');  /* absorb white space */		HText_appendCharacter(me->text, '\r');	    } else {		HText_appendParagraph(me->text);	    }	}	break;    case HTML_TAB:	if (!present) { /* Bad tag.  Must have at least one attribute. - FM */	    CTRACE(tfp, "HTML: TAB tag has no attributes.  Ignored.\n");	    break;	}	UPDATE_STYLE;	if (present[HTML_TAB_ALIGN] && value[HTML_TAB_ALIGN] &&	    (strcasecomp(value[HTML_TAB_ALIGN], "left") ||	     !(present[HTML_TAB_TO] || present[HTML_TAB_INDENT]))) {	    /*	     *	Just ensure a collapsible space, until we have	     *	the ALIGN and DP attributes implemented. - FM	     */	    HTML_put_character(me, ' ');	    CTRACE(tfp, "HTML: ALIGN not 'left'.  Using space instead of TAB.\n");	} else if (!LYoverride_default_alignment(me) &&		   me->current_default_alignment != HT_LEFT) {	    /*	     *	Just ensure a collapsible space, until we	     *	can replace HText_getCurrentColumn() in	     *	GridText.c with code which doesn't require	     *	that the alignment be HT_LEFT. - FM	     */	    HTML_put_character(me, ' ');	    CTRACE(tfp, "HTML: Not HT_LEFT.  Using space instead of TAB.\n");	} else if ((present[HTML_TAB_TO] &&		    value[HTML_TAB_TO] && *value[HTML_TAB_TO]) ||		   (present[HTML_TAB_INDENT] &&		    value[HTML_TAB_INDENT] &&		    isdigit(*value[HTML_TAB_INDENT]))) {	    int column, target = -1;	    int enval = 2;	    column = HText_getCurrentColumn(me->text);	    if (present[HTML_TAB_TO]) {		/*		 *  TO has priority over INDENT if both are present. - FM		 */		StrAllocCopy(temp, value[HTML_TAB_TO]);		TRANSLATE_AND_UNESCAPE_TO_STD(&temp);		if (*temp) {		    target = HText_getTabIDColumn(me->text, temp);		}	    } else if (!(temp && *temp) && present[HTML_TAB_INDENT] &&		       value[HTML_TAB_INDENT] &&		       isdigit(*value[HTML_TAB_INDENT])) {		/*		 *  The INDENT value is in "en" (enval per column) units.		 *  Divide it by enval, rounding odd values up. - FM		 */		target =		   (int)(((1.0 * atoi(value[HTML_TAB_INDENT]))/enval)+(0.5));	    }	    FREE(temp);	    /*	     *	If we are being directed to a column too far to the left	     *	or right, just add a collapsible space, otherwise, add the	     *	appropriate number of spaces. - FM	     */	    if (target < column ||		target > HText_getMaximumColumn(me->text)) {		HTML_put_character(me, ' ');		CTRACE(tfp, "HTML: Column out of bounds.  Using space instead of TAB.\n");	    } else {		for (i = column; i < target; i++)		    HText_appendCharacter(me->text, ' ');		HText_setLastChar(me->text, ' ');  /* absorb white space */	    }	}	me->in_word = NO;	/*	 *  If we have an ID attribute, save it together	 *  with the value of the column we've reached. - FM	 */	if (present[HTML_TAB_ID] &&	    value[HTML_TAB_ID] && *value[HTML_TAB_ID]) {	    StrAllocCopy(temp, value[HTML_TAB_ID]);	    TRANSLATE_AND_UNESCAPE_TO_STD(&temp);	    if (*temp)		HText_setTabID(me->text, temp);	    FREE(temp);	}	break;    case HTML_BASEFONT:	break;    case HTML_FONT:	/*	 *  FONT *may* have been declared SGML_EMPTY in HTMLDTD.c, and	 *  SGML_character() in SGML.c *may* check for a FONT end	 *  tag to call HTML_end_element() directly (with a	 *  check in that to bypass decrementing of the HTML	 *  parser's stack).  Or this may have been really a </FONT>	 *  end tag, for which some incarnations of SGML.c would fake	 *  a <FONT> start tag instead. - fm & kw	 *	 *  But if we have an open FONT, DON'T close that one now,	 *  since FONT tags can be legally nested AFAIK, and Lynx	 *  currently doesn't do anything with them anyway... - kw	 */#ifdef NOTUSED_FOTEMODS	if (me->inFONT == TRUE)	    HTML_end_element(me, HTML_FONT, &include);#endif /* NOTUSED_FOTEMODS */	/*	 *  Set flag to know we are in a FONT container, and	 *  add code to do something about it, someday. - FM	 */	me->inFONT = TRUE;	break;    case HTML_B:			/* Physical character highlighting */    case HTML_BLINK:    case HTML_I:    case HTML_U:    case HTML_CITE:			/* Logical character highlighting */    case HTML_EM:    case HTML_STRONG:	UPDATE_STYLE;	me->Underline_Level++;	CHECK_ID(HTML_GEN_ID);	/*	 *  Ignore this if inside of a bold anchor or header.	 *  Can't display both underline and bold at same time.	 */	if (me->inBoldA == TRUE || me->inBoldH == TRUE) {	    CTRACE(tfp, "Underline Level is %d\n", me->Underline_Level);	    break;	}	if (me->inUnderline == FALSE) {	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);	    me->inUnderline = TRUE;	    CTRACE(tfp,"Beginning underline\n");	} else {	    CTRACE(tfp,"Underline Level is %d\n", me->Underline_Level);	}	break;    case HTML_ABBREV:	/* Miscellaneous character containers */    case HTML_ACRONYM:    case HTML_AU:    case HTML_AUTHOR:    case HTML_BIG:    case HTML_CODE:    case HTML_DFN:    case HTML_KBD:    case HTML_SAMP:    case HTML_SMALL:    case HTML_SUB:    case HTML_SUP:    case HTML_TT:    case HTML_VAR:	CHECK_ID(HTML_GEN_ID);	break; /* ignore */    case HTML_DEL:    case HTML_S:    case HTML_STRIKE:	CHECK_ID(HTML_GEN_ID);	if (me->inUnderline == FALSE)	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);	HTML_put_string(me, "[DEL:");	if (me->inUnderline == FALSE)	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);	HTML_put_character(me, ' ');	me->in_word = NO;	break;    case HTML_INS:	CHECK_ID(HTML_GEN_ID);	if (me->inUnderline == FALSE)	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);	HTML_put_string(me, "[INS:");	if (me->inUnderline == FALSE)	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);	HTML_put_character(me, ' ');	me->in_word = NO;	break;    case HTML_Q:	CHECK_ID(HTML_GEN_ID);	/*	 *  Should check LANG and/or DIR attributes, and the	 *  me->node_anchor->charset and/or yet to be added	 *  structure elements, to determine whether we should	 *  use chevrons, but for now we'll always use double-	 *  or single-quotes. - FM	 */	if (!(me->Quote_Level & 1))	    HTML_put_character(me, '"');	else	    HTML_put_character(me, '`');	me->Quote_Level++;	break;    case HTML_PRE:				/* Formatted text */	/*	**  Set our inPRE flag to FALSE so that a newline	**  immediately following the PRE start tag will	**  be ignored.  HTML_put_character() will set it	**  to TRUE when the first character within the	**  PRE block is received. - FM	*/	me->inPRE = FALSE;    case HTML_LISTING:				/* Literal text */    case HTML_XMP:    case HTML_PLAINTEXT:	change_paragraph_style(me, styles[ElementNumber]);	UPDATE_STYLE;	CHECK_ID(HTML_GEN_ID);	if (me->comment_end)	    HText_appendText(me->text, me->comment_end);	break;    case HTML_BLOCKQUOTE:    case HTML_BQ:	change_paragraph_style(me, styles[ElementNumber]);	UPDATE_STYLE;	if (me->sp->tag_number == ElementNumber)	    LYEnsureDoubleSpace(me);	CHECK_ID(HTML_BQ_ID);	break;    case HTML_NOTE:	change_paragraph_style(me, styles[ElementNumber]);	UPDATE_STYLE;	if (me->sp->tag_number == ElementNumber)	    LYEnsureDoubleSpace(me);	CHECK_ID(HTML_NOTE_ID);	{	    char *note = NULL;	    /*	     *	Indicate the type of NOTE.	     */	    if (present && present[HTML_NOTE_CLASS] &&		value[HTML_NOTE_CLASS] &&		(!strcasecomp(value[HTML_NOTE_CLASS], "CAUTION") ||		 !strcasecomp(value[HTML_NOTE_CLASS], "WARNING"))) {		StrAllocCopy(note, value[HTML_NOTE_CLASS]);		LYUpperCase(note);		StrAllocCat(note, ":");	    } else if (present && present[HTML_NOTE_ROLE] &&		       value[HTML_NOTE_ROLE] &&		       (!strcasecomp(value[HTML_NOTE_ROLE], "CAUTION") ||			!strcasecomp(value[HTML_NOTE_ROLE], "WARNING"))) {		StrAllocCopy(note, value[HTML_NOTE_ROLE]);		LYUpperCase(note);		StrAllocCat(note, ":");	    } else {		StrAllocCopy(note, "NOTE:");	    }	    if (me->inUnderline == FALSE)		HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);	    HTML_put_string(me, note);	    if (me->inUnderline == FALSE)		HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);	    HTML_put_character(me, ' ');	    FREE(note);	}	me->inLABEL = TRUE;	me->in_word = NO;	me->inP = FALSE;	break;    case HTML_ADDRESS:	change_paragraph_style(me, styles[ElementNumber]);	UPDATE_STYLE;	if (me->sp->tag_number == ElementNumber)	    LYEnsureDoubleSpace(me);	CHECK_ID(HTML_ADDRESS_ID);	break;    case HTML_DL:	me->List_Nesting_Level++;  /* increment the List nesting level */	if (me->List_Nesting_Level <= 0) {	    change_paragraph_style(me, present && present[HTML_DL_COMPACT]				      ? styles[HTML_DLC] : styles[HTML_DL]);	} else if (me->List_Nesting_Level >= 6) {	    change_paragraph_style(me, present && present[HTML_DL_COMPACT]				      ? styles[HTML_DLC6] : styles[HTML_DL6]);	} else {	    change_paragraph_style(me, present && present[HTML_DL_COMPACT]		 ? styles[(HTML_DLC1 - 1) + me->List_Nesting_Level]		 : styles[(HTML_DL1 - 1) + me->List_Nesting_Level]);	}	UPDATE_STYLE;	  /* update to the new style */	CHECK_ID(HTML_DL_ID);	break;    case HTML_DLC:	me->List_Nesting_Level++;  /* increment the List nesting level */	if (me->List_Nesting_Level <= 0) {	    change_paragraph_style(me, styles[HTML_DLC]);	} else if (me->List_Nesting_Level >= 6) {	    change_paragraph_style(me, styles[HTML_DLC6]);	} else {	    change_paragraph_style(me,			    styles[(HTML_DLC1 - 1) + me->List_Nesting_Level]);	}	UPDATE_STYLE;	  /* update to the new style */	CHECK_ID(HTML_DL_ID);	break;    case HTML_DT:	CHECK_ID(HTML_GEN_ID);	if (!me->style_change) {	    BOOL in_line_1 = HText_inLineOne(me->text);	    HTCoord saved_spaceBefore = me->sp->style->spaceBefore;	    HTCoord saved_spaceAfter = me->sp->style->spaceAfter;	    /*	     *  If there are several DT elements and this is not the first,	     *  and the preceding DT element's first (and normally only) line	     *  has not yet been ended, suppress intervening blank line by	     *  temporarily modifying the paragraph style in place.  Ugly	     *  but there's ample precedence. - kw	     */	    if (in_line_1) {		me->sp->style->spaceBefore = 0;	/* temporary change */		me->sp->style->spaceAfter = 0;	/* temporary change */	    }	    HText_appendParagraph(me->text);	    me->sp->style->spaceBefore = saved_spaceBefore; /* undo */	    me->sp->style->spaceAfter = saved_spaceAfter; /* undo */	    me->in_word = NO;	    me->sp->style->alignment = HT_LEFT;	}	me->inP = FALSE;	break;    case HTML_DD:	CHECK_ID(HTML_GEN_ID);	HText_setLastChar(me->text, ' ');  /* absorb white space */	if (!me->style_change)	{	    if (HText_LastLineSize(me->text, FALSE)) {		HText_appendCharacter(me->text, '\r');	    } else {		HText_NegateLineOne(me->text);	    }	} else {	    UPDATE_STYLE;	    HText_appendCharacter(me->text, '\t');	}	me->sp->style->alignment = HT_LEFT;	me->in_word = NO;	me->inP = FALSE;	break;    case HTML_OL:	/*	 * Set the default TYPE.	 */	 me->OL_Type[(me->List_Nesting_Level < 11 ?			 me->List_Nesting_Level+1 : 11)] = '1';	/*	 *  Check whether we have a starting sequence number,	 *  or want to continue the numbering from a previous	 *  OL in this nest. - FM	 */	if (present && (present[HTML_OL_SEQNUM] || present[HTML_OL_START])) {	    int seqnum;	    /*	     *	Give preference to the valid HTML 3.0 SEQNUM attribute name	     *	over the Netscape START attribute name (too bad the Netscape	     *	developers didn't read the HTML 3.0 specs before re-inventing	     *	the "wheel" as "we'll"). - FM	     */	    if (present[HTML_OL_SEQNUM] &&		value[HTML_OL_SEQNUM] && *value[HTML_OL_SEQNUM]) {		seqnum = atoi(value[HTML_OL_SEQNUM]);	    } else if (present[HTML_OL_START] &&		       value[HTML_OL_START] && *value[HTML_OL_START]) {		seqnum = atoi(value[HTML_OL_START]);	    } else {		seqnum = 1;	    }	    /*	     *	Don't allow negative numbers less than	     *	or equal to our flags, or numbers less	     *	than 1 if an Alphabetic or Roman TYPE. - FM	     */	    if (present[HTML_OL_TYPE] && value[HTML_OL_TYPE]) {		if (*value[HTML_OL_TYPE] == 'A') {		    me->OL_Type[(me->List_Nesting_Level < 11 ?				    me->List_Nesting_Level+1 : 11)] = 'A';		    if (seqnum < 1)			seqnum = 1;		} else if (*value[HTML_OL_TYPE] == 'a') {		    me->OL_Type[(me->List_Nesting_Level < 11 ?				    me->List_Nesting_Level+1 : 11)] = 'a';		    if (seqnum < 1)			seqnum = 1;		} else if (*value[HTML_OL_TYPE] == 'I') {		    me->OL_Type[(me->List_Nesting_Level < 11 ?				    me->List_Nesting_Level+1 : 11)] = 'I';		    if (seqnum < 1)			seqnum = 1;		} else if (*value[HTML_OL_TYPE] == 'i') {		    me->OL_Type[(me->List_Nesting_Level < 11 ?				    me->List_Nesting_Level+1 : 11)] = 'i';		    if (seqnum < 1)			seqnum = 1;		} else {		  if (seqnum <= OL_VOID)		      seqnum = OL_VOID + 1;		}	    } else if (seqnum <= OL_VOID) {		seqnum = OL_VOID + 1;	    }	    me->OL_Counter[(me->List_Nesting_Level < 11 ?			       me->List_Nesting_Level+1 : 11)] = seqnum;	} else if (present && present[HTML_OL_CONTINUE]) {	    me->OL_Counter[me->List_Nesting_Level < 11 ?			      me->List_Nesting_Level+1 : 11] = OL_CONTINUE;	} else {	    me->OL_Counter[(me->List_Nesting_Level < 11 ?			       me->List_Nesting_Level+1 : 11)] = 1;	    if (present && present[HTML_OL_TYPE] && value[HTML_OL_TYPE]) {		if (*value[HTML_OL_TYPE] == 'A') {		    me->OL_Type[(me->List_Nesting_Level < 11 ?				    me->List_Nesting_Level+1 : 11)] = 'A';		} else if (*value[HTML_OL_TYPE] == 'a') {		    me->OL_Type[(me->List_Nesting_Level < 11 ?				    me->List_Nesting_Level+1 : 11)] = 'a';		} else if (*value[HTML_OL_TYPE] == 'I') {		    me->OL_Type[(me->List_Nesting_Level < 11 ?				    me->List_Nesting_Level+1 : 11)] = 'I';		} else if (*value[HTML_OL_TYPE] == 'i') {		    me->OL_Type[(me->List_Nesting_Level < 11 ?				    me->List_Nesting_Level+1 : 11)] = 'i';		}	    }	}	me->List_Nesting_Level++;	if (me->List_Nesting_Level <= 0) {	    change_paragraph_style(me, styles[ElementNumber]);	} else if (me->List_Nesting_Level >= 6) {	    change_paragraph_style(me, styles[HTML_OL6]);	} else {	    change_paragraph_style(me,			  styles[HTML_OL1 + me->List_Nesting_Level - 1]);	}	UPDATE_STYLE;  /* update to the new style */	CHECK_ID(HTML_OL_ID);	break;    case HTML_UL:	me->List_Nesting_Level++;	if (me->List_Nesting_Level <= 0) {	    if (!(present && present[HTML_UL_PLAIN]) &&		!(present && present[HTML_UL_TYPE] &&		  value[HTML_UL_TYPE] &&		  0==strcasecomp(value[HTML_UL_TYPE], "PLAIN"))) {		change_paragraph_style(me, styles[ElementNumber]);	    } else {		change_paragraph_style(me, styles[HTML_DIR]);		ElementNumber = HTML_DIR;	    }	} else if (me->List_Nesting_Level >= 6) {	    if (!(present && present[HTML_UL_PLAIN]) &&		!(present && present[HTML_UL_TYPE] &&		  value[HTML_UL_TYPE] &&		  0==strcasecomp(value[HTML_UL_TYPE], "PLAIN"))) {		change_paragraph_style(me, styles[HTML_OL6]);	    } else {		change_paragraph_style(me, styles[HTML_MENU6]);		ElementNumber = HTML_DIR;	    }	} else {	    if (!(present && present[HTML_UL_PLAIN]) &&		!(present && present[HTML_UL_TYPE] &&		  value[HTML_UL_TYPE] &&		  0==strcasecomp(value[HTML_UL_TYPE], "PLAIN"))) {		change_paragraph_style(me,			  styles[HTML_OL1 + me->List_Nesting_Level - 1]);	    } else {		change_paragraph_style(me,			  styles[HTML_MENU1 + me->List_Nesting_Level - 1]);		ElementNumber = HTML_DIR;	    }	}	UPDATE_STYLE;  /* update to the new style */	CHECK_ID(HTML_UL_ID);	break;    case HTML_MENU:    case HTML_DIR:	me->List_Nesting_Level++;	if (me->List_Nesting_Level <= 0) {	    change_paragraph_style(me, styles[ElementNumber]);	} else if (me->List_Nesting_Level >= 6) {	    change_paragraph_style(me, styles[HTML_MENU6]);	} else {	    change_paragraph_style(me,			  styles[HTML_MENU1 + me->List_Nesting_Level - 1]);	}	UPDATE_STYLE;  /* update to the new style */	CHECK_ID(HTML_UL_ID);	break;    case HTML_LH:	UPDATE_STYLE;  /* update to the new style */	HText_appendParagraph(me->text);	CHECK_ID(HTML_GEN_ID);	HTML_put_character(me, HT_NON_BREAK_SPACE);	HText_setLastChar(me->text, ' ');	me->in_word = NO;	me->inP = FALSE;	break;    case HTML_LI:	UPDATE_STYLE;  /* update to the new style */	HText_appendParagraph(me->text);	me->sp->style->alignment = HT_LEFT;	CHECK_ID(HTML_LI_ID);	if (me->sp[0].tag_number == HTML_OL) {	    char number_string[20];	    int counter, seqnum;	    char seqtype;	    counter = me->List_Nesting_Level < 11 ?			   me->List_Nesting_Level : 11;	    if (present && present[HTML_LI_TYPE] && value[HTML_LI_TYPE]) {		if (*value[HTML_LI_TYPE] == '1') {		    me->OL_Type[counter] = '1';		} else if (*value[HTML_LI_TYPE] == 'A') {		    me->OL_Type[counter] = 'A';		} else if (*value[HTML_LI_TYPE] == 'a') {		    me->OL_Type[counter] = 'a';		} else if (*value[HTML_LI_TYPE] == 'I') {		    me->OL_Type[counter] = 'I';		} else if (*value[HTML_LI_TYPE] == 'i') {		    me->OL_Type[counter] = 'i';		}	    }	    if (present && present[HTML_LI_VALUE] &&		((value[HTML_LI_VALUE] != NULL) &&		 (*value[HTML_LI_VALUE] != '\0')) &&		((isdigit(*value[HTML_LI_VALUE])) ||		 (*value[HTML_LI_VALUE] == '-' &&		  isdigit(*(value[HTML_LI_VALUE] + 1))))) {		seqnum = atoi(value[HTML_LI_VALUE]);		if (seqnum <= OL_VOID)		    seqnum = OL_VOID + 1;		seqtype = me->OL_Type[counter];		if (seqtype != '1' && seqnum < 1)		    seqnum = 1;		me->OL_Counter[counter] = seqnum + 1;	    } else if (me->OL_Counter[counter] >= OL_VOID) {		seqnum = me->OL_Counter[counter]++;		seqtype = me->OL_Type[counter];		if (seqtype != '1' && seqnum < 1) {		    seqnum = 1;		    me->OL_Counter[counter] = seqnum + 1;		}	    } else {		seqnum = me->Last_OL_Count + 1;		seqtype = me->Last_OL_Type;		for (i = (counter - 1); i >= 0; i--) {		    if (me->OL_Counter[i] > OL_VOID) {			seqnum = me->OL_Counter[i]++;			seqtype = me->OL_Type[i];			i = 0;		    }		}	    }	    if (seqtype == 'A') {		sprintf(number_string, LYUppercaseA_OL_String(seqnum));	    } else if (seqtype == 'a') {		sprintf(number_string, LYLowercaseA_OL_String(seqnum));	    } else if (seqtype == 'I') {		sprintf(number_string, LYUppercaseI_OL_String(seqnum));	    } else if (seqtype == 'i') {		sprintf(number_string, LYLowercaseI_OL_String(seqnum));	    } else {		sprintf(number_string, "%2d.", seqnum);	    }	    me->Last_OL_Count = seqnum;	    me->Last_OL_Type = seqtype;	    /*	     *	Hack, because there is no append string!	     */	    for (i = 0; number_string[i] != '\0'; i++)		if (number_string[i] == ' ')		    HTML_put_character(me, HT_NON_BREAK_SPACE);		else		    HTML_put_character(me, number_string[i]);	    /*	     *	Use HTML_put_character so that any other spaces	     *	coming through will be collapsed.  We'll use	     *	nbsp, so it won't break at the spacing character	     *	if there are no spaces in the subsequent text up	     *	to the right margin, but will declare it as a	     *	normal space to ensure collapsing if a normal	     *	space does immediately follow it. - FM	     */	    HTML_put_character(me, HT_NON_BREAK_SPACE);	    HText_setLastChar(me->text, ' ');	} else if (me->sp[0].tag_number == HTML_UL) {	    /*	     *	Hack, because there is no append string!	     */	    HTML_put_character(me, HT_NON_BREAK_SPACE);	    HTML_put_character(me, HT_NON_BREAK_SPACE);	    switch(me->List_Nesting_Level % 7) {		case 0:		    HTML_put_character(me, '*');		    break;		case 1:		    HTML_put_character(me, '+');		    break;		case 2:		    HTML_put_character(me, 'o');		    break;		case 3:		    HTML_put_character(me, '#');		    break;		case 4:		    HTML_put_character(me, '@');		    break;		case 5:		    HTML_put_character(me, '-');		    break;		case 6:		    HTML_put_character(me, '=');		    break;	    }	    /*	     *	Keep using HTML_put_character so that any other	     *	spaces coming through will be collapsed.  We use	     *	nbsp, so we won't wrap at the spacing character	     *	if there are no spaces in the subsequent text up	     *	to the right margin, but will declare it as a	     *	normal space to ensure collapsing if a normal	     *	space does immediately follow it. - FM	     */	    HTML_put_character(me, HT_NON_BREAK_SPACE);	    HText_setLastChar(me->text, ' ');	} else {	    /*	     *	Hack, because there is no append string!	     */	    HTML_put_character(me, HT_NON_BREAK_SPACE);	    HTML_put_character(me, HT_NON_BREAK_SPACE);	    HText_setLastChar(me->text, ' ');	}	me->in_word = NO;	me->inP = FALSE;	break;    case HTML_SPAN:	CHECK_ID(HTML_GEN_ID);	/*	 *  Should check LANG and/or DIR attributes, and the	 *  me->node_anchor->charset and/or yet to be added	 *  structure elements, and do something here. - FM	 */	break;    case HTML_BDO:	CHECK_ID(HTML_GEN_ID);	/*	 *  Should check DIR (and LANG) attributes, and the	 *  me->node_anchor->charset and/or yet to be added	 *  structure elements, and do something here. - FM	 */	break;    case HTML_SPOT:	CHECK_ID(HTML_GEN_ID);	break;    case HTML_FN:	change_paragraph_style(me, styles[ElementNumber]);	UPDATE_STYLE;	if (me->sp->tag_number == ElementNumber)	    LYEnsureDoubleSpace(me);	CHECK_ID(HTML_FN_ID);	if (me->inUnderline == FALSE)	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);	HTML_put_string(me, "FOOTNOTE:");	if (me->inUnderline == FALSE)	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);	HTML_put_character(me, ' ');	me->inLABEL = TRUE;	me->in_word = NO;	me->inP = FALSE;	break;    case HTML_A:	/*	 *  A may have been declared SGML_EMPTY in HTMLDTD.c, and	 *  SGML_character() in SGML.c may check for an A end	 *  tag to call HTML_end_element() directly (with a	 *  check in that to bypass decrementing of the HTML	 *  parser's stack), so if we have an open A, close	 *  that one now. - FM & kw	 */	if (me->inA) {	    SET_SKIP_STACK(HTML_A);	    HTML_end_element(me, HTML_A, include);	}	/*	 *  Set to know we are in an anchor.	 */	me->inA = TRUE;	/*	 *  Load id_string if we have an ID or NAME. - FM	 */	if (present && present[HTML_A_ID] &&	    value[HTML_A_ID] && *value[HTML_A_ID]) {	    StrAllocCopy(id_string, value[HTML_A_ID]);	} else if (present && present[HTML_A_NAME] &&		   value[HTML_A_NAME] && *value[HTML_A_NAME]) {	    StrAllocCopy(id_string, value[HTML_A_NAME]);	}	if (id_string) {	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);	    if (*id_string == '\0') {		FREE(id_string);	    }	}	/*	 *  Handle the reference. - FM	 */	if (present && present[HTML_A_HREF]) {#ifndef DONT_TRACK_INTERNAL_LINKS	    if (present[HTML_A_ISMAP])		intern_flag = FALSE;	    else		CHECK_FOR_INTERN(value[HTML_A_HREF]);#endif	    /*	     *	Prepare to do housekeeping on the reference. - FM	     */	    if (!value[HTML_A_HREF] || *value[HTML_A_HREF] == '\0') {		StrAllocCopy(href, me->node_anchor->address);	    } else if (*value[HTML_A_HREF] == '#') {		StrAllocCopy(href, me->node_anchor->address);		if (strlen(value[HTML_A_HREF]) > 1) {		    StrAllocCat(href, value[HTML_A_HREF]);		}	    } else {		StrAllocCopy(href, value[HTML_A_HREF]);	    }	    url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);	    /*	     *	Deal with our ftp gateway kludge. - FM	     */	    if (!url_type && !strncmp(href, "/foo/..", 7) &&		(!strncmp(me->node_anchor->address, "ftp:", 4) ||		 !strncmp(me->node_anchor->address, "file:", 5))) {		for (i = 0; (href[i] = href[i+7]) != 0; i++)		    ;	    }	    /*	     *	Set to know we are making the content bold.	     */	    me->inBoldA = TRUE;	    /*	     *	Check whether a base tag is in effect. - FM	     */	    if ((me->inBASE && *href != '\0' && *href != '#') &&		(temp = HTParse(href, me->base_href, PARSE_ALL)) &&		*temp != '\0')		/*		 *  Use reference related to the base.		 */		StrAllocCopy(href, temp);	    FREE(temp);	    /*	     *	Check whether to fill in localhost. - FM	     */	    LYFillLocalFileURL(&href,			       ((*href != '\0' && *href != '#' &&				 me->inBASE) ?			       me->base_href : me->node_anchor->address));	} else {	    if (bold_name_anchors == TRUE) {		me->inBoldA = TRUE;	    }	}#ifndef DONT_TRACK_INTERNAL_LINKS	if (present && present[HTML_A_TYPE] && value[HTML_A_TYPE]) {	    StrAllocCopy(temp, value[HTML_A_TYPE]);	    if (!intern_flag && href &&		!strcasecomp(value[HTML_A_TYPE], HTAtom_name(LINK_INTERNAL)) &&		0 != strcmp(me->node_anchor->address, LYlist_temp_url()) &&		0 != strncmp(me->node_anchor->address, "LYNXIMGMAP:", 11)) {		/* Some kind of spoof?		** Found TYPE="internal link" but not in a valid context		** where we have written it. - kw		*/		CTRACE(tfp, "HTML: Found invalid HREF=\"%s\" TYPE=\"%s\"!\n",			    href, temp);		FREE(temp);	    }	}#endif /* DONT_TRACK_INTERNAL_LINKS */	me->CurrentA = HTAnchor_findChildAndLink(			me->node_anchor,			/* Parent */			id_string,				/* Tag */			href,					/* Address */			temp ?		(HTLinkType*)HTAtom_for(temp) : INTERN_LT);  /* Type */	FREE(temp);	FREE(id_string);	if (me->CurrentA && present) {	    if (present[HTML_A_TITLE] &&		value[HTML_A_TITLE] && *value[HTML_A_TITLE] != '\0') {		StrAllocCopy(title, value[HTML_A_TITLE]);		TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);		LYTrimHead(title);		LYTrimTail(title);		if (*title == '\0') {		    FREE(title);		}	    }	    if (present[HTML_A_ISMAP])		dest_ismap = TRUE;	    if (present[HTML_A_CHARSET] &&		value[HTML_A_CHARSET] && *value[HTML_A_CHARSET] != '\0') {		/*		**  Set up to load the anchor's chartrans structures		**  appropriately for the current display character		**  set if it can handle what's claimed. - FM		*/		StrAllocCopy(temp, value[HTML_A_CHARSET]);		TRANSLATE_AND_UNESCAPE_TO_STD(&temp);		dest_char_set = UCGetLYhndl_byMIME(temp);		if (dest_char_set < 0) {			dest_char_set = UCLYhndl_for_unrec;		if (dest_char_set < 0) /* recover if not defined :-( */			dest_char_set = UCLYhndl_for_unspec; /* always >= 0 */		}	    }	    if (title != NULL || dest_ismap == TRUE || dest_char_set >= 0) {		dest = HTAnchor_parent(			HTAnchor_followMainLink((HTAnchor*)me->CurrentA)				      );	    }	    if (dest && title != NULL && HTAnchor_title(dest) == NULL)		HTAnchor_setTitle(dest, title);	    if (dest && dest_ismap)		dest->isISMAPScript = TRUE;	    if (dest) {		/*		**  Load the anchor's chartrans structures.		**  This should be done more intelligently		**  when setting up the structured object,		**  but it gets the job done for now. - FM		*/		HTAnchor_setUCInfoStage(dest, dest_char_set,					UCT_STAGE_MIME,					UCT_SETBY_DEFAULT);		HTAnchor_setUCInfoStage(dest, dest_char_set,					UCT_STAGE_PARSER,					UCT_SETBY_LINK);	    }	    FREE(temp);	    dest = NULL;	    dest_ismap = FALSE;	    FREE(title);	}	me->CurrentANum = HText_beginAnchor(me->text,					    me->inUnderline, me->CurrentA);	if (me->inBoldA == TRUE && me->inBoldH == FALSE)	    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);#ifdef NOTUSED_FOTEMODS	/*	 *  Close an HREF-less NAMED-ed now if we aren't making their	 *  content bold, and let the check in HTML_end_element() deal	 *  with any dangling end tag this creates. - FM	 */	if (href == NULL && me->inBoldA == FALSE) {	    SET_SKIP_STACK(HTML_A);	    HTML_end_element(me, HTML_A, &include);	}#endif /* NOTUSED_FOTEMODS */	FREE(href);	break;    case HTML_IMG:			/* Images */	/*	 *  If we're in an anchor, get the destination, and if it's a	 *  clickable image for the current anchor, set our flags for	 *  faking a 0,0 coordinate pair, which typically returns the	 *  image's default. - FM	 */	if (me->inA && me->CurrentA) {	    if ((dest = HTAnchor_parent(			HTAnchor_followMainLink((HTAnchor*)me->CurrentA)				      )) != NULL) {		if (dest->isISMAPScript == TRUE) {		    dest_ismap = TRUE;		    CTRACE(tfp, "HTML: '%s' is an ISMAP script\n",				dest->address);		} else if (present && present[HTML_IMG_ISMAP]) {		    dest_ismap = TRUE;		    dest->isISMAPScript = TRUE;		    CTRACE(tfp, "HTML: Designating '%s' as an ISMAP script\n",				dest->address);		}	    }	}#ifndef DONT_TRACK_INTERNAL_LINKS	intern_flag = FALSE;	/* unless set below - kw */#endif	/*	 *  If there's a USEMAP, resolve it. - FM	 */	if (present && present[HTML_IMG_USEMAP] &&	    value[HTML_IMG_USEMAP] && *value[HTML_IMG_USEMAP]) {	    StrAllocCopy(map_href, value[HTML_IMG_USEMAP]);	    CHECK_FOR_INTERN(map_href);	    url_type = LYLegitimizeHREF(me, &map_href, TRUE, TRUE);	    /*	     *	If map_href ended up zero-length or otherwise doesn't	     *	have a hash, it can't be valid, so ignore it. - FM	     */	    if (strchr(map_href, '#') == NULL) {		FREE(map_href);	    }	}	/*	 *  Handle a MAP reference if we have one at this point. - FM	 */	if (map_href) {	    /*	     *	If the MAP reference doesn't yet begin with a scheme,	     *	check whether a base tag is in effect. - FM	     */	    if (!url_type && me->inBASE) {		/*		 *  If the		 *  USEMAP value is a lone fragment and LYSeekFragMAPinCur		 *  is set, we'll use the current document's URL for		 *  resolving.	Otherwise use the BASE. - kw		 */		if ((*map_href == '#' &&		     LYSeekFragMAPinCur == TRUE)) {		    /*		     *	Use reference related to the current stream. - FM		     */		    temp = HTParse(map_href, me->node_anchor->address,				    PARSE_ALL);		    StrAllocCopy(map_href, temp);		    UseBASE = FALSE;		} else {		    /*		     *	Use reference related to the base. - FM		     */		    temp = HTParse(map_href, me->base_href, PARSE_ALL);		    StrAllocCopy(map_href, temp);		    UseBASE = TRUE;		}		FREE(temp);	    }	    /*	     *	Check whether to fill in localhost. - FM	     */	    LYFillLocalFileURL(&map_href,			       ((UseBASE && me->inBASE) ?			  me->base_href : me->node_anchor->address));	    UseBASE = TRUE;	    /*	     *	If it's not yet a URL, resolve versus	     *	the current document's address. - FM	     */	    if (!(url_type = is_url(map_href))) {		temp = HTParse(map_href, me->node_anchor->address, PARSE_ALL);		StrAllocCopy(map_href, temp);		FREE(temp);	    }	    /*	     *	Prepend our client-side MAP access field. - FM	     */	    StrAllocCopy(temp, "LYNXIMGMAP:");	    StrAllocCat(temp, map_href);	    StrAllocCopy(map_href, temp);	    FREE(temp);	}	/*	 *  Check whether we want to suppress the server-side	 *  ISMAP link if a client-side MAP is present. - FM	 */	if (LYNoISMAPifUSEMAP && map_href && dest_ismap) {	    dest_ismap = FALSE;	    dest = NULL;	}	/*	 *  Check for a TITLE attribute. - FM	 */	if (present && present[HTML_IMG_TITLE] &&	    value[HTML_IMG_TITLE] && *value[HTML_IMG_TITLE]) {	    StrAllocCopy(title, value[HTML_IMG_TITLE]);	    TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);	    LYTrimHead(title);	    LYTrimTail(title);	    if (*title == '\0') {		FREE(title);	    }	}	/*	 *  If there's an ALT string, use it, unless the ALT string	 *  is zero-length or just spaces and we are making all SRCs	 *  links or have a USEMAP link. - FM	 */	if (((present) &&	     (present[HTML_IMG_ALT] && value[HTML_IMG_ALT])) &&	    (!clickable_images ||	     ((clickable_images || map_href) &&	      *value[HTML_IMG_ALT] != '\0'))) {	    StrAllocCopy(alt_string, value[HTML_IMG_ALT]);	    TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,					    me->UsePlainSpace, me->HiddenValue);	    /*	     *	If it's all spaces and we are making SRC or	     *	USEMAP links, treat it as zero-length. - FM	     */	    if (clickable_images || map_href) {		LYTrimHead(alt_string);		LYTrimTail(alt_string);		if (*alt_string == '\0') {		    if (map_href) {			StrAllocCopy(alt_string, (title ? title :				     (temp = MakeNewMapValue(value,"USEMAP"))));			FREE(temp);		    } else if (dest_ismap) {			StrAllocCopy(alt_string, (title ? title :				     (temp = MakeNewMapValue(value,"ISMAP"))));			FREE(temp);		    } else if (me->inA == TRUE && dest) {			StrAllocCopy(alt_string, (title ?						  title :						  VERBOSE_IMG(value, HTML_IMG_SRC, "[LINK]")));		    } else {			StrAllocCopy(alt_string,					     (title ? title :						  ((present &&						    present[HTML_IMG_ISOBJECT]) ?						    "(OBJECT)" :						    VERBOSE_IMG(value, HTML_IMG_SRC, "[INLINE]"))));		    }		}	    }	} else if (map_href) {	    StrAllocCopy(alt_string, (title ? title :				      (temp = MakeNewMapValue(value,"USEMAP"))));	    FREE(temp);	} else if ((dest_ismap == TRUE) ||		   (me->inA && present && present[HTML_IMG_ISMAP])) {	    StrAllocCopy(alt_string, (title ? title :				      (temp = MakeNewMapValue(value,"ISMAP"))));	    FREE(temp);	} else if (me->inA == TRUE && dest) {	    StrAllocCopy(alt_string, (title ?				      title :				      VERBOSE_IMG(value, HTML_IMG_SRC, "[LINK]")));	} else {	    if (pseudo_inline_alts || clickable_images)		StrAllocCopy(alt_string, (title ? title :			  ((present &&			    present[HTML_IMG_ISOBJECT]) ?					     "(OBJECT)" :					     VERBOSE_IMG(value, HTML_IMG_SRC, "[INLINE]"))));	    else		StrAllocCopy(alt_string, (title ?					  title : ""));	}	if (*alt_string == '\0' && map_href) {	    StrAllocCopy(alt_string, (temp = MakeNewMapValue(value,"USEMAP")));	    FREE(temp);	}	CTRACE(tfp, "HTML IMG: USEMAP=%d ISMAP=%d ANCHOR=%d PARA=%d\n",		    map_href ? 1 : 0,		    (dest_ismap == TRUE) ? 1 : 0,		    me->inA, me->inP);	/*	 *  Check for an ID attribute. - FM	 */	if (present && present[HTML_IMG_ID] &&	    value[HTML_IMG_ID] && *value[HTML_IMG_ID]) {	    StrAllocCopy(id_string, value[HTML_IMG_ID]);	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);	    if (*id_string == '\0') {		FREE(id_string);	    }	}	/*	 *  Create links to the SRC for all images, if desired. - FM	 */	if (clickable_images &&	    present && present[HTML_IMG_SRC] &&	    value[HTML_IMG_SRC] && *value[HTML_IMG_SRC] != '\0') {	    StrAllocCopy(href, value[HTML_IMG_SRC]);	    url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);	    /*	     *	Check whether a base tag is in effect. - FM	     */	    if ((me->inBASE && *href != '\0' && *href != '#') &&		(temp = HTParse(href, me->base_href, PARSE_ALL)) &&		*temp != '\0')		/*		 *  Use reference related to the base.		 */		StrAllocCopy(href, temp);	    FREE(temp);	    /*	     *	Check whether to fill in localhost. - FM	     */	    LYFillLocalFileURL(&href,			       ((*href != '\0' && *href != '#' &&				 me->inBASE) ?			       me->base_href : me->node_anchor->address));	    /*	     *	If it's an ISMAP and/or USEMAP, or graphic for an	     *	anchor, end that anchor and start one for the SRC. - FM	     */	    if (me->inA) {		/*		 *  If we have a USEMAP, end this anchor and		 *  start a new one for the client-side MAP. - FM		 */		if (map_href) {		    if (dest_ismap) {			HTML_put_character(me, ' ');			me->in_word = NO;			HTML_put_string(me, (temp = MakeNewMapValue(value,"ISMAP")));			FREE(temp);		    } else if (dest) {			HTML_put_character(me, ' ');			me->in_word = NO;			HTML_put_string(me, "[LINK]");		    }		    if (me->inBoldA == TRUE && me->inBoldH == FALSE) {			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		    }		    me->inBoldA = FALSE;		    HText_endAnchor(me->text, me->CurrentANum);		    me->CurrentANum = 0;		    if (dest_ismap || dest)			HTML_put_character(me, '-');		    if (id_string) {			if ((ID_A = HTAnchor_findChildAndLink(				  me->node_anchor,	/* Parent */				  id_string,		/* Tag */				  NULL,			/* Addresss */				  (HTLinkType*)0)) != NULL) {	/* Type */			    HText_beginAnchor(me->text, me->inUnderline, ID_A);			    HText_endAnchor(me->text, 0);			}		    }		    me->CurrentA = HTAnchor_findChildAndLink(				me->node_anchor,	/* Parent */				NULL,			/* Tag */				map_href,		/* Addresss */				INTERN_LT);		/* Type */		    if (me->CurrentA && title) {			if ((dest = HTAnchor_parent(				HTAnchor_followMainLink((HTAnchor*)me->CurrentA)						  )) != NULL) {			    if (!HTAnchor_title(dest))				HTAnchor_setTitle(dest, title);			}		    }		    me->CurrentANum = HText_beginAnchor(me->text,							me->inUnderline,							me->CurrentA);		    if (me->inBoldA == FALSE && me->inBoldH == FALSE) {			HText_appendCharacter(me->text, LY_BOLD_START_CHAR);		    }		    me->inBoldA = TRUE;		} else {		    HTML_put_character(me, ' ');/* space char may be ignored */		    me->in_word = NO;		}		HTML_put_string(me, alt_string);		if (me->inBoldA == TRUE && me->inBoldH == FALSE) {		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		}		me->inBoldA = FALSE;		HText_endAnchor(me->text, me->CurrentANum);		me->CurrentANum = 0;		HTML_put_character(me, '-');		FREE(newtitle);		StrAllocCopy(alt_string,			     ((present &&			       present[HTML_IMG_ISOBJECT]) ?		   ((map_href || dest_ismap) ?				   "(IMAGE)" : "(OBJECT)") :				   VERBOSE_IMG(value, HTML_IMG_SRC, "[IMAGE]")));		if (id_string && !map_href) {		    if ((ID_A = HTAnchor_findChildAndLink(				  me->node_anchor,	/* Parent */				  id_string,		/* Tag */				  NULL,			/* Addresss */				  (HTLinkType*)0)) != NULL) {	/* Type */			HText_beginAnchor(me->text, me->inUnderline, ID_A);			HText_endAnchor(me->text, 0);		    }		}	    } else if (map_href) {		HTML_put_character(me, ' ');  /* space char may be ignored */		me->in_word = NO;		if (id_string) {		    if ((ID_A = HTAnchor_findChildAndLink(				  me->node_anchor,	/* Parent */				  id_string,		/* Tag */				  NULL,			/* Addresss */				  (HTLinkType*)0)) != NULL) {	/* Type */			HText_beginAnchor(me->text, me->inUnderline, ID_A);			HText_endAnchor(me->text, 0);		    }		}		me->CurrentA = HTAnchor_findChildAndLink(				me->node_anchor,	/* Parent */				NULL,			/* Tag */				map_href,		/* Addresss */				INTERN_LT);		/* Type */		if (me->CurrentA && title) {		    if ((dest = HTAnchor_parent(				HTAnchor_followMainLink((HTAnchor*)me->CurrentA)					      )) != NULL) {			if (!HTAnchor_title(dest))			    HTAnchor_setTitle(dest, title);		    }		}		me->CurrentANum = HText_beginAnchor(me->text,						    me->inUnderline,						    me->CurrentA);		if (me->inBoldA == FALSE && me->inBoldH == FALSE)		    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);		me->inBoldA = TRUE;		HTML_put_string(me, alt_string);		if (me->inBoldA == TRUE && me->inBoldH == FALSE) {		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		}		me->inBoldA = FALSE;		HText_endAnchor(me->text, me->CurrentANum);		me->CurrentANum = 0;		HTML_put_character(me, '-');		FREE(newtitle);		StrAllocCopy(alt_string,			     ((present &&			       present[HTML_IMG_ISOBJECT]) ?						 "(IMAGE)" :						 VERBOSE_IMG(value, HTML_IMG_SRC, "[IMAGE]")));	    } else {		HTML_put_character(me, ' ');  /* space char may be ignored */		me->in_word = NO;		if (id_string) {		    if ((ID_A = HTAnchor_findChildAndLink(				  me->node_anchor,	/* Parent */				  id_string,		/* Tag */				  NULL,			/* Addresss */				  (HTLinkType*)0)) != NULL) {	/* Type */			HText_beginAnchor(me->text, me->inUnderline, ID_A);			HText_endAnchor(me->text, 0);		    }		}	    }	    /*	     *	Create the link to the SRC. - FM	     */	    me->CurrentA = HTAnchor_findChildAndLink(			me->node_anchor,		/* Parent */			NULL,				/* Tag */			href,				/* Addresss */			(HTLinkType*)0);		/* Type */	    FREE(href);	    me->CurrentANum = HText_beginAnchor(me->text,						me->inUnderline,						me->CurrentA);	    if (me->inBoldH == FALSE)		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);	    HTML_put_string(me, alt_string);	    if (!me->inA) {		if (me->inBoldH == FALSE)		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		HText_endAnchor(me->text, me->CurrentANum);		me->CurrentANum = 0;		HTML_put_character(me, ' ');  /* space char may be ignored */		me->in_word = NO;	    } else {		HTML_put_character(me, ' ');  /* space char may be ignored */		me->in_word = NO;		me->inBoldA = TRUE;	    }	} else if (map_href) {	    if (me->inA) {		/*		 *  We're in an anchor and have a USEMAP, so end the anchor		 *  and start a new one for the client-side MAP. - FM		 */		if (dest_ismap) {		    HTML_put_character(me, ' ');/* space char may be ignored */		    me->in_word = NO;		    HTML_put_string(me, (temp = MakeNewMapValue(value,"ISMAP")));		    FREE(temp);		} else if (dest) {		    HTML_put_character(me, ' ');/* space char may be ignored */		    me->in_word = NO;		    HTML_put_string(me, "[LINK]");		}		if (me->inBoldA == TRUE && me->inBoldH == FALSE) {		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		}		me->inBoldA = FALSE;		HText_endAnchor(me->text, me->CurrentANum);		me->CurrentANum = 0;		if (dest_ismap || dest) {		    HTML_put_character(me, '-');		}	    } else {		HTML_put_character(me, ' ');		me->in_word = NO;	    }	    me->CurrentA = HTAnchor_findChildAndLink(				me->node_anchor,	/* Parent */				NULL,			/* Tag */				map_href,		/* Addresss */				INTERN_LT);		/* Type */	    if (me->CurrentA && title) {		if ((dest = HTAnchor_parent(				HTAnchor_followMainLink((HTAnchor*)me->CurrentA)					  )) != NULL) {		    if (!HTAnchor_title(dest))			HTAnchor_setTitle(dest, title);		}	    }	    me->CurrentANum = HText_beginAnchor(me->text,						me->inUnderline,						me->CurrentA);	    if (me->inBoldA == FALSE && me->inBoldH == FALSE) {		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);	    }	    me->inBoldA = TRUE;	    HTML_put_string(me, alt_string);	    if (!me->inA) {		if (me->inBoldA == TRUE && me->inBoldH == FALSE) {		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		}		me->inBoldA = FALSE;		HText_endAnchor(me->text, me->CurrentANum);		me->CurrentANum = 0;	    }	} else {	    /*	     *	Just put in the ALT or pseudo-ALT string	     *	for the current anchor or inline, with an	     *	ID link if indicated. - FM	     */	    HTML_put_character(me, ' ');  /* space char may be ignored */	    me->in_word = NO;	    if (id_string) {		if ((ID_A = HTAnchor_findChildAndLink(				  me->node_anchor,	/* Parent */				  id_string,		/* Tag */				  NULL,			/* Addresss */				  (HTLinkType*)0)) != NULL) {	/* Type */		    HText_beginAnchor(me->text, me->inUnderline, ID_A);		    HText_endAnchor(me->text, 0);		}	    }	    HTML_put_string(me, alt_string);	    HTML_put_character(me, ' ');  /* space char may be ignored */	    me->in_word = NO;	}	FREE(map_href);	FREE(alt_string);	FREE(id_string);	FREE(title);	FREE(newtitle);	dest = NULL;	dest_ismap = FALSE;	break;    case HTML_MAP:	/*	 *  Load id_string if we have a NAME or ID. - FM	 */	if (present && present[HTML_MAP_NAME] &&	    value[HTML_MAP_NAME] && *value[HTML_MAP_NAME]) {	    StrAllocCopy(id_string, value[HTML_MAP_NAME]);	} else if (present && present[HTML_MAP_ID] &&		   value[HTML_MAP_ID] && *value[HTML_MAP_ID]) {	    StrAllocCopy(id_string, value[HTML_MAP_ID]);	}	if (id_string) {	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);	    if (*id_string == '\0') {		FREE(id_string);	    }	}	/*	 *  Load map_address. - FM	 */	if (id_string) {	    /*	     *	The MAP must be in the current stream, even if it	     *	had a BASE tag, so we'll use its address here, but	     *	still use the BASE, if present, when resolving the	     *	AREA elements in it's content, unless the AREA's	     *	HREF is a lone fragment and LYSeekFragAREAinCur is	     *	set. - FM && KW	     */	    StrAllocCopy(me->map_address, me->node_anchor->address);	    if ((cp = strrchr(me->map_address, '#')) != NULL)		*cp = '\0';	    StrAllocCat(me->map_address, "#");	    StrAllocCat(me->map_address, id_string);	    FREE(id_string);	    if (present && present[HTML_MAP_TITLE] &&		value[HTML_MAP_TITLE] && *value[HTML_MAP_TITLE] != '\0') {		StrAllocCopy(title, value[HTML_MAP_TITLE]);		TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);		LYTrimHead(title);		LYTrimTail(title);		if (*title == '\0') {		    FREE(title);		}	    }	    LYAddImageMap(me->map_address, title, me->node_anchor);	    FREE(title);	}	break;    case HTML_AREA:	if (me->map_address &&	    present && present[HTML_AREA_HREF] &&	    value[HTML_AREA_HREF] && *value[HTML_AREA_HREF]) {	    /*	     *	Resolve the HREF. - FM	     */	    StrAllocCopy(href, value[HTML_AREA_HREF]);	    CHECK_FOR_INTERN(href);	    url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);	    /*	     *	Check whether a BASE tag is in effect, and use it	     *	for resolving, even though we used this stream's	     *	address for locating the MAP itself, unless the	     *	HREF is a lone fragment and LYSeekFragAREAinCur	     *	is set. - FM	     */	    if (((me->inBASE && *href != '\0') &&		 !(*href == '#' && LYSeekFragAREAinCur == TRUE)) &&		(temp = HTParse(href, me->base_href, PARSE_ALL)) &&		*temp != '\0')		/*		 *  Use reference related to the base.		 */		StrAllocCopy(href, temp);	    FREE(temp);	    /*	     *	Check whether to fill in localhost. - FM	     */	    LYFillLocalFileURL(&href,			       ((((me->inBASE && *href != '\0') &&				  !(*href == '#' &&				    LYSeekFragAREAinCur == TRUE)))						?				  me->base_href : me->node_anchor->address));	    if (!(url_type = is_url(href))) {		temp = HTParse(href, me->node_anchor->address, PARSE_ALL);		if (!(temp && *temp)) {		   FREE(href);		   FREE(temp);		   break;		}		StrAllocCopy(href, temp);		FREE(temp);	    }	    /*	     *	Check for an ALT. - FM	     */	    if (present[HTML_AREA_ALT] &&		value[HTML_AREA_ALT] && *value[HTML_AREA_ALT]) {		StrAllocCopy(alt_string, value[HTML_AREA_ALT]);	    } else if (present[HTML_AREA_TITLE] &&		value[HTML_AREA_TITLE] && *value[HTML_AREA_TITLE]) {		/*		 *  Use the TITLE as an ALT. - FM		 */		StrAllocCopy(alt_string, value[HTML_AREA_TITLE]);	    }	    if (alt_string != NULL) {		TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,						me->UsePlainSpace,						me->HiddenValue);		/*		 *  Make sure it's not just space(s). - FM		 */		LYTrimHead(alt_string);		LYTrimTail(alt_string);		if (*alt_string == '\0') {		    StrAllocCopy(alt_string, href);		}	    } else {		/*		 *  Use the HREF as an ALT. - FM		 */		StrAllocCopy(alt_string, href);	    }	    LYAddMapElement(me->map_address, href, alt_string,			    me->node_anchor, intern_flag);	    FREE(href);	    FREE(alt_string);	}	break;    case HTML_PARAM:	/*	 *  We may need to look at this someday to deal with	 *  MAPs, OBJECTs or APPLETs optimally, but just ignore	 *  it for now. - FM	 */	break;    case HTML_BODYTEXT:	CHECK_ID(HTML_BODYTEXT_ID);	/*	 *  We may need to look at this someday to deal with	 *  OBJECTs optimally, but just ignore it for now. - FM	 */	break;    case HTML_TEXTFLOW:	CHECK_ID(HTML_BODYTEXT_ID);	/*	 *  We may need to look at this someday to deal with	 *  APPLETs optimally, but just ignore it for now. - FM	 */	break;    case HTML_FIG:	me->inFIG = TRUE;	if (me->inA) {	    SET_SKIP_STACK(HTML_A);	    HTML_end_element(me, HTML_A, include);	}	if (!present ||	    (present && !present[HTML_FIG_ISOBJECT])) {	    LYEnsureDoubleSpace(me);	    LYResetParagraphAlignment(me);	    me->inFIGwithP = TRUE;	} else {	    me->inFIGwithP = FALSE;	    HTML_put_character(me, ' ');  /* space char may be ignored */	}	CHECK_ID(HTML_FIG_ID);	me->in_word = NO;	me->inP = FALSE;	if (clickable_images && present && present[HTML_FIG_SRC] &&	    value[HTML_FIG_SRC] && *value[HTML_FIG_SRC] != '\0') {	    StrAllocCopy(href, value[HTML_FIG_SRC]);	    CHECK_FOR_INTERN(href);	    url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);	    if (*href) {		/*		 *  Check whether a base tag is in effect. - FM		 */		if ((me->inBASE && *href != '#') &&		    (temp = HTParse(href, me->base_href, PARSE_ALL)) &&		    *temp != '\0')		    /*		     *	Use reference related to the base.		     */		    StrAllocCopy(href, temp);		FREE(temp);		/*		 *  Check whether to fill in localhost. - FM		 */		LYFillLocalFileURL(&href,				   ((*href != '#' &&				     me->inBASE) ?				   me->base_href : me->node_anchor->address));		me->CurrentA = HTAnchor_findChildAndLink(					me->node_anchor,	/* Parent */					NULL,			/* Tag */					href,			/* Addresss */					INTERN_LT);		/* Type */		HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);		if (me->inBoldH == FALSE)		    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);		HTML_put_string(me, (present[HTML_FIG_ISOBJECT] ?		      (present[HTML_FIG_IMAGEMAP] ?					"(IMAGE)" : "(OBJECT)") : "[FIGURE]"));		if (me->inBoldH == FALSE)		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		HText_endAnchor(me->text, 0);		HTML_put_character(me, '-');		HTML_put_character(me, ' '); /* space char may be ignored */		me->in_word = NO;	    }	    FREE(href);	}	break;    case HTML_OBJECT:	if (!me->object_started) {	    /*	     *	This is an outer OBJECT start tag,	     *	i.e., not a nested OBJECT, so save	     *	it's relevant attributes. - FM	     */	    if (present) {		if (present[HTML_OBJECT_DECLARE])		    me->object_declare = TRUE;		if (present[HTML_OBJECT_SHAPES])		    me->object_shapes = TRUE;		if (present[HTML_OBJECT_ISMAP])		    me->object_ismap = TRUE;		if (present[HTML_OBJECT_USEMAP] &&		    value[HTML_OBJECT_USEMAP] && *value[HTML_OBJECT_USEMAP]) {		    StrAllocCopy(me->object_usemap, value[HTML_OBJECT_USEMAP]);		    TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_usemap);		    if (*me->object_usemap == '\0') {			FREE(me->object_usemap);		    }		}		if (present[HTML_OBJECT_ID] &&		    value[HTML_OBJECT_ID] && *value[HTML_OBJECT_ID]) {		    StrAllocCopy(me->object_id, value[HTML_OBJECT_ID]);		    TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_id);		    if (*me->object_id == '\0') {			FREE(me->object_id);		    }		}		if (present[HTML_OBJECT_TITLE] &&		    value[HTML_OBJECT_TITLE] && *value[HTML_OBJECT_TITLE]) {		    StrAllocCopy(me->object_title, value[HTML_OBJECT_TITLE]);		    TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_title, TRUE, FALSE);		    LYTrimHead(me->object_title);		    LYTrimTail(me->object_title);		    if (me->object_title == '\0') {			FREE(me->object_title);		    }		}		if (present[HTML_OBJECT_DATA] &&		    value[HTML_OBJECT_DATA] && *value[HTML_OBJECT_DATA]) {		    StrAllocCopy(me->object_data, value[HTML_OBJECT_DATA]);		    TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_data);		    if (*me->object_data == '\0') {			FREE(me->object_data);		    }		}		if (present[HTML_OBJECT_TYPE] &&		    value[HTML_OBJECT_TYPE] && *value[HTML_OBJECT_TYPE]) {		    StrAllocCopy(me->object_type, value[HTML_OBJECT_TYPE]);		    TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_type, TRUE, FALSE);		    LYTrimHead(me->object_type);		    LYTrimTail(me->object_type);		    if (me->object_type == '\0') {			FREE(me->object_type);		    }		}		if (present[HTML_OBJECT_CLASSID] &&		    value[HTML_OBJECT_CLASSID] &&		    *value[HTML_OBJECT_CLASSID]) {		    StrAllocCopy(me->object_classid,				 value[HTML_OBJECT_CLASSID]);		    TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_classid, TRUE, FALSE);		    LYTrimHead(me->object_classid);		    LYTrimTail(me->object_classid);		    if (me->object_classid == '\0') {			FREE(me->object_classid);		    }		}		if (present[HTML_OBJECT_CODEBASE] &&		    value[HTML_OBJECT_CODEBASE] &&		    *value[HTML_OBJECT_CODEBASE]) {		    StrAllocCopy(me->object_codebase,				 value[HTML_OBJECT_CODEBASE]);		    TRANSLATE_AND_UNESCAPE_TO_STD(&me->object_codebase);		    if (*me->object_codebase == '\0') {			FREE(me->object_codebase);		    }		}		if (present[HTML_OBJECT_CODETYPE] &&		    value[HTML_OBJECT_CODETYPE] &&		    *value[HTML_OBJECT_CODETYPE]) {		    StrAllocCopy(me->object_codetype,				 value[HTML_OBJECT_CODETYPE]);		    TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_codetype, TRUE, FALSE);		    LYTrimHead(me->object_codetype);		    LYTrimTail(me->object_codetype);		    if (me->object_codetype == '\0') {			FREE(me->object_codetype);		    }		}		if (present[HTML_OBJECT_NAME] &&		    value[HTML_OBJECT_NAME] && *value[HTML_OBJECT_NAME]) {		    StrAllocCopy(me->object_name, value[HTML_OBJECT_NAME]);		    TRANSLATE_AND_UNESCAPE_ENTITIES(&me->object_name, TRUE, FALSE);		    LYTrimHead(me->object_name);		    LYTrimTail(me->object_name);		    if (me->object_name == '\0') {			FREE(me->object_name);		    }		}	    }	    /*	     *	Set flag that we are accumulating OBJECT content. - FM	     */	    me->object_started = TRUE;	}	break;    case HTML_OVERLAY:	if (clickable_images && me->inFIG &&	    present && present[HTML_OVERLAY_SRC] &&	    value[HTML_OVERLAY_SRC] && *value[HTML_OVERLAY_SRC] != '\0') {	    StrAllocCopy(href, value[HTML_OVERLAY_SRC]);	    CHECK_FOR_INTERN(href);	    url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);	    if (*href) {		/*		 *  Check whether a base tag is in effect. - FM		 */		if ((me->inBASE && *href != '#') &&		    (temp = HTParse(href, me->base_href, PARSE_ALL)) &&		    *temp != '\0')		    /*		     *	Use reference related to the base.		     */		    StrAllocCopy(href, temp);		FREE(temp);		/*		 *  Check whether to fill in localhost. - FM		 */		LYFillLocalFileURL(&href,				   ((*href != '#' &&				     me->inBASE) ?				   me->base_href : me->node_anchor->address));		if (me->inA) {		    SET_SKIP_STACK(HTML_A);		    HTML_end_element(me, HTML_A, include);		}		me->CurrentA = HTAnchor_findChildAndLink(					me->node_anchor,	/* Parent */					NULL,			/* Tag */					href,			/* Addresss */					INTERN_LT);		/* Type */		HTML_put_character(me, ' ');		HText_appendCharacter(me->text, '+');		me->CurrentANum = HText_beginAnchor(me->text,						    me->inUnderline,						    me->CurrentA);		if (me->inBoldH == FALSE)		    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);		HTML_put_string(me, "[OVERLAY]");		if (me->inBoldH == FALSE)		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		HText_endAnchor(me->text, me->CurrentANum);		HTML_put_character(me, ' ');		me->in_word = NO;	    }	    FREE(href);	}	break;    case HTML_APPLET:	me->inAPPLET = TRUE;	me->inAPPLETwithP = FALSE;	HTML_put_character(me, ' ');  /* space char may be ignored */	/*	 *  Load id_string if we have an ID or NAME. - FM	 */	if (present && present[HTML_APPLET_ID] &&	    value[HTML_APPLET_ID] && *value[HTML_APPLET_ID]) {	    StrAllocCopy(id_string, value[HTML_APPLET_ID]);	} else if (present && present[HTML_APPLET_NAME] &&		   value[HTML_APPLET_NAME] && *value[HTML_APPLET_NAME]) {	    StrAllocCopy(id_string, value[HTML_APPLET_NAME]);	}	if (id_string) {	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);	    LYHandleID(me, id_string);	    FREE(id_string);	}	me->in_word = NO;	/*	 *  If there's an ALT string, use it, unless the ALT string	 *  is zero-length and we are making all sources links. - FM	 */	if (present && present[HTML_APPLET_ALT] && value[HTML_APPLET_ALT] &&	    (!clickable_images ||	     (clickable_images && *value[HTML_APPLET_ALT] != '\0'))) {	    StrAllocCopy(alt_string, value[HTML_APPLET_ALT]);	    TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,						   me->UsePlainSpace, me->HiddenValue);	    /*	     *	If it's all spaces and we are making sources links,	     *	treat it as zero-length. - FM	     */	    if (clickable_images) {		LYTrimHead(alt_string);		LYTrimTail(alt_string);		if (*alt_string == '\0') {		    StrAllocCopy(alt_string, "[APPLET]");		}	    }	} else {	    if (clickable_images)		StrAllocCopy(alt_string, "[APPLET]");	    else		StrAllocCopy(alt_string, "");	}	/*	 *  If we're making all sources links, get the source. - FM	 */	if (clickable_images && present && present[HTML_APPLET_CODE] &&	    value[HTML_APPLET_CODE] && *value[HTML_APPLET_CODE] != '\0') {	    char * base = NULL;	    char * code = NULL;	    /*	     *	Check for a CODEBASE attribute. - FM	     */	    if (present[HTML_APPLET_CODEBASE] &&		value[HTML_APPLET_CODEBASE] && *value[HTML_APPLET_CODEBASE]) {		StrAllocCopy(base, value[HTML_APPLET_CODEBASE]);		LYRemoveBlanks(base);		TRANSLATE_AND_UNESCAPE_TO_STD(&base);		/*		 *  Force it to be a directory. - FM		 */		if (*base == '\0')		    StrAllocCopy(base, "/");		LYAddHtmlSep(&base);		url_type = LYLegitimizeHREF(me, &base, TRUE, FALSE);		/*		 *  Check whether to fill in localhost. - FM		 */		LYFillLocalFileURL(&base,				   (me->inBASE ?				 me->base_href : me->node_anchor->address));		if (!(url_type = is_url(base))) {		    /*		     *	Check whether a base tag is in effect.		     */		    if (me->inBASE) {			temp = HTParse(base, me->base_href, PARSE_ALL);		    } else {			temp = HTParse(base, me->node_anchor->address,							PARSE_ALL);		    }		    StrAllocCopy(base, temp);		    FREE(temp);		}	    } else {		if (me->inBASE) {		    StrAllocCopy(base, me->base_href);		} else {		    StrAllocCopy(base, me->node_anchor->address);		}	    }	    StrAllocCopy(code, value[HTML_APPLET_CODE]);	    url_type = LYLegitimizeHREF(me, &code, TRUE, FALSE);	    href = HTParse(code, base, PARSE_ALL);	    FREE(base);	    FREE(code);	    if (href && *href) {		if (me->inA) {		    if (me->inBoldA == TRUE && me->inBoldH == FALSE)			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		    HText_endAnchor(me->text, me->CurrentANum);		    HTML_put_character(me, '-');		}		me->CurrentA = HTAnchor_findChildAndLink(					me->node_anchor,	/* Parent */					NULL,			/* Tag */					href,			/* Addresss */					(HTLinkType*)0);	/* Type */		me->CurrentANum = HText_beginAnchor(me->text,						    me->inUnderline,						    me->CurrentA);		if (me->inBoldH == FALSE)		    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);		HTML_put_string(me, alt_string);		if (me->inA == FALSE) {		    if (me->inBoldH == FALSE)			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		    HText_endAnchor(me->text, me->CurrentANum);		    me->CurrentANum = 0;		}		HTML_put_character(me, ' ');  /* space char may be ignored */		me->in_word = NO;	    }	    FREE(href);	} else if (*alt_string) {	    /*	     *	Just put up the ALT string, if non-zero. - FM	     */	    HTML_put_string(me, alt_string);	    HTML_put_character(me, ' ');  /* space char may be ignored */	    me->in_word = NO;	}	FREE(alt_string);	FREE(id_string);	break;    case HTML_BGSOUND:	/*	 *  If we're making all sources links, get the source. - FM	 */	if (clickable_images && present && present[HTML_BGSOUND_SRC] &&	    value[HTML_BGSOUND_SRC] && *value[HTML_BGSOUND_SRC] != '\0') {	    StrAllocCopy(href, value[HTML_BGSOUND_SRC]);	    CHECK_FOR_INTERN(href);	    url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);	    if (*href == '\0') {		FREE(href);		break;	    }	    /*	     *	Check whether a base tag is in effect. - FM	     */	    if ((me->inBASE && *href != '#') &&		(temp = HTParse(href, me->base_href, PARSE_ALL)) &&		*temp != '\0')		/*		 *  Use reference related to the base.		 */		StrAllocCopy(href, temp);	    FREE(temp);	    /*	     *	Check whether to fill in localhost. - FM	     */	    LYFillLocalFileURL(&href,			       ((*href != '#' &&				 me->inBASE) ?			       me->base_href : me->node_anchor->address));	    if (me->inA) {		if (me->inBoldA == TRUE && me->inBoldH == FALSE)		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		HText_endAnchor(me->text, me->CurrentANum);		HTML_put_character(me, '-');	    } else {		HTML_put_character(me, ' ');  /* space char may be ignored */		me->in_word = NO;	    }	    me->CurrentA = HTAnchor_findChildAndLink(					me->node_anchor,	/* Parent */					NULL,			/* Tag */					href,			/* Addresss */					INTERN_LT);		/* Type */	    me->CurrentANum = HText_beginAnchor(me->text,						me->inUnderline,						me->CurrentA);	    if (me->inBoldH == FALSE)		HText_appendCharacter(me->text, LY_BOLD_START_CHAR);	    HTML_put_string(me, "[BGSOUND]");	    if (me->inA == FALSE) {		if (me->inBoldH == FALSE)		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		HText_endAnchor(me->text, me->CurrentANum);		me->CurrentANum = 0;	    }	    HTML_put_character(me, ' ');  /* space char may be ignored */	    me->in_word = NO;	    FREE(href);	}	break;    case HTML_EMBED:	if (pseudo_inline_alts || clickable_images)	    HTML_put_character(me, ' ');  /* space char may be ignored */	/*	 *  Load id_string if we have an ID or NAME. - FM	 */	if (present && present[HTML_EMBED_ID] &&	    value[HTML_EMBED_ID] && *value[HTML_EMBED_ID]) {	    StrAllocCopy(id_string, value[HTML_EMBED_ID]);	} else if (present && present[HTML_EMBED_NAME] &&		   value[HTML_EMBED_NAME] && *value[HTML_EMBED_NAME]) {	    StrAllocCopy(id_string, value[HTML_EMBED_NAME]);	}	if (id_string) {	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);	    LYHandleID(me, id_string);	    FREE(id_string);	}	if (pseudo_inline_alts || clickable_images)	    me->in_word = NO;	/*	 *  If there's an ALT string, use it, unless the ALT string	 *  is zero-length and we are making all sources links. - FM	 */	if (present && present[HTML_EMBED_ALT] && value[HTML_EMBED_ALT] &&	    (!clickable_images ||	     (clickable_images && *value[HTML_EMBED_ALT] != '\0'))) {	    StrAllocCopy(alt_string, value[HTML_EMBED_ALT]);	    TRANSLATE_AND_UNESCAPE_ENTITIES(&alt_string,						   me->UsePlainSpace, me->HiddenValue);	    /*	     *	If it's all spaces and we are making sources links,	     *	treat it as zero-length. - FM	     */	    if (clickable_images) {		LYTrimHead(alt_string);		LYTrimTail(alt_string);		if (*alt_string == '\0') {		    StrAllocCopy(alt_string, "[EMBED]");		}	    }	} else {	    if (pseudo_inline_alts || clickable_images)		StrAllocCopy(alt_string, "[EMBED]");	    else		StrAllocCopy(alt_string, "");	}	/*	 *  If we're making all sources links, get the source. - FM	 */	if (clickable_images && present && present[HTML_EMBED_SRC] &&	    value[HTML_EMBED_SRC] && *value[HTML_EMBED_SRC] != '\0') {	    StrAllocCopy(href, value[HTML_EMBED_SRC]);	    CHECK_FOR_INTERN(href);	    url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);	    if (*href != '\0') {		/*		 *  Check whether a base tag is in effect. - FM		 */		if ((me->inBASE && *href != '#') &&		    (temp = HTParse(href, me->base_href, PARSE_ALL)) &&		    *temp != '\0')		    /*		     *	Use reference related to the base.		     */		    StrAllocCopy(href, temp);		FREE(temp);		/*		 *  Check whether to fill in localhost. - FM		 */		LYFillLocalFileURL(&href,				   ((*href != '#' &&				     me->inBASE) ?				   me->base_href : me->node_anchor->address));		if (me->inA) {		    if (me->inBoldA == TRUE && me->inBoldH == FALSE)			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		    HText_endAnchor(me->text, me->CurrentANum);		    HTML_put_character(me, '-');		}		me->CurrentA = HTAnchor_findChildAndLink(					me->node_anchor,	/* Parent */					NULL,			/* Tag */					href,			/* Addresss */					INTERN_LT);		/* Type */		me->CurrentANum = HText_beginAnchor(me->text,						    me->inUnderline,						    me->CurrentA);		if (me->inBoldH == FALSE)		    HText_appendCharacter(me->text, LY_BOLD_START_CHAR);		HTML_put_string(me, alt_string);		if (me->inBoldH == FALSE)		    HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		if (me->inA == FALSE) {		    if (me->inBoldH == FALSE)			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		    HText_endAnchor(me->text, me->CurrentANum);		    me->CurrentANum = 0;		}		HTML_put_character(me, ' ');		me->in_word = NO;	    }	    FREE(href);	} else if (*alt_string) {	    /*	     *	Just put up the ALT string, if non-zero. - FM	     */	    HTML_put_string(me, alt_string);	    HTML_put_character(me, ' ');  /* space char may be ignored */	    me->in_word = NO;	}	FREE(alt_string);	FREE(id_string);	break;    case HTML_CREDIT:	LYEnsureDoubleSpace(me);	LYResetParagraphAlignment(me);	me->inCREDIT = TRUE;	CHECK_ID(HTML_CREDIT_ID);	if (me->inUnderline == FALSE)	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);	HTML_put_string(me, "CREDIT:");	if (me->inUnderline == FALSE)	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);	HTML_put_character(me, ' ');	if (me->inFIG)	    /*	     *	Assume all text in the FIG container is intended	     *	to be paragraphed. - FM	     */	    me->inFIGwithP = TRUE;	if (me->inAPPLET)	    /*	     *	Assume all text in the APPLET container is intended	     *	to be paragraphed. - FM	     */	    me->inAPPLETwithP = TRUE;	me->inLABEL = TRUE;	me->in_word = NO;	me->inP = FALSE;	break;    case HTML_CAPTION:	LYEnsureDoubleSpace(me);	LYResetParagraphAlignment(me);	me->inCAPTION = TRUE;	CHECK_ID(HTML_CAPTION_ID);	if (me->inUnderline == FALSE)	    HText_appendCharacter(me->text, LY_UNDERLINE_START_CHAR);	HTML_put_string(me, "CAPTION:");	if (me->inUnderline == FALSE)	    HText_appendCharacter(me->text, LY_UNDERLINE_END_CHAR);	HTML_put_character(me, ' ');	if (me->inFIG)	    /*	     *	Assume all text in the FIG container is intended	     *	to be paragraphed. - FM	     */	    me->inFIGwithP = TRUE;	if (me->inAPPLET)	    /*	     *	Assume all text in the APPLET container is intended	     *	to be paragraphed. - FM	     */	    me->inAPPLETwithP = TRUE;	me->inLABEL = TRUE;	me->in_word = NO;	me->inP = FALSE;	break;    case HTML_FORM:	{	    char * action = NULL;	    char * method = NULL;	    char * enctype = NULL;	    CONST char * accept_cs = NULL;	    HTChildAnchor * source;	    HTAnchor *link_dest;	    /*	     *	FORM may have been declared SGML_EMPTY in HTMLDTD.c, and	     *	SGML_character() in SGML.c may check for a FORM end	     *	tag to call HTML_end_element() directly (with a	     *	check in that to bypass decrementing of the HTML	     *	parser's stack), so if we have an open FORM, close	     *	that one now. - FM	     */	    if (me->inFORM) {		CTRACE(tfp, "HTML: Missing FORM end tag.  Faking it!\n");		SET_SKIP_STACK(HTML_FORM);		HTML_end_element(me, HTML_FORM, include);	    }	    /*	     *	Set to know we are in a new form.	     */	    me->inFORM = TRUE;	    if (present && present[HTML_FORM_ACCEPT_CHARSET]) {		accept_cs = value[HTML_FORM_ACCEPT_CHARSET] ?			    value[HTML_FORM_ACCEPT_CHARSET] : "UNKNOWN";	    }	    if (present && present[HTML_FORM_ACTION] &&		value[HTML_FORM_ACTION])  {		/*		 *  Prepare to do housekeeping on the reference. - FM		 */		StrAllocCopy(action, value[HTML_FORM_ACTION]);		url_type = LYLegitimizeHREF(me, &action, TRUE, TRUE);		/*		 *  Check whether a base tag is in effect.  Note that		 *  actions always are resolved w.r.t. to the base,		 *  even if the action is empty. - FM		 */		if ((me->inBASE && me->base_href && *me->base_href) &&		    (temp = HTParse(action, me->base_href, PARSE_ALL)) &&		    *temp != '\0') {		    /*		     *	Use action related to the base.		     */		    StrAllocCopy(action, temp);		} else if ((temp = HTParse(action,					   me->node_anchor->address,					   PARSE_ALL)) &&		    *temp != '\0') {		    /*		     *	Use action related to the current document.		     */		    StrAllocCopy(action, temp);		} else {		    FREE(action);		}		FREE(temp);	    }	    if (!(action && *action)) {		if (me->inBASE && me->base_href && *me->base_href) {		     StrAllocCopy(action, me->base_href);		} else {		     StrAllocCopy(action, me->node_anchor->address);		}	    }	    if (action) {		source = HTAnchor_findChildAndLink(me->node_anchor,						   NULL,						   action,						   (HTLinkType*)0);		if ((link_dest = HTAnchor_followMainLink((HTAnchor *)source)) != NULL) {		    /*		     *	Memory leak fixed.		     *	05-28-94 Lynx 2-3-1 Garrett Arch Blythe		     */		    auto char *cp_freeme = HTAnchor_address(link_dest);		    if (cp_freeme != NULL) {			StrAllocCopy(action, cp_freeme);			FREE(cp_freeme);		    } else {			StrAllocCopy(action, "");		    }		}	    }	    if (present && present[HTML_FORM_METHOD])		StrAllocCopy(method, value[HTML_FORM_METHOD] ?				     value[HTML_FORM_METHOD] : "GET");	    if (present && present[HTML_FORM_ENCTYPE] &&		value[HTML_FORM_ENCTYPE] && *value[HTML_FORM_ENCTYPE]) {		StrAllocCopy(enctype, value[HTML_FORM_ENCTYPE]);		LYLowerCase(enctype);	    }	    if (present) {		/*		 *  Check for a TITLE attribute, and if none is present,		 *  check for a SUBJECT attribute as a synonym. - FM		 */		if (present[HTML_FORM_TITLE] &&		    value[HTML_FORM_TITLE] &&		    *value[HTML_FORM_TITLE] != '\0') {		    StrAllocCopy(title, value[HTML_FORM_TITLE]);		} else if (present[HTML_FORM_SUBJECT] &&			   value[HTML_FORM_SUBJECT] &&			   *value[HTML_FORM_SUBJECT] != '\0') {		    StrAllocCopy(title, value[HTML_FORM_SUBJECT]);		}		if (title != NULL && *title != '\0') {		    TRANSLATE_AND_UNESCAPE_ENTITIES(&title, TRUE, FALSE);		    LYTrimHead(title);		    LYTrimTail(title);		    if (*title == '\0') {			FREE(title);		    }		}	    }	    HText_beginForm(action, method, enctype, title, accept_cs);	    FREE(action);	    FREE(method);	    FREE(enctype);	    FREE(title);	}	CHECK_ID(HTML_FORM_ID);	break;    case HTML_FIELDSET:	LYEnsureDoubleSpace(me);	LYResetParagraphAlignment(me);	CHECK_ID(HTML_FIELDSET_ID);	break;    case HTML_LEGEND:	LYEnsureDoubleSpace(me);	LYResetParagraphAlignment(me);	CHECK_ID(HTML_LEGEND_ID);	break;    case HTML_LABEL:	CHECK_ID(HTML_LABEL_ID);	break;    case HTML_KEYGEN:	CHECK_ID(HTML_KEYGEN_ID);	break;    case HTML_BUTTON:	{	    InputFieldData I;	    int chars;	    /* init */	    I.align=NULL; I.accept=NULL; I.checked=NO; I.class=NULL;	    I.disabled=NO; I.error=NULL; I.height= NULL; I.id=NULL;	    I.lang=NULL; I.max=NULL; I.maxlength=NULL; I.md=NULL;	    I.min=NULL; I.name=NULL; I.size=NULL; I.src=NULL;	    I.type=NULL; I.value=NULL; I.width=NULL;	    I.accept_cs = NULL;	    I.name_cs = ATTR_CS_IN;	    I.value_cs = ATTR_CS_IN;	    UPDATE_STYLE;	    if ((present && present[HTML_BUTTON_TYPE] &&		 value[HTML_BUTTON_TYPE]) &&		(!strcasecomp(value[HTML_BUTTON_TYPE], "submit") ||		 !strcasecomp(value[HTML_BUTTON_TYPE], "reset"))) {		/*		 *  It's a button for submitting or resetting a form. - FM		 */		I.type = value[HTML_BUTTON_TYPE];	    } else {		/*		 *  Ugh, it's a button for a script. - FM		 */		HTML_put_string(me," [BUTTON] ");		break;	    }	    /*	     *	Make sure we're in a form.	     */	    if (!me->inFORM) {		if (TRACE) {		    fprintf(tfp,			    "Bad HTML: BUTTON tag not within FORM tag\n");		} else if (!me->inBadHTML) {		    HTUserMsg(BAD_HTML_USE_TRACE);		    me->inBadHTML = TRUE;		}		/*		 *  We'll process it, since the chances of a crash are		 *  small, and we probably do have a form started. - FM		 *		break;		 */	    }	    /*	     *	Before any input field, add a collapsible space if	     *	we're not in a PRE block, to promote a wrap there	     *	for any long values that would extend past the right	     *	margin from our current position in the line.  If	     *	we are in a PRE block, start a new line if the last	     *	line already is within 6 characters of the wrap point	     *	for PRE blocks. - FM	     */	    if (me->sp[0].tag_number != HTML_PRE && !me->inPRE &&		me->sp->style->freeFormat) {		HTML_put_character(me, ' ');		me->in_word = NO;	    } else if (HText_LastLineSize(me->text, FALSE) > (LYcols - 7)) {		HTML_put_character(me, '\n');		me->in_word = NO;	    }	    HTML_put_character(me, '(');	    if (!(present && present[HTML_BUTTON_NAME] &&		  value[HTML_BUTTON_NAME])) {		I.name = "";	    } else if (strchr(value[HTML_BUTTON_NAME], '&') == NULL) {		I.name = value[HTML_BUTTON_NAME];	    } else {		StrAllocCopy(I_name, value[HTML_BUTTON_NAME]);		UNESCAPE_FIELDNAME_TO_STD(&I_name);		I.name = I_name;	    }	    if (present && present[HTML_BUTTON_VALUE] &&		value[HTML_BUTTON_VALUE] && *value[HTML_BUTTON_VALUE]) {		/*		 *  Convert any HTML entities or decimal escaping. - FM		 */		int len;		StrAllocCopy(I_value, value[HTML_BUTTON_VALUE]);		me->UsePlainSpace = TRUE;		TRANSLATE_AND_UNESCAPE_ENTITIES(&I_value, TRUE, me->HiddenValue);		me->UsePlainSpace = FALSE;		I.value = I_value;		/*		 *  Convert any newlines or tabs to spaces,		 *  and trim any lead or trailing spaces. - FM		 */		convert_to_spaces(I.value, FALSE);		while (I.value && I.value[0] == ' ')		    I.value++;		len = strlen(I.value) - 1;		while (len > 0 && I.value[len] == ' ')		    I.value[len--] = '\0';	    }	    if (present && present[HTML_BUTTON_DISABLED])		I.disabled = YES;	    if (present && present[HTML_BUTTON_CLASS] && /* Not yet used. */		value[HTML_BUTTON_CLASS] && *value[HTML_BUTTON_CLASS])		I.class = value[HTML_BUTTON_CLASS];	    if (present && present[HTML_BUTTON_ID] &&		value[HTML_BUTTON_ID] && *value[HTML_BUTTON_ID]) {		I.id = value[HTML_BUTTON_ID];		CHECK_ID(HTML_BUTTON_ID);	    }	    if (present && present[HTML_BUTTON_LANG] && /* Not yet used. */		value[HTML_BUTTON_LANG] && *value[HTML_BUTTON_LANG])		I.lang = value[HTML_BUTTON_LANG];	    chars = HText_beginInput(me->text, me->inUnderline, &I);	    /*	     *	Submit and reset buttons have values which don't change,	     *	so HText_beginInput() sets I.value to the string which	     *	should be displayed, and we'll enter that instead of	     *	underscore placeholders into the HText structure to	     *	see it instead of underscores when dumping or printing.	     *	We also won't worry about a wrap in PRE blocks, because	     *	the line editor never is invoked for submit or reset	     *	buttons. - LE & FM	     */	    if (me->sp[0].tag_number == HTML_PRE ||		    !me->sp->style->freeFormat) {		/*		 *  We have a submit or reset button in a PRE block,		 *  so output the entire value from the markup.  If		 *  it extends to the right margin, it will wrap		 *  there, and only the portion before that wrap will		 *  be hightlighted on screen display (Yuk!) but we		 *  may as well show the rest of the full value on		 *  the next or more lines. - FM		 */		while (I.value[i])		    HTML_put_character(me, I.value[i++]);	    } else {		/*		 *  The submit or reset button is not in a PRE block.		 *  Note that if a wrap occurs before outputting the		 *  entire value, the wrapped portion will not be		 *  highlighted or clearly indicated as part of the		 *  link for submission or reset (Yuk!).		 *  We'll replace any spaces in the submit or reset		 *  button value with nbsp, to promote a wrap at the		 *  space we ensured would be present before the start		 *  of the string, as when we use all underscores		 *  instead of the INPUT's actual value, but we could		 *  still get a wrap at the right margin, instead, if		 *  the value is greater than a line width for the		 *  current style.  Also, if chars somehow ended up		 *  longer than the length of the actual value		 *  (shouldn't have), we'll continue padding with nbsp		 *  up to the length of chars. - FM		 */		for (i = 0; I.value[i]; i++) {		    HTML_put_character(me,				       (I.value[i] ==  ' ' ?					HT_NON_BREAK_SPACE : I.value[i]));		}		while (i < chars) {		    HTML_put_character(me, HT_NON_BREAK_SPACE);		}	    }	    HTML_put_character(me, ')');	    if (me->sp[0].tag_number != HTML_PRE &&		me->sp->style->freeFormat) {		HTML_put_character(me, ' ');		me->in_word = NO;	    }	    FREE(I_value);	    FREE(I_name);	}	break;    case HTML_INPUT:	{	    InputFieldData I;	    int chars;	    BOOL UseALTasVALUE = FALSE;	    BOOL HaveSRClink = FALSE;	    char* ImageSrc = NULL;	    BOOL IsSubmitOrReset = FALSE;	    /* init */	    I.align=NULL; I.accept=NULL; I.checked=NO; I.class=NULL;	    I.disabled=NO; I.error=NULL; I.height= NULL; I.id=NULL;	    I.lang=NULL; I.max=NULL; I.maxlength=NULL; I.md=NULL;	    I.min=NULL; I.name=NULL; I.size=NULL; I.src=NULL;	    I.type=NULL; I.value=NULL; I.width=NULL;	    I.accept_cs = NULL;	    I.name_cs = ATTR_CS_IN;	    I.value_cs = ATTR_CS_IN;	    UPDATE_STYLE;	    /*	     *	Before any input field, add a collapsible space if	     *	we're not in a PRE block, to promote a wrap there	     *	for any long values that would extend past the right	     *	margin from our current position in the line.  If	     *	we are in a PRE block, start a new line if the last	     *	line already is within 6 characters of the wrap point	     *	for PRE blocks. - FM	     */	    if (me->sp[0].tag_number != HTML_PRE && !me->inPRE &&		me->sp->style->freeFormat) {		HTML_put_character(me, ' ');		me->in_word = NO;	    } else if (HText_LastLineSize(me->text, FALSE) > (LYcols - 7)) {		HTML_put_character(me, '\n');		me->in_word = NO;	    }	    /*	     *	Get the TYPE and make sure we can handle it. - FM	     */	    if (present && present[HTML_INPUT_TYPE] &&		value[HTML_INPUT_TYPE] && *value[HTML_INPUT_TYPE]) {		I.type = value[HTML_INPUT_TYPE];		if (!strcasecomp(I.type, "range")) {		    if (present[HTML_INPUT_MIN])			I.min = value[HTML_INPUT_MIN];		    if (present[HTML_INPUT_MAX])			I.max = value[HTML_INPUT_MAX];		    /*		     *	Not yet implemented.		     */		    HTML_put_string(me,"[RANGE Input] (Not yet implemented.)");#ifdef NOTDEFINED		    if (me->inFORM)			HText_DisableCurrentForm();#endif /* NOTDEFINED */		    CTRACE(tfp, "HTML: Ignoring TYPE=\"range\"\n");		    break;		} else if (!strcasecomp(I.type, "file")) {		    if (present[HTML_INPUT_ACCEPT])			I.accept = value[HTML_INPUT_ACCEPT];		    /*		     *	Not yet implemented.		     */		    if (me->inUnderline == FALSE) {			HText_appendCharacter(me->text,					      LY_UNDERLINE_START_CHAR);		    }		    HTML_put_string(me,"[FILE Input] (Not yet implemented.)");		    if (me->inUnderline == FALSE) {			HText_appendCharacter(me->text,					      LY_UNDERLINE_END_CHAR);		    }#ifdef NOTDEFINED		    if (me->inFORM)			HText_DisableCurrentForm();#endif /* NOTDEFINED */		    CTRACE(tfp, "HTML: Ignoring TYPE=\"file\"\n");		    break;		} else if (!strcasecomp(I.type, "button")) {		    /*		     *	Ugh, a button for a script.		     */		    HTML_put_string(me,"[BUTTON] ");		    break;		}	    }	    /*	     *	Check if we're in a form. - FM	     */	    if (!me->inFORM) {		if (TRACE) {		    fprintf(tfp,			    "Bad HTML: INPUT tag not within FORM tag\n");		} else if (!me->inBadHTML) {		    HTUserMsg(BAD_HTML_USE_TRACE);		    me->inBadHTML = TRUE;		}		/*		 *  We'll process it, since the chances of a crash are		 *  small, and we probably do have a form started. - FM		 *		break;		 */	    }	    /*	     *	Check for an unclosed TEXTAREA.	     */	    if (me->inTEXTAREA) {		if (TRACE) {		    fprintf(tfp,			    "Bad HTML: Missing TEXTAREA end tag.\n");		} else if (!me->inBadHTML) {		    HTUserMsg(BAD_HTML_USE_TRACE);		    me->inBadHTML = TRUE;		}	    }	    /*	     *	Check for an unclosed SELECT, try to close it if found.	     */	    if (me->inSELECT) {		CTRACE(tfp, "HTML: Missing SELECT end tag, faking it...\n");		if (me->sp->tag_number != HTML_SELECT) {		    SET_SKIP_STACK(HTML_SELECT);		}		HTML_end_element(me, HTML_SELECT, include);	    }	    /*	     *	Handle the INPUT as for a FORM. - FM	     */	    if (!(present && present[HTML_INPUT_NAME] &&		  value[HTML_INPUT_NAME])) {		I.name = "";	    } else if (strchr(value[HTML_INPUT_NAME], '&') == NULL) {		I.name = value[HTML_INPUT_NAME];	    } else {		StrAllocCopy(I_name, value[HTML_INPUT_NAME]);		UNESCAPE_FIELDNAME_TO_STD(&I_name);		I.name = I_name;	    }	    if ((present && present[HTML_INPUT_ALT] &&		 value[HTML_INPUT_ALT] && *value[HTML_INPUT_ALT] &&		 I.type && !strcasecomp(I.type, "image")) &&		!(present && present[HTML_INPUT_VALUE] &&		  value[HTML_INPUT_VALUE] && *value[HTML_INPUT_VALUE])) {		/*		 *  This is a TYPE="image" using an ALT rather than		 *  VALUE attribute to indicate the link string for		 *  text clients or GUIs with image loading off, so		 *  set the flag to use that as if it were a VALUE		 *  attribute. - FM		 */		UseALTasVALUE = TRUE;	    }	    if (verbose_img && !clickable_images &&		present && present[HTML_INPUT_SRC] &&		value[HTML_INPUT_SRC] && *value[HTML_INPUT_SRC] &&		I.type && !strcasecomp(I.type, "image")) {		ImageSrc = MakeNewImageValue(value);	    } else if (clickable_images == TRUE &&		present && present[HTML_INPUT_SRC] &&		value[HTML_INPUT_SRC] && *value[HTML_INPUT_SRC] &&		I.type && !strcasecomp(I.type, "image")) {		StrAllocCopy(href, value[HTML_INPUT_SRC]);		/*		 *  We have a TYPE="image" with a non-zero-length SRC		 *  attribute and want clickable images.  Make the		 *  SRC's value a link if it's still not zero-length		 *  legitimizing it. - FM		 */		url_type = LYLegitimizeHREF(me, &href, TRUE, TRUE);		if (*href) {		    /*		     *	Check whether a base tag is in effect. - FM		     */		    if ((me->inBASE && *href != '#') &&			(temp = HTParse(href, me->base_href, PARSE_ALL)) &&			*temp != '\0')			/*			 *  Use reference related to the base.			 */			StrAllocCopy(href, temp);		    FREE(temp);		    /*		     *	Check whether to fill in localhost. - FM		     */		    LYFillLocalFileURL(&href,				       ((*href != '#' &&					 me->inBASE) ?				       me->base_href :				       me->node_anchor->address));		    if (me->inA) {			SET_SKIP_STACK(HTML_A);			HTML_end_element(me, HTML_A, include);		    }		    me->CurrentA = HTAnchor_findChildAndLink(					me->node_anchor,	/* Parent */					NULL,			/* Tag */					href,			/* Addresss */					(HTLinkType*)0);	/* Type */		    HText_beginAnchor(me->text, me->inUnderline, me->CurrentA);		    if (me->inBoldH == FALSE)			HText_appendCharacter(me->text, LY_BOLD_START_CHAR);		    HTML_put_string(me, VERBOSE_IMG(value,HTML_INPUT_SRC,"[IMAGE]"));		    FREE(newtitle);		    if (me->inBoldH == FALSE)			HText_appendCharacter(me->text, LY_BOLD_END_CHAR);		    HText_endAnchor(me->text, 0);		    HTML_put_character(me, '-');		    HaveSRClink = TRUE;		}		FREE(href);	    }	    if ((UseALTasVALUE == TRUE) ||		(present && present[HTML_INPUT_VALUE] &&		 value[HTML_INPUT_VALUE] && *value[HTML_INPUT_VALUE])) {		/*		 *  Convert any HTML entities or decimal escaping. - FM		 */		int CurrentCharSet = current_char_set;		BOOL CurrentEightBitRaw = HTPassEightBitRaw;		BOOLEAN CurrentUseDefaultRawMode = LYUseDefaultRawMode;		HTCJKlang CurrentHTCJK = HTCJK;		int len;		if (I.type && !strcasecomp(I.type, "hidden")) {		    me->HiddenValue = TRUE;		    current_char_set = LATIN1;	/* Default ISO-Latin1 */		    LYUseDefaultRawMode = TRUE;		    HTMLSetCharacterHandling(current_char_set);		}		if (!I.type)		    me->UsePlainSpace = TRUE;		else if (!strcasecomp(I.type, "text") ||			 !strcasecomp(I.type, "submit") ||			 !strcasecomp(I.type, "image") ||			 !strcasecomp(I.type, "reset"))		    me->UsePlainSpace = TRUE;		StrAllocCopy(I_value,			     ((UseALTasVALUE == TRUE) ?				value[HTML_INPUT_ALT] :				value[HTML_INPUT_VALUE]));		if (me->UsePlainSpace && !me->HiddenValue) {		    I.value_cs = current_char_set;		}		TRANSLATE_AND_UNESCAPE_ENTITIES6(		    &I_value,		    ATTR_CS_IN,		    I.value_cs,		    (me->UsePlainSpace && !me->HiddenValue),		    me->UsePlainSpace, me->HiddenValue);		I.value = I_value;		if (me->UsePlainSpace == TRUE) {		    /*		     *	Convert any newlines or tabs to spaces,		     *	and trim any lead or trailing spaces. - FM		     */		    convert_to_spaces(I.value, FALSE);		    while (I.value && I.value[0] == ' ')			I.value++;		    len = strlen(I.value) - 1;		    while (len > 0 && I.value[len] == ' ')			I.value[len--] = '\0';		}		me->UsePlainSpace = FALSE;		if (I.type && !strcasecomp(I.type, "hidden")) {		    me->HiddenValue = FALSE;		    current_char_set = CurrentCharSet;		    LYUseDefaultRawMode = CurrentUseDefaultRawMode;		    HTMLSetCharacterHandling(current_char_set);		    HTPassEightBitRaw = CurrentEightBitRaw;		    HTCJK = CurrentHTCJK;		}	    } else if (HaveSRClink == TRUE) {		/*		 *  We put up an [IMAGE] link and '-' for a TYPE="image"		 *  and didn't get a VALUE or ALT string, so fake a		 *  "Submit" value.  If we didn't put up a link, then		 *  HText_beginInput() will use "[IMAGE]-Submit". - FM		 */		StrAllocCopy(I_value, "Submit");		I.value = I_value;	    } else if ( ImageSrc ) {		/* [IMAGE]-Submit with verbose images and not clickable images.		 * Use ImageSrc if no other alt or value is supplied. --LE		 */		I.value = ImageSrc;	    }	    if (present && present[HTML_INPUT_CHECKED])		I.checked = YES;	    if (present && present[HTML_INPUT_SIZE] &&		value[HTML_INPUT_SIZE] && *value[HTML_INPUT_SIZE])		I.size = value[HTML_INPUT_SIZE];	    if (present && present[HTML_INPUT_MAXLENGTH] &&		value[HTML_INPUT_MAXLENGTH] && *value[HTML_INPUT_MAXLENGTH])		I.maxlength = value[HTML_INPUT_MAXLENGTH];	    if (present && present[HTML_INPUT_DISABLED])		I.disabled = YES;	    if (present && present[HTML_INPUT_ACCEPT_CHARSET]) { /* Not yet used. */		I.accept_cs = value[HTML_INPUT_ACCEPT_CHARSET] ?			      value[HTML_INPUT_ACCEPT_CHARSET] : "UNKNOWN";	    }	    if (present && present[HTML_INPUT_ALIGN] && /* Not yet used. */		value[HTML_INPUT_ALIGN] && *value[HTML_INPUT_ALIGN])		I.align = value[HTML_INPUT_ALIGN];	    if (present && present[HTML_INPUT_CLASS] && /* Not yet used. */		value[HTML_INPUT_CLASS] && *value[HTML_INPUT_CLASS])		I.class = value[HTML_INPUT_CLASS];	    if (present && present[HTML_INPUT_ERROR] && /* Not yet used. */		value[HTML_INPUT_ERROR] && *value[HTML_INPUT_ERROR])		I.error = value[HTML_INPUT_ERROR];	    if (present && present[HTML_INPUT_HEIGHT] && /* Not yet used. */		value[HTML_INPUT_HEIGHT] && *value[HTML_INPUT_HEIGHT])		I.height = value[HTML_INPUT_HEIGHT];	    if (present && present[HTML_INPUT_WIDTH] && /* Not yet used. */		value[HTML_INPUT_WIDTH] && *value[HTML_INPUT_WIDTH])		I.width = value[HTML_INPUT_WIDTH];	    if (present && present[HTML_INPUT_ID] &&		value[HTML_INPUT_ID] && *value[HTML_INPUT_ID]) {		I.id = value[HTML_INPUT_ID];		CHECK_ID(HTML_INPUT_ID);	    }	    if (present && present[HTML_INPUT_LANG] && /* Not yet used. */		value[HTML_INPUT_LANG] && *value[HTML_INPUT_LANG])		I.lang = value[HTML_INPUT_LANG];	    if (present && present[HTML_INPUT_MD] && /* Not yet used. */		value[HTML_INPUT_MD] && *value[HTML_INPUT_MD])		I.md = value[HTML_INPUT_MD];	    chars = HText_beginInput(me->text, me->inUnderline, &I);	    /*	     *	Submit and reset buttons have values which don't change,	     *	so HText_beginInput() sets I.value to the string which	     *	should be displayed, and we'll enter that instead of	     *	underscore placeholders into the HText structure to	     *	see it instead of underscores when dumping or printing.	     *	We also won't worry about a wrap in PRE blocks, because	     *	the line editor never is invoked for submit or reset	     *	buttons. - LE & FM	     */	    if (I.type &&		(!strcasecomp(I.type,"submit") ||		 !strcasecomp(I.type,"reset") ||		 !strcasecomp(I.type,"image")))		IsSubmitOrReset = TRUE;	    if (I.type && chars == 3 &&		!strcasecomp(I.type, "radio")) {		/*		 *  Put a (_) placeholder, and one space		 *  (collapsible) before the label that is		 *  expected to follow. - FM		 */		HTML_put_string(me, "(_)");		chars = 0;		me->in_word = YES;		if (me->sp[0].tag_number != HTML_PRE &&		    me->sp->style->freeFormat) {		    HTML_put_character(me, ' ');		    me->in_word = NO;		}	    } else if (I.type && chars == 3 &&		!strcasecomp(I.type, "checkbox")) {		/*		 *  Put a [_] placeholder, and one space		 *  (collapsible) before the label that is		 *  expected to follow. - FM		 */		HTML_put_string(me, "[_]");		chars = 0;		me->in_word = YES;		if (me->sp[0].tag_number != HTML_PRE &&		    me->sp->style->freeFormat) {		    HTML_put_character(me, ' ');		    me->in_word = NO;		}	    } else if ((me->sp[0].tag_number == HTML_PRE ||			!me->sp->style->freeFormat)		       && chars > 6 &&		       IsSubmitOrReset == FALSE) {		/*		 *  This is not a submit or reset button, and we are		 *  in a PRE block with a field intended to exceed 6		 *  character widths.  The code inadequately handles		 *  INPUT fields in PRE tags if wraps occur (at the		 *  right margin) for the underscore placeholders.		 *  We'll put up a minimum of 6 underscores, since we		 *  should have wrapped artificially, above, if the		 *  INPUT begins within 6 columns of the right margin,		 *  and if any more would exceed the wrap column, we'll		 *  ignore them.  Note that if we somehow get tripped		 *  up and a wrap still does occur before all 6 of the		 *  underscores are output, the wrapped ones won't be		 *   treated as part of the editing window, nor be		 *  highlighted when not editing (Yuk!). - FM		 */		for (i = 0; i < 6; i++) {		    HTML_put_character(me, '_');		    chars--;		}		HText_setIgnoreExcess(me->text, TRUE);	    }	    if (IsSubmitOrReset == FALSE) {		/*		 *  This is not a submit or reset button,		 *  so output the rest of the underscore		 *  placeholders, if any more are needed. - FM		 */		for (; chars > 0; chars--)		    HTML_put_character(me, '_');	    } else {		if (me->sp[0].tag_number == HTML_PRE ||		    !me->sp->style->freeFormat) {		    /*		     *	We have a submit or reset button in a PRE block,		     *	so output the entire value from the markup.  If		     *	it extends to the right margin, it will wrap		     *	there, and only the portion before that wrap will		     *	be hightlighted on screen display (Yuk!) but we		     *	may as well show the rest of the full value on		     *	the next or more lines. - FM		     */		    while (I.value[i])			HTML_put_character(me, I.value[i++]);		} else {		    /*		     *	The submit or reset button is not in a PRE block.		     *	Note that if a wrap occurs before outputting the		     *	entire value, the wrapped portion will not be		     *	highlighted or clearly indicated as part of the		     *	link for submission or reset (Yuk!).		     *	We'll replace any spaces in the submit or reset		     *	button value with nbsp, to promote a wrap at the		     *	space we ensured would be present before the start		     *	of the string, as when we use all underscores		     *	instead of the INPUT's actual value, but we could		     *	still get a wrap at the right margin, instead, if		     *	the value is greater than a line width for the		     *	current style.	Also, if chars somehow ended up		     *	longer than the length of the actual value		     *	(shouldn't have), we'll continue padding with nbsp		     *	up to the length of chars. - FM		     */		    for (i = 0; I.value[i]; i++)			HTML_put_character(me,					   (I.value[i] ==  ' ' ?					    HT_NON_BREAK_SPACE : I.value[i]));		    while (i < chars)			HTML_put_character(me, HT_NON_BREAK_SPACE);		}	    }	    HText_setIgnoreExcess(me->text, FALSE);	    FREE(ImageSrc);	    FREE(I_value);	    FREE(I_name);	}	break;    case HTML_TEXTAREA:	/*	 *  Make sure we're in a form.	 */	if (!me->inFORM) {	    if (TRACE) {		fprintf(tfp,			"Bad HTML: TEXTAREA start tag not within FORM tag\n");	    } else if (!me->inBadHTML) {		HTUserMsg(BAD_HTML_USE_TRACE);		me->inBadHTML = TRUE;	    }	    /*	     *	Too likely to cause a crash, so we'll ignore it. - FM	     */	    break;	}	/*	 *  Set to know we are in a textarea.	 */	me->inTEXTAREA = TRUE;	/*	 *  Get ready for the value.	 */	HTChunkClear(&me->textarea);	if (present && present[HTML_TEXTAREA_NAME] &&	    value[HTML_TEXTAREA_NAME]) {	    StrAllocCopy(me->textarea_name, value[HTML_TEXTAREA_NAME]);	    me->textarea_name_cs = ATTR_CS_IN;	    if (strchr(value[HTML_TEXTAREA_NAME], '&') != NULL) {		UNESCAPE_FIELDNAME_TO_STD(&me->textarea_name);	    }	} else {	    StrAllocCopy(me->textarea_name, "");	}	if (present && present[HTML_TEXTAREA_ACCEPT_CHARSET]) {	    if (value[HTML_TEXTAREA_ACCEPT_CHARSET]) {		StrAllocCopy(me->textarea_accept_cs, value[HTML_TEXTAREA_ACCEPT_CHARSET]);		TRANSLATE_AND_UNESCAPE_TO_STD(&me->textarea_accept_cs);	    } else {		StrAllocCopy(me->textarea_accept_cs, "UNKNOWN");	    }	} else {	    FREE(me->textarea_accept_cs);	}	if (present && present[HTML_TEXTAREA_COLS] &&	    value[HTML_TEXTAREA_COLS] &&	    isdigit((unsigned char)*value[HTML_TEXTAREA_COLS]))	    StrAllocCopy(me->textarea_cols, value[HTML_TEXTAREA_COLS]);	else	    StrAllocCopy(me->textarea_cols, "60");	if (present && present[HTML_TEXTAREA_ROWS] &&	    value[HTML_TEXTAREA_ROWS] &&	    isdigit((unsigned char)*value[HTML_TEXTAREA_ROWS]))	    me->textarea_rows = atoi(value[HTML_TEXTAREA_ROWS]);	else	    me->textarea_rows = 4;	if (present && present[HTML_TEXTAREA_DISABLED])	    me->textarea_disabled = YES;	else	    me->textarea_disabled = NO;	if (present && present[HTML_TEXTAREA_ID]	    && value[HTML_TEXTAREA_ID] && *value[HTML_TEXTAREA_ID]) {	    StrAllocCopy(id_string, value[HTML_TEXTAREA_ID]);	    TRANSLATE_AND_UNESCAPE_TO_STD(&id_string);	    if ((id_string != '\0') &&		(ID_A = HTAnchor_findChildAndLink(				me->node_anchor,	/* Parent */				id_string,		/* Tag */				NULL,			/* Addresss */				(HTLinkType*)0))) {	/* Type */		HText_beginAnchor(me->text, me->inUnderline, ID_A);		HText_endAnchor(me->text, 0);		StrAllocCopy(me->textarea_id, id_string);	    } else {		FREE(me->textarea_id);	    }	    FREE(id_string);	} else {	    FREE(me->textarea_id);	}	break;    case HTML_SELECT:	/*	 *  Check for an already open SELECT block. - FM	 */	if (me->inSELECT) {	    if (TRACE) {		fprintf(tfp,		   "Bad HTML: SELECT start tag in SELECT element.  Faking SELECT end tag. *****\n");	    } else if (!me->inBadHTML) {		HTUserMsg(BAD_HTML_USE_TRACE);		me->inBadHTML = TRUE;	    }	    if (me->sp->tag_number != HTML_SELECT) {		SET_SKIP_STACK(HTML_SELECT);	    }	    HTML_end_element(me, HTML_SELECT, include);	}	/*	 * Start a new SELECT block. - FM	 */	LYHandleSELECT(me,		       present, (CONST char **)value,		       include,		       TRUE);	break;    case HTML_OPTION:	{	    /*	     *	An option is a special case of an input field.	     */	    InputFieldData I;	    /*	     *	Make sure we're in a select tag.	     */	    if (!me->inSELECT) {		if (TRACE) {		    fprintf(tfp,			    "Bad HTML: OPTION tag not within SELECT tag\n");		} else if (!me->inBadHTML) {		    HTUserMsg(BAD_HTML_USE_TRACE);		    me->inBadHTML = TRUE;		}		/*		 *  Too likely to cause a crash, so we'll ignore it. - FM		 */		break;	    }	    if (!me->first_option) {		/*		 *  Finish the data off.		 */		HTChunkTerminate(&me->option);		/*		 *  Finish the previous option @@@@@		 */		HText_setLastOptionValue(me->text,					 me->option.data,					 me->LastOptionValue,					 MIDDLE_ORDER,					 me->LastOptionChecked,					 me->UCLYhndl,					 ATTR_CS_IN);	    }	    /*	     *	If its not a multiple option list and select popups	     *	are enabled, then don't use the checkbox/button method,	     *	and don't put anything on the screen yet.	     */	    if (me->first_option ||		HTCurSelectGroupType == F_CHECKBOX_TYPE ||		LYSelectPopups == FALSE) {		if (HTCurSelectGroupType == F_CHECKBOX_TYPE ||		    LYSelectPopups == FALSE) {		    /*		     *	Start a newline before each option.		     */		    LYEnsureSingleSpace(me);		} else {		    /*		     *	Add option list designation character.		     */		    HText_appendCharacter(me->text, '[');		    me->in_word = YES;		}		/*		 *  Inititialize.		 */		I.align=NULL; I.accept=NULL; I.checked=NO; I.class=NULL;		I.disabled=NO; I.error=NULL; I.height= NULL; I.id=NULL;		I.lang=NULL; I.max=NULL; I.maxlength=NULL; I.md=NULL;		I.min=NULL; I.name=NULL; I.size=NULL; I.src=NULL;		I.type=NULL; I.value=NULL; I.width=NULL;		I.accept_cs = NULL;		I.name_cs = -1;		I.value_cs = current_char_set;		I.type = "OPTION";		if ((present && present[HTML_OPTION_SELECTED]) ||		    (me->first_option && LYSelectPopups == FALSE &&		     HTCurSelectGroupType == F_RADIO_TYPE))		    I.checked=YES;		if (present && present[HTML_OPTION_VALUE] &&		    value[HTML_OPTION_VALUE]) {		    /*		     *	Convert any HTML entities or decimal escaping. - FM		     */		    StrAllocCopy(I_value, value[HTML_OPTION_VALUE]);		    me->HiddenValue = TRUE;		    TRANSLATE_AND_UNESCAPE_ENTITIES6(&I_value,						       ATTR_CS_IN,						       ATTR_CS_IN,							NO,						       me->UsePlainSpace, me->HiddenValue);		    I.value_cs = ATTR_CS_IN;		    me->HiddenValue = FALSE;		    I.value = I_value;		}		if (me->select_disabled ||		   (present && present[HTML_OPTION_DISABLED]))		    I.disabled=YES;		if (present && present[HTML_OPTION_ID]		    && value[HTML_OPTION_ID] && *value[HTML_OPTION_ID]) {		    if ((ID_A = HTAnchor_findChildAndLink(				    me->node_anchor,	   /* Parent */				    value[HTML_OPTION_ID], /* Tag */				    NULL,		   /* Addresss */				    (HTLinkType*)0)) != NULL) {    /* Type */			HText_beginAnchor(me->text, me->inUnderline, ID_A);			HText_endAnchor(me->text, 0);			I.id = value[HTML_OPTION_ID];		    }		}		HText_beginInput(me->text, me->inUnderline, &I);		if (HTCurSelectGroupType == F_CHECKBOX_TYPE) {		    /*		     *	Put a "[_]" placeholder, and one space		     *	(collapsible) before the label that is		     *	expected to follow. - FM		     */		    HText_appendCharacter(me->text, '[');		    HText_appendCharacter(me->text, '_');		    HText_appendCharacter(me->text, ']');		    HText_appendCharacter(me->text, ' ');		    HText_setLastChar(me->text, ' ');  /* absorb white space */		    me->in_word = NO;		} else if (LYSelectPopups == FALSE) {		    /*		     *	Put a "(_)" placeholder, and one space		     *	(collapsible) before the label that is		     *	expected to follow. - FM		     */		    HText_appendCharacter(me->text, '(');		    HText_appendCharacter(me->text, '_');		    HText_appendCharacter(me->text, ')');		    HText_appendCharacter(me->text, ' ');		    HText_setLastChar(me->text, ' ');  /* absorb white space */		    me->in_word = NO;		}	    }	    /*	     *	Get ready for the next value.	     */	    HTChunkClear(&me->option);	    if ((present && present[HTML_OPTION_SELECTED]) ||		(me->first_option && LYSelectPopups == FALSE &&		 HTCurSelectGroupType == F_RADIO_TYPE))		me->LastOptionChecked = TRUE;	    else		me->LastOptionChecked = FALSE;	    me->first_option = FALSE;	    if (present && present[HTML_OPTION_VALUE] &&		value[HTML_OPTION_VALUE]) {		if (!I_value) {		    /*		     *	Convert any HTML entities or decimal escaping. - FM		     */		    StrAllocCopy(I_value, value[HTML_OPTION_VALUE]);		    me->HiddenValue = TRUE;		    TRANSLATE_AND_UNESCAPE_ENTITIES6(&I_value,						       ATTR_CS_IN,						       ATTR_CS_IN,							NO,						       me->UsePlainSpace, me->HiddenValue);		    me->HiddenValue = FALSE;		}		StrAllocCopy(me->LastOptionValue, I_value);	    } else {		StrAllocCopy(me->LastOptionValue, me->option.data);	    }	    /*	     *	If this is a popup option, print its option	     *	for use in selecting option by number. - LE	     */	    if (HTCurSelectGroupType == F_RADIO_TYPE &&		LYSelectPopups &&		keypad_mode == LINKS_AND_FORM_FIELDS_ARE_NUMBERED) {		char marker[8];		int opnum = HText_getOptionNum(me->text);		if (opnum > 0 && opnum < 100000) {		    sprintf(marker,"(%d)", opnum);		    HTML_put_string(me, marker);		    for (i = strlen(marker); i < 5; ++i) {			HTML_put_character(me, '_');		    }		}	    }	    FREE(I_value);	}	break;    case HTML_TABLE:	/*	 *  Not implemented.  Just treat as a division	 *  with respect to any ALIGN attribute, with	 *  a default of HT_LEFT, or leave as a PRE	 *  block if we are presently in one. - FM	 */	if (me->inA) {	    SET_SKIP_STACK(HTML_A);	    HTML_end_element(me, HTML_A, include);	}	if (me->Underline_Level > 0) {	    SET_SKIP_STACK(HTML_U);	    HTML_end_element(me, HTML_U, include);	}	me->inTABLE = TRUE;	if (!strcmp(me->sp->style->name, "Preformatted")) {	    UPDATE_STYLE;	    CHECK_ID(HTML_TABLE_ID);	    break;	}	if (me->Division_Level < (MAX_NESTING - 1)) {	    me->Division_Level++;	} else {	    CTRACE(tfp,	    "HTML: ****** Maximum nesting of %d divisions/tables exceeded!\n",		    MAX_NESTING);	}	if (present && present[HTML_TABLE_ALIGN] &&	    value[HTML_TABLE_ALIGN] && *value[HTML_TABLE_ALIGN]) {	    if (!strcasecomp(value[HTML_TABLE_ALIGN], "center")) {		me->DivisionAlignments[me->Division_Level] = HT_CENTER;		change_paragraph_style(me, styles[HTML_DCENTER]);		UPDATE_STYLE;		me->current_default_alignment = styles[HTML_DCENTER]->alignment;	    } else if (!strcasecomp(value[HTML_TABLE_ALIGN], "right")) {		me->DivisionAlignments[me->Division_Level] = HT_RIGHT;		change_paragraph_style(me, styles[HTML_DRIGHT]);		UPDATE_STYLE;		me->current_default_alignment = styles[HTML_DRIGHT]->alignment;	    } else {		me->DivisionAlignments[me->Division_Level] = HT_LEFT;		change_paragraph_style(me, styles[HTML_DLEFT]);		UPDATE_STYLE;		me->current_default_alignment = styles[HTML_DLEFT]->alignment;	    }	} else {	    me->DivisionAlignments[me->Division_Level] = HT_LEFT;	    change_paragraph_style(me, styles[HTML_DLEFT]);	    UPDATE_STYLE;	    me->current_default_alignment = styles[HTML_DLEFT]->alignment;	}	CHECK_ID(HTML_TABLE_ID);	break;    case HTML_TR:	/*	 *  Not yet implemented.  Just start a new row,	 *  if needed, act on an ALIGN attribute if present,	 *  and check for an ID link. - FM	 */	if (me->inA) {	    SET_SKIP_STACK(HTML_A);	    HTML_end_element(me, HTML_A, include);	}	if (me->Underline_Level > 0) {	    SET_SKIP_STACK(HTML_U);	    HTML_end_element(me, HTML_U, include);	}	UPDATE_STYLE;	if (HText_LastLineSize(me->text, FALSE)) {	    HText_setLastChar(me->text, ' ');  /* absorb white space */	    HText_appendCharacter(me->text, '\r');	}	me->in_word = NO;	if (!strcmp(me->sp->style->name, "Preformatted")) {	    CHECK_ID(HTML_TR_ID);	    me->inP = FALSE;	    break;	}	if (LYoverride_default_alignment(me)) {	    me->sp->style->alignment = styles[me->sp[0].tag_number]->alignment;	} else if (me->List_Nesting_Level >= 0 ||		   ((me->Division_Level < 0) &&		    (!strcmp(me->sp->style->name, "Normal") ||		     !strcmp(me->sp->style->name, "Preformatted")))) {		me->sp->style->alignment = HT_LEFT;	} else {	    me->sp->style->alignment = me->current_default_alignment;	}	if (present && present[HTML_TR_ALIGN] && value[HTML_TR_ALIGN]) {	    if (!strcasecomp(value[HTML_TR_ALIGN], "center") &&		!(me->List_Nesting_Level >= 0 && !me->inP))		me->sp->style->alignment = HT_CENTER;	    else if (!strcasecomp(value[HTML_TR_ALIGN], "right") &&		!(me->List_Nesting_Level >= 0 && !me->inP))		me->sp->style->alignment = HT_RIGHT;	    else if (!strcasecomp(value[HTML_TR_ALIGN], "left") ||		     !strcasecomp(value[HTML_TR_ALIGN], "justify"))		me->sp->style->alignment = HT_LEFT;	}	CHECK_ID(HTML_TR_ID);	me->inP = FALSE;	break;    case HTML_THEAD:    case HTML_TFOOT:    case HTML_TBODY:	/*	 *  Not yet implemented.  Just check for an ID link. - FM	 */	if (me->inA) {	    SET_SKIP_STACK(HTML_A);	    HTML_end_element(me, HTML_A, include);	}	if (me->Underline_Level > 0) {	    SET_SKIP_STACK(HTML_U);	    HTML_end_element(me, HTML_U, include);	}	UPDATE_STYLE;	CHECK_ID(HTML_TR_ID);	break;    case HTML_COL:    case HTML_COLGROUP:	/*	 *  Not yet implemented.  Just check for an ID link. - FM	 */	if (me->inA) {	    SET_SKIP_STACK(HTML_A);	    HTML_end_element(me, HTML_A, include);	}	if (me->Underline_Level > 0) {	    SET_SKIP_STACK(HTML_U);	    HTML_end_element(me, HTML_U, include);	}	UPDATE_STYLE;	CHECK_ID(HTML_COL_ID);	break;    case HTML_TH:	if (me->inA) {	    SET_SKIP_STACK(HTML_A);	    HTML_end_element(me, HTML_A, include);	}	if (me->Underline_Level > 0) {	    SET_SKIP_STACK(HTML_U);	    HTML_end_element(me, HTML_U, include);	}	UPDATE_STYLE;	CHECK_ID(HTML_TD_ID);	/*	 *  Not yet implemented.  Just add a collapsible space and break. - FM	 */	HTML_put_character(me, ' ');	me->in_word = NO;	break;    case HTML_TD:	if (me->inA) {	    SET_SKIP_STACK(HTML_A);	    HTML_end_element(me, HTML_A, include);	}	if (me->Underline_Level > 0) {	    SET_SKIP_STACK(HTML_U);	    HTML_end_element(me, HTML_U, include);	}	UPDATE_STYLE;	CHECK_ID(HTML_TD_ID);	/*	 *  Not yet implemented.  Just add a collapsible space and break. - FM	 */	HTML_put_character(me, ' ');	me->in_word = NO;	break;    case HTML_MATH:	/*	 *  We're getting it as Literal text, which, until we can process	 *  it, we'll display as is, within brackets to alert the user. - FM	 */	HTChunkClear(&me->math);	CHECK_ID(HTML_GEN_ID);	break;    default:	break;    } /* end switch */    if (HTML_dtd.tags[ElementNumber].contents != SGML_EMPTY) {	if (me->skip_stack > 0) {	    CTRACE(tfp, "HTML:begin_element: internal call (level %d), leaving on stack - %s\n",			me->skip_stack, me->sp->style->name);	    me->skip_stack--;	    return;	}	if (me->sp == me->stack) {	    if (me->stack_overrun == FALSE) {		if (TRACE) {		    fprintf(tfp,			"HTML: ****** Maximum nesting of %d tags exceeded!\n",			MAX_NESTING);		} else {		    HTAlert(HTML_STACK_OVERRUN);		}		me->stack_overrun = TRUE;	    }	    return;	}	CTRACE(tfp,"HTML:begin_element[%d]: adding style to stack - %s\n",							(int) STACKLEVEL(me),							me->new_style->name);	(me->sp)--;	me->sp[0].style = me->new_style;	/* Stack new style */	me->sp[0].tag_number = ElementNumber;    }#if defined(USE_COLOR_STYLE)/* end really empty tags straight away */#define REALLY_EMPTY(e) ((HTML_dtd.tags[e].contents == SGML_EMPTY) && \			 !(HTML_dtd.tags[e].flags & Tgf_nreie))    if (REALLY_EMPTY(element_number))    {	CTRACE(tfp, "STYLE:begin_element:ending EMPTY element style\n");#if !defined(USE_HASH)	HText_characterStyle(me->text, element_number+STARTAT, STACK_OFF);#else	HText_characterStyle(me->text, HCODE_TO_STACK_OFF(hcode), STACK_OFF);#endif /* USE_HASH */#if !OPT_SCN	TrimColorClass(HTML_dtd.tags[element_number].name,		       Style_className, &hcode);#else#  if !OMIT_SCN_KEEPING	FastTrimColorClass(HTML_dtd.tags[element_number].name,			   HTML_dtd.tags[element_number].name_len,			   Style_className,			   &Style_className_end, &hcode);#  endif#endif    }#endif /* USE_COLOR_STYLE */}