2 * Copyright (C) 2005-2008 Atsushi Konno All rights reserved.
3 * Copyright (C) 2005 QSDN,Inc. All rights reserved.
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include "qs_parse_string.h"
20 #include "qs_parse_attr.h"
21 #include "qs_parse_tag.h"
23 static char *s_get_tag_name(Doc *doc, const char *s, int len) ;
28 qs_parse_tag(Doc *doc, const char *s, int len)
37 sv_s = sp = (char *)s;
41 QX_LOGGER_DEBUG("start parse_tag()");
45 * s[0] == '<' && s[len] == '>'
47 tag_name = (char *)s_get_tag_name(doc, ++s, --ll);
49 node = (Node*)qs_new_tag(doc);
50 node->name = tag_name;
51 node->otext = apr_palloc(doc->pool,len+2);
52 memset(node->otext, 0, len+2);
53 memcpy(node->otext, sp, len+1);
55 QX_LOGGER_DEBUG(tag_name);
57 ll -= (strlen(tag_name));
58 QX_LOGGER_DEBUG_INT("ll",ll);
59 sp += (strlen(tag_name)+1);
61 Attr *attr = qs_parse_attr(doc,sp, ll, &next_point);
63 QX_LOGGER_DEBUG("End of QS_PARSE_ATTR()");
66 QX_LOGGER_DEBUG(attr->name);
67 QX_LOGGER_DEBUG(attr->value);
70 QX_LOGGER_DEBUG_INT(sp, ll);
71 node = (Node*)qs_add_attr(doc,node, attr);
74 if (sv_s[len-1] == '/') {
75 node->closed_by_itself = 1;
78 node->closed_by_itself = 0;
80 QX_LOGGER_DEBUG("end parse_tag()");
89 s_get_tag_name(Doc* doc, const char* s, int len)
94 char* return_value = NULL;
97 for (ii = 0; ii < len; ii++) {
98 if (is_white_space(s[ii]))
104 for (;ii<len; ii++) {
105 if (is_white_space(s[ii]))
111 return_value = (char*)apr_palloc(doc->pool, size+1);
113 memset(return_value, 0, size+1);
114 memcpy(return_value, &s[sp], size);
116 QX_LOGGER_DEBUG(return_value);
125 Node* node = (Node*)apr_palloc(doc->pool, sizeof(Node));
129 node->child_tail= NULL;
131 node->attr_tail = NULL;
142 qs_add_attr(Doc* doc, Node* node, Attr* attr)
145 QX_LOGGER_FATAL("qs_add_attr() node is null");
150 if (node->attr == NULL) {
152 node->attr_tail = attr;
157 node->attr_tail->next = attr;
158 node->attr_tail = attr;