OSDN Git Service

* Added New Features.
[modchxj/mod_chxj.git] / src / qs_parse_attr.c
index 499339b..c6037e3 100644 (file)
@@ -1,6 +1,6 @@
 /*
+ * Copyright (C) 2005-2009 Atsushi Konno All rights reserved.
  * Copyright (C) 2005 QSDN,Inc. All rights reserved.
- * Copyright (C) 2005 Atsushi Konno All rights reserved.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include "qs_ignore_sp.h"
 
 
-Attr*
-qs_parse_attr(Doc* doc, const char*s, int len, int *pos) 
+Attr *
+qs_parse_attr(Doc *doc, const char *s, int len, int *pos) 
 {
   int   ii;
   int   start_pos;
   int   size;
   int   novalue;
-  char* name;
-  char* value;
-  Attr* attr;
-  int   use_quote = 0;
-  int   backslash = 0;
+  char  *name;
+  char  *value;
+  Attr  *attr;
+  int   use_quote_sq;
+  int   use_quote_dq;
+  int   backslash;
+
+  if (! doc) {
+    QX_LOGGER_FATAL("runtime exception: qs_parse_attr(): doc is null");
+    return NULL;
+  }
+  if (! doc->pool) {
+    QX_LOGGER_FATAL("runtime exception: qs_parse_attr(): doc->pool is null");
+    return NULL;
+  }
+  if (! s) return NULL;
+
+  use_quote_sq = 0;
+  use_quote_dq = 0;
+  backslash = 0;
 
   QX_LOGGER_DEBUG("start qs_parse_attr()");
 
@@ -60,11 +75,11 @@ qs_parse_attr(Doc* doc, const char*s, int len, int *pos)
     return NULL;
   }
 
-  name = (char*)apr_palloc(doc->pool,size+1);
+  name = (char *)apr_palloc(doc->pool,size+1);
   memset(name, 0, size+1);
   memcpy(name, &s[start_pos], size);
 
-  QX_LOGGER_DEBUG((char*)name);
+  QX_LOGGER_DEBUG((char *)name);
 
   novalue = 0;
   /* find '=' */
@@ -85,6 +100,7 @@ qs_parse_attr(Doc* doc, const char*s, int len, int *pos)
 
   size = 0;
   if (!novalue) {
+
     /* 
      * ignore space
      */
@@ -96,8 +112,13 @@ qs_parse_attr(Doc* doc, const char*s, int len, int *pos)
         backslash = 1;
         break;
       }
-      if (s[ii] == '\'' || s[ii] == '"') {
-        use_quote = 1;
+      if (s[ii] == '\'') {
+        use_quote_sq = 1;
+        ii++;
+        break;
+      }
+      if (s[ii] == '"') {
+        use_quote_dq = 1;
         ii++;
         break;
       }
@@ -123,7 +144,7 @@ qs_parse_attr(Doc* doc, const char*s, int len, int *pos)
         continue;
 
       if (is_white_space(s[ii])) {
-        if (! use_quote) 
+        if (! use_quote_sq && ! use_quote_dq
           break;
       }
 
@@ -132,10 +153,10 @@ qs_parse_attr(Doc* doc, const char*s, int len, int *pos)
         continue;
       }
 
-      if (s[ii] == '"') 
+      if (s[ii] == '"' && use_quote_dq
         break;
 
-      if (s[ii] == '\'') 
+      if (s[ii] == '\'' && use_quote_sq
         break;
     }
     size = ii - start_pos;
@@ -143,7 +164,7 @@ qs_parse_attr(Doc* doc, const char*s, int len, int *pos)
     QX_LOGGER_DEBUG_INT("size",size);
   }
 
-  value = (char*)apr_palloc(doc->pool, size+1);
+  value = (char *)apr_palloc(doc->pool, size+1);
   memset(value, 0, size+1);
   if (size != 0) 
     memcpy(value, &s[start_pos], size);
@@ -153,26 +174,38 @@ qs_parse_attr(Doc* doc, const char*s, int len, int *pos)
   attr->name  = name;
   attr->value = value;
 
-  QX_LOGGER_DEBUG(attr->name);
-  QX_LOGGER_DEBUG(attr->value);
-
   QX_LOGGER_DEBUG("end qs_parse_attr()");
   *pos = ii;
+
   return attr;
 }
 
 
-Attr*
-qs_new_attr(Docdoc) 
+Attr *
+qs_new_attr(Doc *doc) 
 {
-  Attr* attr = (Attr*)apr_palloc(doc->pool,sizeof(Attr));
+  Attr *attr;
+
+  if (!doc) {
+    QX_LOGGER_FATAL("runtime exception: qs_new_attr(): doc is null");
+    return NULL;
+  }
+  if (!doc->pool) {
+    QX_LOGGER_FATAL("runtime exception: qs_new_attr(): doc->pool is null");
+    return NULL;
+  }
+
+  attr = (Attr *)apr_palloc(doc->pool,sizeof(Attr));
   if (attr == NULL) {
     QX_LOGGER_FATAL("Out Of Memory");
+    return NULL;
   }
+
   attr->next   = NULL;
   attr->parent = NULL;
   attr->name   = NULL;
   attr->value  = NULL;
+
   return attr;
 }
 /*