OSDN Git Service

*** empty log message ***
[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;
35   int   backslash;
36
37   use_quote = 0;
38   backslash = 0;
39
40   QX_LOGGER_DEBUG("start qs_parse_attr()");
41
42   /* ignore space */
43   ii = start_pos = qs_ignore_sp_and_quote(doc, s, len);
44   QX_LOGGER_DEBUG_INT("len",len);
45
46   /* get attr name */
47   for (;ii<len; ii++) {
48     if (is_white_space(s[ii])) 
49       break;
50
51     if (s[ii] == '=')
52       break;
53   }
54
55   size = ii - start_pos;
56   QX_LOGGER_DEBUG_INT("size", size);
57
58   /* 
59    * not found 
60    */
61   if (size == 0) {
62     *pos = ii;
63     return NULL;
64   }
65
66   name = (char*)apr_palloc(doc->pool,size+1);
67   memset(name, 0, size+1);
68   memcpy(name, &s[start_pos], size);
69
70   QX_LOGGER_DEBUG((char*)name);
71
72   novalue = 0;
73   /* find '=' */
74   for (;ii<len; ii++) {
75     if (is_white_space(s[ii])) 
76       /* ignore */
77       continue;
78     if (s[ii] == '=') 
79       ii++;
80     else 
81       /* novalue */
82       novalue = 1;
83     break;
84   }
85
86   if (ii == len) 
87     novalue = 1;
88
89   size = 0;
90   if (!novalue) {
91     /* 
92      * ignore space
93      */
94     ii += qs_ignore_sp(doc, &s[ii], len-ii);
95
96     backslash = 0;
97     for (;ii<len; ii++) {
98       if (s[ii] == '\\') {
99         backslash = 1;
100         break;
101       }
102       if (s[ii] == '\'' || s[ii] == '"') {
103         use_quote = 1;
104         ii++;
105         break;
106       }
107       if (!is_white_space(s[ii]))
108         break;
109     }
110   
111     start_pos = ii;
112     if (backslash && ii + 2 < len)
113       ii+=2;
114     
115     backslash = 0;
116     /* 
117      * get attr value 
118      */
119     for (;ii<len; ii++) {
120       if (is_sjis_kanji(s[ii])) {
121         ii++;
122         continue;
123       }
124
125       if (is_sjis_kana(s[ii])) 
126         continue;
127
128       if (is_white_space(s[ii])) {
129         if (! use_quote) 
130           break;
131       }
132
133       if (s[ii] == '\\') {
134         ii++;
135         continue;
136       }
137
138       if (s[ii] == '"') 
139         break;
140
141       if (s[ii] == '\'') 
142         break;
143     }
144     size = ii - start_pos;
145
146     QX_LOGGER_DEBUG_INT("size",size);
147   }
148
149   value = (char*)apr_palloc(doc->pool, size+1);
150   memset(value, 0, size+1);
151   if (size != 0) 
152     memcpy(value, &s[start_pos], size);
153
154   attr = qs_new_attr(doc);
155
156   attr->name  = name;
157   attr->value = value;
158
159   QX_LOGGER_DEBUG(attr->name);
160   QX_LOGGER_DEBUG(attr->value);
161
162   QX_LOGGER_DEBUG("end qs_parse_attr()");
163   *pos = ii;
164
165   return attr;
166 }
167
168
169 Attr*
170 qs_new_attr(Doc* doc) 
171 {
172   Attr* attr = (Attr*)apr_palloc(doc->pool,sizeof(Attr));
173   if (attr == NULL) {
174     QX_LOGGER_FATAL("Out Of Memory");
175   }
176   attr->next   = NULL;
177   attr->parent = NULL;
178   attr->name   = NULL;
179   attr->value  = NULL;
180
181   return attr;
182 }
183 /*
184  * vim:ts=2 et
185  */