OSDN Git Service

* merge from RELEASE_0_7_0
[modchxj/mod_chxj.git] / src / qs_parse_attr.c
1 /*
2  * Copyright (C) 2005 QSDN,Inc. All rights reserved.
3  * Copyright (C) 2005 Atsushi Konno All rights reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 #include <stdio.h>
18 #include "qs_parse_string.h"
19 #include "qs_parse_attr.h"
20 #include "qs_log.h"
21 #include "qs_ignore_sp.h"
22
23
24 Attr*
25 qs_parse_attr(Doc* doc, const char*s, int len, int *pos) 
26 {
27   int   ii;
28   int   start_pos;
29   int   size;
30   int   novalue;
31   char* name;
32   char* value;
33   Attr* attr;
34   int   use_quote = 0;
35   int   backslash = 0;
36
37   QX_LOGGER_DEBUG("start qs_parse_attr()");
38
39   /* ignore space */
40   ii = start_pos = qs_ignore_sp_and_quote(doc, s, len);
41   QX_LOGGER_DEBUG_INT("len",len);
42
43   /* get attr name */
44   for (;ii<len; ii++) {
45     if (is_white_space(s[ii])) 
46       break;
47
48     if (s[ii] == '=')
49       break;
50   }
51
52   size = ii - start_pos;
53   QX_LOGGER_DEBUG_INT("size", size);
54
55   /* 
56    * not found 
57    */
58   if (size == 0) {
59     *pos = ii;
60     return NULL;
61   }
62
63   name = (char*)apr_palloc(doc->pool,size+1);
64   memset(name, 0, size+1);
65   memcpy(name, &s[start_pos], size);
66
67   QX_LOGGER_DEBUG((char*)name);
68
69   novalue = 0;
70   /* find '=' */
71   for (;ii<len; ii++) {
72     if (is_white_space(s[ii])) 
73       /* ignore */
74       continue;
75     if (s[ii] == '=') 
76       ii++;
77     else 
78       /* novalue */
79       novalue = 1;
80     break;
81   }
82
83   if (ii == len) 
84     novalue = 1;
85
86   size = 0;
87   if (!novalue) {
88     /* 
89      * ignore space
90      */
91     ii += qs_ignore_sp(doc, &s[ii], len-ii);
92
93     backslash = 0;
94     for (;ii<len; ii++) {
95       if (s[ii] == '\\') {
96         backslash = 1;
97         break;
98       }
99       if (s[ii] == '\'' || s[ii] == '"') {
100         use_quote = 1;
101         ii++;
102         break;
103       }
104       if (!is_white_space(s[ii]))
105         break;
106     }
107   
108     start_pos = ii;
109     if (backslash && ii + 2 < len)
110       ii+=2;
111     
112     backslash = 0;
113     /* 
114      * get attr value 
115      */
116     for (;ii<len; ii++) {
117       if (is_sjis_kanji(s[ii])) {
118         ii++;
119         continue;
120       }
121
122       if (is_sjis_kana(s[ii])) 
123         continue;
124
125       if (is_white_space(s[ii])) {
126         if (! use_quote) 
127           break;
128       }
129
130       if (s[ii] == '\\') {
131         ii++;
132         continue;
133       }
134
135       if (s[ii] == '"') 
136         break;
137
138       if (s[ii] == '\'') 
139         break;
140     }
141     size = ii - start_pos;
142
143     QX_LOGGER_DEBUG_INT("size",size);
144   }
145
146   value = (char*)apr_palloc(doc->pool, size+1);
147   memset(value, 0, size+1);
148   if (size != 0) 
149     memcpy(value, &s[start_pos], size);
150
151   attr = qs_new_attr(doc);
152
153   attr->name  = name;
154   attr->value = value;
155
156   QX_LOGGER_DEBUG(attr->name);
157   QX_LOGGER_DEBUG(attr->value);
158
159   QX_LOGGER_DEBUG("end qs_parse_attr()");
160   *pos = ii;
161   return attr;
162 }
163
164
165 Attr*
166 qs_new_attr(Doc* doc) 
167 {
168   Attr* attr = (Attr*)apr_palloc(doc->pool,sizeof(Attr));
169   if (attr == NULL) {
170     QX_LOGGER_FATAL("Out Of Memory");
171   }
172   attr->next   = NULL;
173   attr->parent = NULL;
174   attr->name   = NULL;
175   attr->value  = NULL;
176   return attr;
177 }
178 /*
179  * vim:ts=2 et
180  */