OSDN Git Service

* 2005/3/24
authorkonn <konn@1a406e8e-add9-4483-a2c8-d8cac5b7c224>
Wed, 23 Mar 2005 18:59:16 +0000 (18:59 +0000)
committerkonn <konn@1a406e8e-add9-4483-a2c8-d8cac5b7c224>
Wed, 23 Mar 2005 18:59:16 +0000 (18:59 +0000)
  DOCTYPEが存在する場合、DOCTYPEの子ノードが出来ていたのを修正。

* 2005/3/24
  入力のHTMLがでたらめの場合、存在しないROOTノードの親ノードにアクセスしてしまう欠陥の修正。

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/trunk@33 1a406e8e-add9-4483-a2c8-d8cac5b7c224

src/chxj_hdml.c
src/mod_chxj.h
src/qs_parse_string.c
src/qs_parse_string.h
src/qs_parse_tag.c

index 09da18d..81a6aac 100644 (file)
@@ -142,10 +142,12 @@ chxj_exchange_hdml(request_rec* r,
     /* Here, the parsing of the received character string is done             */
     /*------------------------------------------------------------------------*/
     char *ss = apr_pstrdup(r->pool, src);
+    ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
+                    "input srclen=[%d]\n", srclen);
     qs_init_malloc(&doc); 
     qs_init_root_node(&doc);
     ss[srclen] = '\0';
-    qs_parse_string(&doc,ss, strlen(ss));
+    qs_parse_string(&doc, ss, srclen);
 
     /*------------------------------------------------------------------------*/
     /* The number of radiobuttons is counted.                                 */
index aed4a4e..27cab84 100644 (file)
@@ -81,6 +81,7 @@ typedef struct _mod_chxj_config_t
   device_table_list*  devices;
   emoji_t*            emoji;
   emoji_t*            emoji_tail;
+
 } mod_chxj_config;
 
 typedef struct _mod_chxj_global_config_t
index 343a3b5..fa38789 100644 (file)
@@ -16,6 +16,8 @@
  */
 #include <stdio.h>
 #include <strings.h>
+#include "httpd.h"
+#include "http_log.h"
 #include "qs_malloc.h"
 #include "qs_parse_string.h"
 #include "qs_parse_tag.h"
@@ -23,6 +25,7 @@
 
 static int s_cut_tag (const char* s, int len) ;
 static int s_cut_text(const char* s, int len) ;
+static void qs_dump_node(Doc* doc, Node* node, int indent);
 
 
 QS_EXPORT Node*
@@ -61,13 +64,13 @@ qs_parse_string(Doc* doc, const char* src, int srclen) {
       {
         if (has_child(node->name)) 
         {
+          if (doc->now_parent_node->parent != NULL)
+          {
 #ifdef DEBUG
          {char buf[256]; sprintf(buf, "[%s]->[%s]", 
                          doc->now_parent_node->name, 
                          doc->now_parent_node->parent->name); QX_LOGGER_DEBUG(buf);}
 #endif
-          if (doc->root_node != doc->now_parent_node)
-          {
             doc->now_parent_node = doc->now_parent_node->parent;
           }
         }
@@ -116,9 +119,42 @@ qs_parse_string(Doc* doc, const char* src, int srclen) {
   QX_LOGGER_DEBUG("parse_string end");
 #endif
 
+#ifdef DEBUG
+  if (doc->r != NULL)
+  {
+    qs_dump_node(doc, doc->root_node, 0);
+  }
+#endif
+
   return doc->root_node;
 }
 
+static void
+qs_dump_node(Doc* doc, Node* node, int indent) {
+  Node* p = (Node*)qs_get_child_node(doc,node);
+
+  for (;p;p = (Node*)qs_get_next_node(doc,p)) {
+    Attr* attr;
+    if ((char*)qs_get_node_value(doc,p) != NULL) {
+      ap_log_rerror(APLOG_MARK, APLOG_DEBUG,0, doc->r,
+        "%*.*sNode:[%s][%s]\n", indent,indent," ",
+                      (char*)qs_get_node_name(doc,p),
+                      (char*)qs_get_node_value(doc,p));
+    }
+    else {
+      ap_log_rerror(APLOG_MARK, APLOG_DEBUG,0, doc->r,
+        "%*.*sNode:[%s]\n", indent,indent," ", qs_get_node_name(doc,p));
+    }
+    for (attr = (Attr*)qs_get_attr(doc,p); attr; attr = (Attr*)qs_get_next_attr(doc,attr)) {
+      ap_log_rerror(APLOG_MARK, APLOG_DEBUG,0, doc->r,
+        "%*.*s  ATTR:[%s]\n", indent,indent," ", (char *)qs_get_attr_name(doc,attr));
+      ap_log_rerror(APLOG_MARK, APLOG_DEBUG,0, doc->r,
+        "%*.*s  VAL :[%s]\n", indent,indent," ", (char *)qs_get_attr_value(doc,attr));
+    }
+    qs_dump_node(doc,p, indent+4);
+  }
+}
+
 
 
 static int
index e797c00..d9ef5db 100644 (file)
 #ifndef __QS_PARSE_STRING_H__
 #define __QS_PARSE_STRING_H__
 #include <httpd.h>
+/*
+#define DEBUG
+#define USE_LOG
+*/
 /**
  * Max of memory allocation times.
  */
@@ -73,6 +77,7 @@
                         &&  (strcasecmp(c, "p"        ) != 0) \
                         &&  (strcasecmp(c, "plaintext") != 0) \
                         &&  (strcasecmp(c, "?xml"     ) != 0) \
+                        &&  (strcasecmp(c, "!doctype" ) != 0) \
                         &&  (strcasecmp(c, "!--"      ) != 0))
 
 /**
index 0ae81ab..b324381 100644 (file)
@@ -26,7 +26,8 @@ static char* s_get_tag_name(Doc* doc, const char* s, int len) ;
 
 
 QS_EXPORT Node*
-qs_parse_tag(Doc* doc, const char* s, int len) {
+qs_parse_tag(Doc* doc, const char* s, int len) 
+{
   Node* node;
   char *tag_name;
   char *sp = (char*)s;