From 5468a126cbaa719e717ab927b296b8ea9f18e49e Mon Sep 17 00:00:00 2001
From: Martin Stjernholm <mast@lysator.liu.se>
Date: Sat, 10 Jun 2000 00:50:20 +0200
Subject: [PATCH] Declare variables to the pike core instead of using the gc
 hooks. Fixes in html_tag_args().

Rev: src/modules/Parser/html.c:1.90
---
 src/modules/Parser/html.c | 124 +++++++++++++++-----------------------
 1 file changed, 50 insertions(+), 74 deletions(-)

diff --git a/src/modules/Parser/html.c b/src/modules/Parser/html.c
index ead1e26a0d..fe2e1dcc21 100644
--- a/src/modules/Parser/html.c
+++ b/src/modules/Parser/html.c
@@ -14,7 +14,6 @@
 #include "module_support.h"
 #include "mapping.h"
 #include "stralloc.h"
-#include "gc.h"
 #include "program_id.h"
 #include <ctype.h>
 
@@ -503,31 +502,14 @@ static void init_html_struct(struct object *o)
    THIS->ws_or_endarg=NULL;
    THIS->arg_break_chars=NULL;
 
-   THIS->maptag=NULL;
-   THIS->mapcont=NULL;
-   THIS->mapentity=NULL;
-   THIS->mapqtag=NULL;
-
-   THIS->splice_arg=NULL;
-
    THIS->flags=FLAG_MATCH_TAG|FLAG_PARSE_TAGS;
 
-   THIS->extra_args=NULL;
-
    /* initialize feed */
    THIS->feed=NULL;
    THIS->out=NULL;
    THIS->cond_out=NULL;
    THIS->stack=NULL;
    reset_feed(THIS);
-   
-   /* clear callbacks */
-   THIS->callback__tag.type=T_INT;
-   THIS->callback__tag.u.integer=0;
-   THIS->callback__data.type=T_INT;
-   THIS->callback__data.u.integer=0;
-   THIS->callback__entity.type=T_INT;
-   THIS->callback__entity.u.integer=0;
 
    /* settings */
    THIS->max_stack_depth=MAX_FEED_STACK_DEPTH;
@@ -557,20 +539,6 @@ static void exit_html_struct(struct object *o)
 
    reset_feed(THIS); /* frees feed & out */
 
-   if (THIS->maptag) free_mapping(THIS->maptag);
-   if (THIS->mapcont) free_mapping(THIS->mapcont);
-   if (THIS->mapentity) free_mapping(THIS->mapentity);
-   if (THIS->mapqtag) free_mapping(THIS->mapqtag);
-
-   if (THIS->splice_arg) free_string(THIS->splice_arg);
-
-   dmalloc_touch_svalue(&(THIS->callback__tag));
-   dmalloc_touch_svalue(&(THIS->callback__data));
-   dmalloc_touch_svalue(&(THIS->callback__entity));
-   free_svalue(&(THIS->callback__tag));
-   free_svalue(&(THIS->callback__data));
-   free_svalue(&(THIS->callback__entity));
-
    while ((fsp = THIS->stack)) {
      THIS->stack = fsp->prev;
      free(fsp);
@@ -581,8 +549,6 @@ static void exit_html_struct(struct object *o)
    if (THIS->ws_or_endarg) free(THIS->ws_or_endarg);
    if (THIS->arg_break_chars) free(THIS->arg_break_chars);
 
-   if (THIS->extra_args) free_array(THIS->extra_args);
-
    DEBUG((stderr,"exit_html_struct %p done\n",THIS));
 }
 
@@ -712,36 +678,6 @@ static void unwind_subparse_state (struct subparse_save *save)
   free_object (save->thisobj);
 }
 
-static void gc_check_html(struct object *o)
-{
-   gc_check(THIS->maptag);
-   gc_check(THIS->mapcont);
-   gc_check(THIS->mapentity);
-   gc_check(THIS->mapqtag);
-
-   gc_check_svalues(&(THIS->callback__tag),1);
-   gc_check_svalues(&(THIS->callback__data),1);
-   gc_check_svalues(&(THIS->callback__entity),1);
-   
-   if (THIS->extra_args)
-      gc_check(THIS->extra_args);
-}
-
-static void gc_mark_html(struct object *o)
-{
-   gc_mark_mapping_as_referenced(THIS->maptag);
-   gc_mark_mapping_as_referenced(THIS->mapcont);
-   gc_mark_mapping_as_referenced(THIS->mapentity);
-   gc_mark_mapping_as_referenced(THIS->mapqtag);
-
-   gc_mark_svalues(&(THIS->callback__tag),1);
-   gc_mark_svalues(&(THIS->callback__data),1);
-   gc_mark_svalues(&(THIS->callback__entity),1);
-   
-   if (THIS->extra_args)
-      gc_mark_array_as_referenced(THIS->extra_args);
-}
-
 /****** setup callbacks *****************************/
 
 /*
@@ -4085,15 +4021,19 @@ static void tag_args(struct parser_html_storage *this,struct piece *feed,int c,
       scan_forward(s2,c2,&s1,&c1,this->ws,-this->n_ws);
 
       /* end of tag? */
-      if (c1==s1->s->len) /* end<tm> */
-	 break;
+      if (c1==s1->s->len) { /* end<tm> */
+	DEBUG_MARK_SPOT("html_tag_args hard tag end (1)",s1,c1);
+	break;
+      }
       ch=index_shared_string(s1->s,c1);
       if ((flags & (FLAG_STRICT_TAGS|FLAG_XML_TAGS)) != FLAG_STRICT_TAGS &&
 	  ch==this->tag_fin) {
 	FORWARD_CHAR(s1, c1, s3, c3);
 	if ((c3==s3->s->len || index_shared_string(s3->s,c3)==this->tag_end) &&
-	    to_tag_end)
+	    to_tag_end) {
+	  DEBUG_MARK_SPOT("html_tag_args empty element tag end",s3,c3);
 	  break;
+	}
 	else if (n && s1==s2 && c1==c2) { /* previous arg value didn't really end */
 	  DEBUG_MARK_SPOT("html_tag_args arg val continues",s3,c3);
 	  push_string (make_shared_binary_string2 (&this->tag_fin, 1));
@@ -4102,8 +4042,10 @@ static void tag_args(struct parser_html_storage *this,struct piece *feed,int c,
 	  continue;
 	}
       }
-      else if (ch==this->tag_end && to_tag_end) /* end */
-	 break;
+      else if (ch==this->tag_end && to_tag_end) { /* end */
+	DEBUG_MARK_SPOT("html_tag_args soft tag end (1)",s1,c1);
+	break;
+      }
 
 new_arg:
 
@@ -4121,6 +4063,7 @@ new_arg:
 	scan_forward(s2,c2,&s3,&c3,this->ws,-this->n_ws);
 	if (c3==s3->s->len) /* end<tm> */
 	{
+	  DEBUG_MARK_SPOT("html_tag_args hard tag end (2)",s3,c3);
 	  tag_push_default_arg(def);
 	  goto done;
 	}
@@ -4144,6 +4087,7 @@ new_arg:
 
       if (ch==this->tag_end && to_tag_end) /* end */
       {
+	 DEBUG_MARK_SPOT("html_tag_args soft tag end (2)",s3,c3);
 	 tag_push_default_arg(def);
 	 break;
       }
@@ -4151,15 +4095,17 @@ new_arg:
       if (ch!=this->arg_eq) {
 	if (c1!=c3 || s1!=s3)	/* end of _this_ argument */
 	{
+	  DEBUG_MARK_SPOT("html_tag_args empty arg end",s3,c3);
 	  s1 = s3, c1 = c3;
 	  tag_push_default_arg(def);
 	  goto new_arg;
 	}
 	else {			/* a stray bogus character */
-	  s1 = s3, c1 = c3 + 1;
+	  DEBUG_MARK_SPOT("html_tag_args bogus char",s3,c3);
+	  s2 = s3, c2 = c3 + 1;
 	  pop_stack();
 	  n--;
-	  goto new_arg;
+	  continue;
 	}
       }
       
@@ -4174,6 +4120,8 @@ new_arg:
       /* scan the argument value */
       scan_forward_arg(this,s2,c2,&s1,&c1,SCAN_ARG_PUSH,1,NULL);
 
+      DEBUG_MARK_SPOT("html_tag_args value end",s1,c1);
+
       /* next argument in the loop */
       s2 = s1;
       c2 = c1;
@@ -4961,14 +4909,42 @@ static void html_debug_mode(INT32 args)
 
 void init_parser_html(void)
 {
+   SIZE_T offset;
+
    empty_string = make_shared_binary_string("", 0);
 
-   ADD_STORAGE(struct parser_html_storage);
+   offset = ADD_STORAGE(struct parser_html_storage);
+
+   MAP_VARIABLE(" maptag", offset + OFFSETOF(parser_html_storage, maptag),
+		tMap(tStr,tTodo(tTagargs)),
+		T_MAPPING, ID_STATIC|ID_PRIVATE);
+   MAP_VARIABLE(" mapcont", offset + OFFSETOF(parser_html_storage, mapcont),
+		tMap(tStr,tTodo(tTagargs tStr)),
+		T_MAPPING, ID_STATIC|ID_PRIVATE);
+   MAP_VARIABLE(" mapentity", offset + OFFSETOF(parser_html_storage, mapentity),
+		tMap(tStr,tTodo(tNone)),
+		T_MAPPING, ID_STATIC|ID_PRIVATE);
+   MAP_VARIABLE(" mapqtag", offset + OFFSETOF(parser_html_storage, mapqtag),
+		tMap(tStr,tTodo(tStr)),
+		T_MAPPING, ID_STATIC|ID_PRIVATE);
+   MAP_VARIABLE(" callback__tag", offset + OFFSETOF(parser_html_storage, callback__tag),
+		tFuncV(tObjImpl_PARSER_HTML tStr,tMix,tCbret),
+		T_MIXED, ID_STATIC|ID_PRIVATE);
+   MAP_VARIABLE(" callback__data", offset + OFFSETOF(parser_html_storage, callback__data),
+		tFuncV(tObjImpl_PARSER_HTML tStr,tMix,tCbret),
+		T_MIXED, ID_STATIC|ID_PRIVATE);
+   MAP_VARIABLE(" callback__entity", offset + OFFSETOF(parser_html_storage, callback__entity),
+		tFuncV(tObjImpl_PARSER_HTML tStr,tMix,tCbret),
+		T_MIXED, ID_STATIC|ID_PRIVATE);
+   MAP_VARIABLE(" splice_arg", offset + OFFSETOF(parser_html_storage, splice_arg),
+		tString,
+		T_STRING, ID_STATIC|ID_PRIVATE);
+   MAP_VARIABLE(" extra_args", offset + OFFSETOF(parser_html_storage, extra_args),
+		tArray,
+		T_ARRAY, ID_STATIC|ID_PRIVATE);
 
    set_init_callback(init_html_struct);
    set_exit_callback(exit_html_struct);
-   set_gc_check_callback(gc_check_html);
-   set_gc_mark_callback(gc_mark_html);
 
    ADD_FUNCTION("create",html_create,tFunc(tNone,tVoid),ID_STATIC);
    ADD_FUNCTION("clone",html_clone,tFuncV(tNone,tMixed,tObjImpl_PARSER_HTML),0);
-- 
GitLab