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 = 0;
35
36   QX_LOGGER_DEBUG("start qs_parse_attr()");
37
38   /* ignore space */
39   ii = start_pos = qs_ignore_sp_and_quote(doc, s, len);
40   QX_LOGGER_DEBUG_INT("len",len);
41
42   /* get attr name */
43   for (;ii<len; ii++) 
44   {
45     if (is_white_space(s[ii])) 
46     {
47       break;
48     }
49     if (s[ii] == '=') 
50     {
51       break;
52     }
53   }
54
55   size = ii - start_pos;
56   QX_LOGGER_DEBUG_INT("size", size);
57   /* not found */
58   if (size == 0) 
59   {
60     *pos = ii;
61     return NULL;
62   }
63   name = (char*)apr_palloc(doc->pool,size+1);
64   memset(name, 0, size+1);
65   memcpy(name, &s[start_pos], size);
66   QX_LOGGER_DEBUG((char*)name);
67
68   novalue = 0;
69   /* find '=' */
70   for (;ii<len; ii++) 
71   {
72     if (is_white_space(s[ii])) 
73     {
74       /* ignore */
75       continue;
76     }
77     if (s[ii] == '=') 
78     {
79       ii++;
80     }
81     else 
82     {
83       /* novalue */
84       novalue = 1;
85     }
86     break;
87   }
88
89   if (ii == len) 
90   {
91     novalue = 1;
92   }
93
94   size = 0;
95   if (!novalue) 
96   {
97     /* ignore space */
98     ii += qs_ignore_sp(doc, &s[ii], len-ii);
99     for (;ii<len; ii++) 
100     {
101       if (s[ii] == '\'' || s[ii] == '"') 
102       {
103         use_quote = 1;
104         ii++;
105         break;
106       }
107       if (!is_white_space(s[ii])) 
108       {
109         break;
110       }
111     }
112   
113     start_pos = ii;
114     /* get attr value */
115     for (;ii<len; ii++) 
116     {
117       if (is_sjis_kanji(s[ii])) 
118       {
119         ii++;
120         continue;
121       }
122       if (is_sjis_kana(s[ii])) 
123       {
124         continue;
125       }
126       if (is_white_space(s[ii])) 
127       {
128         if (! use_quote) 
129         {
130           break;
131         }
132       }
133       if (s[ii] == '"') 
134       {
135         break;
136       }
137       if (s[ii] == '\'') 
138       {
139         break;
140       }
141     }
142     size = ii - start_pos;
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   {
150     memcpy(value, &s[start_pos], size);
151   }
152
153   attr = qs_new_attr(doc);
154   attr->name = name;
155   attr->value = value;
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 Attr*
165 qs_new_attr(Doc* doc) 
166 {
167   Attr* attr = (Attr*)apr_palloc(doc->pool,sizeof(Attr));
168   if (attr == NULL) 
169   {
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  */