strcat (myHash, "."); strcat (myHash, class_string);
PRIVATE void HTMLGen_start_element ARGS6(	HTStructured *, 	me,	int,			element_number,	CONST BOOL*,		present,	CONST char **,		value,	int,			charset GCC_UNUSED,	char **,		insert GCC_UNUSED){    int i;    BOOL was_preformatted = me->preformatted;    HTTag * tag = &HTML_dtd.tags[element_number];#if defined(USE_COLOR_STYLE)    char *title = NULL;    char *title_tmp = NULL;    if (LYPreparsedSource) {	/*	 *  Same logic as in HTML_start_element, copied from there. - kw	 */	HTSprintf (&Style_className, ";%s", HTML_dtd.tags[element_number].name);	strcpy (myHash, HTML_dtd.tags[element_number].name);	if (class_string[0])	{	    HTSprintf (&Style_className, ".%s", class_string);	    strcat (myHash, ".");	    strcat (myHash, class_string);	}	class_string[0] = '\0';	strtolower(myHash);	hcode = hash_code(myHash);	strtolower(Style_className);	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);	}	if (displayStyles[element_number + STARTAT].color > -2) /* actually set */	{	    CTRACE(tfp, "CSSTRIM: start_element: top <%s>\n",		   HTML_dtd.tags[element_number].name);	    do_cstyle_flush(me);	    HText_characterStyle(me->text, hcode, 1);	}    }#endif /* USE_COLOR_STYLE */    me->preformatted = YES;	/* free text within tags */    HTMLGen_put_character(me, '<');    HTMLGen_put_string(me, tag->name);    if (present) {	BOOL had_attr = NO;	for (i = 0; i < tag->number_of_attributes; i++) {	    if (present[i]) {		had_attr = YES;		HTMLGen_put_character(me, ' ');		allow_break(me, 11, YES);#ifdef USE_COLOR_STYLE		/*		 *  Try to mimic HTML_start_element's special handling		 *  for HTML_LINK.  If applicable, color the displayed		 *  attribute / value pairs differently. - kw		 */		if (LYPreparsedSource &&		    element_number == HTML_LINK && !title &&		    present[HTML_LINK_CLASS] &&		    value && *value[HTML_LINK_CLASS]!='\0' &&		    !present[HTML_LINK_REV] &&		    (present[HTML_LINK_REL] || present[HTML_LINK_HREF])) {		    if (present[HTML_LINK_TITLE] && *value[HTML_LINK_TITLE]) {			StrAllocCopy(title, value[HTML_LINK_TITLE]);			LYTrimHead(title);			LYTrimTail(title);		    }		    if ((!title || *title=='\0') && present[HTML_LINK_REL]) {			StrAllocCopy(title, value[HTML_LINK_REL]);		    }		    if (title && *title) {			HTSprintf0(&title_tmp, "link.%s.%s",				   value[HTML_LINK_CLASS], title);			CTRACE(tfp, "CSSTRIM:link=%s\n", title_tmp);			do_cstyle_flush(me);			HText_characterStyle(me->text, hash_code(title_tmp), 1);		    }		}#endif		HTMLGen_put_string(me, tag->attributes[i].name);		if (value[i]) {		    me->preformatted = was_preformatted;		    me->in_attrval = YES;		    if (strchr(value[i], '"') == NULL) {			HTMLGen_put_string(me, "=\"");			HTMLGen_put_string(me, value[i]);			HTMLGen_put_character(me, '"');		    } else if (strchr(value[i], '\'') == NULL) {			HTMLGen_put_string(me, "='");			HTMLGen_put_string(me, value[i]);			HTMLGen_put_character(me, '\'');		    } else {  /* attribute value has both kinds of quotes */			CONST char *p;			HTMLGen_put_string(me, "=\"");			for (p = value[i]; *p; p++) {			    if (*p != '"') {				HTMLGen_put_character(me, *p);			    } else {				HTMLGen_put_string(me, "&#34;");			    }			}			HTMLGen_put_character(me, '"');		    }		    me->preformatted = YES;		    me->in_attrval = NO;		}	    }	}#ifdef USE_COLOR_STYLE	if (had_attr && LYPreparsedSource && element_number == HTML_LINK) {	    /*	     *  Clean up after special HTML_LINK handling - kw	     */	    if (title && *title) {		do_cstyle_flush(me);		HText_characterStyle(me->text, hash_code(title_tmp), 0);		FREE(title_tmp);	    }	    FREE(title);	}#endif	if (had_attr)	    allow_break(me, 12, NO);    }    HTMLGen_put_string(me, ">"); /* got rid of \n LJM */    /*     *	Make very specific HTML assumption that PRE can't be nested!     */    me->preformatted = (element_number == HTML_PRE)  ? YES : was_preformatted;    /*     *	Can break after element start.     */    if (!me->preformatted && tag->contents != SGML_EMPTY) {	if (HTML_dtd.tags[element_number].contents == SGML_ELEMENT)	    allow_break(me, 15, NO);	else	    allow_break(me, 2, NO);    }#if defined(USE_COLOR_STYLE)    /*     *  Same logic as in HTML_start_element, copied from there. - kw     *//* 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 (LYPreparsedSource && REALLY_EMPTY(element_number))    {	CTRACE(tfp, "STYLE:begin_element:ending EMPTY element style\n");	do_cstyle_flush(me);#if !defined(USE_HASH)	HText_characterStyle(me->text, element_number+STARTAT, STACK_OFF);#else	HText_characterStyle(me->text, hcode, STACK_OFF);#endif /* USE_HASH */	TrimColorClass(HTML_dtd.tags[element_number].name,		       Style_className, &hcode);    }#endif /* USE_COLOR_STYLE */}