OSDN Git Service

Initial revision
[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_malloc.h"
19 #include "qs_parse_string.h"
20 #include "qs_parse_attr.h"
21 #include "qs_log.h"
22 #include "qs_ignore_sp.h"
23
24
25 QS_EXPORT Attr*
26 qs_parse_attr(Doc* doc, const char*s, int len, int *pos) {
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     QX_LOGGER_DEBUG((char*)&s[ii]);
45     if (is_white_space(s[ii])) {
46       break;
47     }
48     if (s[ii] == '=') {
49       break;
50     }
51   }
52
53   size = ii - start_pos;
54   QX_LOGGER_DEBUG_INT("size", size);
55   /* not found */
56   if (size == 0) {
57     *pos = ii;
58     return NULL;
59   }
60   name = (char*)qs_malloc(doc, size+1, QX_LOGMARK);
61   memset(name, 0, size+1);
62   memcpy(name, &s[start_pos], size);
63   QX_LOGGER_DEBUG((char*)&s[start_pos]);
64   QX_LOGGER_DEBUG((char*)name);
65
66   novalue = 0;
67   /* find '=' */
68   for (;ii<len; ii++) {
69     if (is_white_space(s[ii])) {
70       /* ignore */
71       continue;
72     }
73     if (s[ii] == '=') {
74       ii++;
75     }
76     else {
77       /* novalue */
78       novalue = 1;
79     }
80     break;
81   }
82
83   if (ii == len) {
84     novalue = 1;
85   }
86
87   size = 0;
88   if (!novalue) {
89     /* ignore space */
90     ii += qs_ignore_sp(doc, &s[ii], len-ii);
91     for (;ii<len; ii++) {
92       if (s[ii] == '\'' || s[ii] == '"') {
93         use_quote = 1;
94         ii++;
95         break;
96       }
97       if (!is_white_space(s[ii])) {
98         break;
99       }
100     }
101   
102     start_pos = ii;
103     /* get attr value */
104     for (;ii<len; ii++) {
105       if (is_sjis_kanji(s[ii])) {
106         ii++;
107         continue;
108       }
109       if (is_sjis_kana(s[ii])) {
110         continue;
111       }
112       if (is_white_space(s[ii])) {
113         if (! use_quote) {
114           break;
115         }
116       }
117       if (s[ii] == '"') {
118         break;
119       }
120       if (s[ii] == '\'') {
121         break;
122       }
123     }
124     size = ii - start_pos;
125     QX_LOGGER_DEBUG_INT("size",size);
126     QX_LOGGER_DEBUG((char*)&s[start_pos]);
127   }
128
129   value = (char*)qs_malloc(doc, size+1, QX_LOGMARK);
130   memset(value, 0, size+1);
131   if (size != 0) {
132     memcpy(value, &s[start_pos], size);
133   }
134
135   attr = qs_new_attr(doc);
136   attr->name = name;
137   attr->value = value;
138   QX_LOGGER_DEBUG(attr->name);
139   QX_LOGGER_DEBUG(attr->value);
140
141   QX_LOGGER_DEBUG("end qs_parse_attr()");
142   *pos = ii;
143   return attr;
144 }
145
146 QS_EXPORT Attr*
147 qs_new_attr(Doc* doc) {
148   Attr* attr = (Attr*)qs_malloc(doc,sizeof(Attr),QX_LOGMARK);
149   if (attr == NULL) {
150     QX_LOGGER_FATAL("Out Of Memory");
151   }
152   attr->next   = NULL;
153   attr->parent = NULL;
154   attr->name   = NULL;
155   attr->value  = NULL;
156   return attr;
157 }
158 /*
159  * vim:ts=2 et
160  */