about summary refs log tree commit diff stats
path: root/WWW/Library/Implementation
diff options
context:
space:
mode:
Diffstat (limited to 'WWW/Library/Implementation')
-rw-r--r--WWW/Library/Implementation/HTAccess.c32
-rw-r--r--WWW/Library/Implementation/SGML.c81
-rw-r--r--WWW/Library/Implementation/dtd_util.c6
3 files changed, 80 insertions, 39 deletions
diff --git a/WWW/Library/Implementation/HTAccess.c b/WWW/Library/Implementation/HTAccess.c
index 4f4ebd8e..ebcf0863 100644
--- a/WWW/Library/Implementation/HTAccess.c
+++ b/WWW/Library/Implementation/HTAccess.c
@@ -1,4 +1,7 @@
-/*		Access Manager					HTAccess.c
+/*
+ * $LynxId: HTAccess.c,v 1.66 2008/08/31 22:38:38 tom Exp $
+ *
+ *		Access Manager					HTAccess.c
  *		==============
  *
  *  Authors
@@ -681,21 +684,19 @@ static int HTLoad(const char *addr,
     if (status == HT_FORBIDDEN) {
 	/* prevent crash if telnet or similar was forbidden by rule. - kw */
 	LYFixCursesOn("show alert:");
-	return HTLoadError(sink, 500, gettext("Access forbidden by rule"));
+	status = HTLoadError(sink, 500, gettext("Access forbidden by rule"));
     } else if (status == HT_REDIRECTING) {
-	return status;		/* fake redirection by rule, to redirecting_url */
+	;			/* fake redirection by rule, to redirecting_url */
+    } else if (status >= 0) {
+	/* prevent crash if telnet or similar mapped or proxied by rule. - kw */
+	LYFixCursesOnForAccess(addr, HTAnchor_physical(anchor));
+	p = (HTProtocol *) HTAnchor_protocol(anchor);
+	anchor->parent->underway = TRUE;	/* Hack to deal with caching */
+	status = p->load(HTAnchor_physical(anchor),
+			 anchor, format_out, sink);
+	anchor->parent->underway = FALSE;
+	LYUCPopAssumed();
     }
-    if (status < 0)
-	return status;		/* Can't resolve or forbidden */
-
-    /* prevent crash if telnet or similar mapped or proxied by rule. - kw */
-    LYFixCursesOnForAccess(addr, HTAnchor_physical(anchor));
-    p = (HTProtocol *) HTAnchor_protocol(anchor);
-    anchor->parent->underway = TRUE;	/* Hack to deal with caching */
-    status = p->load(HTAnchor_physical(anchor),
-		     anchor, format_out, sink);
-    anchor->parent->underway = FALSE;
-    LYUCPopAssumed();
     return status;
 }
 
@@ -903,11 +904,12 @@ static BOOL HTLoadDocument(const char *full_address,	/* may include #fragment */
 	    return YES;
 	} else {
 	    ForcingNoCache = YES;
+	    BStrFree(anchor->post_data);
 	    CTRACE((tfp, "HTAccess: Auto-reloading document.\n"));
 	}
     }
 
-    if (text && HText_HaveUserChangedForms(text)) {
+    if (HText_HaveUserChangedForms(text)) {
 	/*
 	 * Issue a warning.  User forms content will be lost.
 	 * Will not restore changed forms, currently.
diff --git a/WWW/Library/Implementation/SGML.c b/WWW/Library/Implementation/SGML.c
index d00690ee..4c571fd7 100644
--- a/WWW/Library/Implementation/SGML.c
+++ b/WWW/Library/Implementation/SGML.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: SGML.c,v 1.106 2008/07/15 23:54:39 tom Exp $
+ * $LynxId: SGML.c,v 1.109 2008/08/31 18:34:05 tom Exp $
  *
  *			General SGML Parser code		SGML.c
  *			========================
@@ -509,7 +509,7 @@ static void handle_attribute_name(HTStream *context, const char *s)
     }				/* for */
 
     CTRACE((tfp, "SGML: Unknown attribute %s for tag %s\n",
-	    s, context->current_tag->name));
+	    s, NonNull(context->current_tag->name)));
     context->current_attribute_number = INVALID;	/* Invalid */
 }
 
@@ -1371,8 +1371,12 @@ HTTag *SGMLFindTag(const SGML_dtd * dtd,
     {NULL};			/*optimize using the previous results */
     HTTag **res = last + (UCH(*s) % 64);	/*pointer arithmetic */
 
-    if (*res && !strcasecomp((*res)->name, s))
-	return *res;
+    if (*res) {
+	if ((*res)->name == NULL)
+	    return NULL;
+	if (!strcasecomp((*res)->name, s))
+	    return *res;
+    }
 
     for (low = 0, high = dtd->number_of_tags;
 	 high > low;
@@ -1526,6 +1530,39 @@ static void transform_tag(HTStream *context, HTChunk *string)
 }
 #endif /* USE_PRETTYSRC */
 
+static BOOL ignore_when_empty(HTTag * tag)
+{
+    BOOL result = FALSE;
+
+    if (tag->name != 0
+	&& tag->contents != SGML_EMPTY
+	&& tag->tagclass != Tgc_Plike
+	&& (tag->tagclass == Tgc_SELECTlike
+	    || (tag->contains && tag->icontains))) {
+	result = TRUE;
+    }
+    CTRACE((tfp, "SGML Do%s ignore_when_empty:%s\n",
+	    result ? "" : " not",
+	    NonNull(tag->name)));
+    return result;
+}
+
+static void discard_empty(HTStream *context)
+{
+    CTRACE((tfp, "SGML discarding empty %s\n",
+	    NonNull(context->current_tag->name)));
+    CTRACE_FLUSH(tfp);
+
+    /* disable start_element() */
+    context->current_tag->name = 0;
+
+    /* these may be redundant: */
+    context->current_tag->contents = SGML_EMPTY;
+    context->string->size = 0;
+
+    /* do not call end_element() if start_element() was not called */
+}
+
 static void SGML_character(HTStream *context, char c_in)
 {
     const SGML_dtd *dtd = context->dtd;
@@ -1750,7 +1787,7 @@ static void SGML_character(HTStream *context, char c_in)
  *  We jump up to here from below if we have
  *  stuff in the recover, insert, or csi buffers
  *  to process.	 We zero saved_char_in, in effect
- *  as a flag that the octet in not that of the
+ *  as a flag that the octet is not that of the
  *  actual call to this function.  This may be OK
  *  for now, for the stuff this function adds to
  *  its recover buffer, but it might not be for
@@ -1788,7 +1825,8 @@ static void SGML_character(HTStream *context, char c_in)
      */
     /*
      * Works for both ASCII and EBCDIC. -- gil
- *//* S/390 -- gil -- 0811 */
+     * S/390 -- gil -- 0811
+     */
     if (TOASCII(unsign_c) < 32 &&
 	c != '\t' && c != '\n' && c != '\r' &&
 	HTCJK == NOCJK)
@@ -1813,7 +1851,7 @@ static void SGML_character(HTStream *context, char c_in)
 
     /* Almost all CJK characters are double byte but only Japanese
      * JIS X0201 Kana is single byte. To prevent to fail SGML parsing
-     * we have to care them here. -- TH
+     * we have to take care of them here. -- TH
      */
     if ((HTCJK == JAPANESE) && (context->state == S_in_kanji) &&
 	!IS_JAPANESE_2BYTE(context->kanji_buf, UCH(c))
@@ -1861,7 +1899,7 @@ static void SGML_character(HTStream *context, char c_in)
     case S_tagname_slash:
 	/*
 	 * We had something link "<name/" so far, set state to S_text but keep
-	 * context->slashedtag as as a flag; except if we get '>' directly
+	 * context->slashedtag as a flag; except if we get '>' directly
 	 * after the "<name/", and really have a tag for that name in
 	 * context->slashedtag, in which case keep state as is and let code
 	 * below deal with it.  - kw
@@ -1940,6 +1978,7 @@ static void SGML_character(HTStream *context, char c_in)
 	    }
 	    context->slashedtag = NULL;
 	} else if (context->slashedtag &&
+		   context->slashedtag->name &&
 		   (c == '/' ||
 		    (c == '>' && context->state == S_tagname_slash)) &&
 		   TOASCII(unsign_c) < 127) {
@@ -2093,7 +2132,7 @@ static void SGML_character(HTStream *context, char c_in)
 	    HTChunkPuts(string, EntityName);
 	    HTChunkTerminate(string);
 #ifdef USE_PRETTYSRC
-	    /* we need to disable it temporary */
+	    /* we need to disable it temporarily */
 	    if (psrc_view) {
 		psrc_view_backup = 1;
 		psrc_view = 0;
@@ -2101,7 +2140,7 @@ static void SGML_character(HTStream *context, char c_in)
 #endif
 	    handle_entity(context, '\0');
 #ifdef USE_PRETTYSRC
-	    /* we need to disable it temporary */
+	    /* we need to disable it temporarily */
 	    if (psrc_view_backup)
 		psrc_view = TRUE;
 #endif
@@ -2216,17 +2255,20 @@ static void SGML_character(HTStream *context, char c_in)
 	 * with old servers, and for Lynx).  - FM
 	 */
       case_S_litteral:
-    case S_litteral:		/*PSRC:this case not understood completely by HV, not done */
+    case S_litteral:
+	/*PSRC:this case not understood completely by HV, not done */
 	HTChunkPutc(string, c);
 #ifdef USE_PRETTYSRC
-	if (psrc_view) {	/*there is nothing useful in the element_stack */
+	if (psrc_view) {
+	    /* there is nothing useful in the element_stack */
 	    testtag = context->current_tag;
 	} else
 #endif
-	    testtag = context->element_stack ?
-		context->element_stack->tag : NULL;
+	    testtag = (context->element_stack
+		       ? context->element_stack->tag
+		       : NULL);
 
-	if (testtag == NULL) {
+	if (testtag == NULL || testtag->name == NULL) {
 	    string->size--;
 	    context->state = S_text;
 	    goto top1;
@@ -2469,8 +2511,7 @@ static void SGML_character(HTStream *context, char c_in)
 	 * Handle a numeric entity.
 	 */
     case S_incro:
-/* S/390 -- gil -- 1075 *//* CTRACE((tfp, "%s: %d: numeric %d %d\n",
-   __FILE__, __LINE__, unsign_c, c)); */
+	/* S/390 -- gil -- 1075 */
 	if ((TOASCII(unsign_c) < 127) &&
 	    (context->isHex ? isxdigit(UCH(c)) :
 	     isdigit(UCH(c)))) {
@@ -3525,10 +3566,8 @@ static void SGML_character(HTStream *context, char c_in)
 		&& (string->size == 1)
 		&& (string->data[0] == '/')) {
 		if (context->extended_html
-		    && context->current_tag->name) {
-		    CTRACE((tfp, "SGML discarding empty %s\n", context->current_tag->name));
-		    string->size = 0;
-		    context->current_tag->contents = SGML_EMPTY;
+		    && ignore_when_empty(context->current_tag)) {
+		    discard_empty(context);
 		}
 	    } else {
 		HTChunkTerminate(string);
diff --git a/WWW/Library/Implementation/dtd_util.c b/WWW/Library/Implementation/dtd_util.c
index 87a1b2a7..268d19ed 100644
--- a/WWW/Library/Implementation/dtd_util.c
+++ b/WWW/Library/Implementation/dtd_util.c
@@ -1,5 +1,5 @@
 /*
- * $LynxId: dtd_util.c,v 1.27 2008/07/15 22:43:29 tom Exp $
+ * $LynxId: dtd_util.c,v 1.28 2008/08/18 23:42:12 tom Exp $
  *
  * Given a SGML_dtd structure, write a corresponding flat file, or "C" source.
  * Given the flat-file, write the "C" source.
@@ -192,7 +192,7 @@ static const char *DEF_name(const SGML_dtd * dtd, int which)
 
 typedef struct {
     const char *name;
-    attr *attrs;
+    const attr *attrs;
     int count;
     int which;
 } AttrInfo;
@@ -490,7 +490,7 @@ static void dump_header(FILE *output, const SGML_dtd * dtd)
     fprintf(output, "#endif\t\t\t\t/* %s */\n", marker);
 }
 
-static void dump_flat_attrs(FILE *output, const char *name, attr * attributes, int number_of_attributes)
+static void dump_flat_attrs(FILE *output, const char *name, const attr * attributes, int number_of_attributes)
 {
     int n;