2 * Copyright (C) 2005 QSDN,Inc. All rights reserved.
3 * Copyright (C) 2005 Atsushi Konno 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_malloc.h"
19 #include "qs_parse_string.h"
21 #include "qs_parse_attr.h"
22 #include "qs_parse_tag.h"
24 static char* s_get_tag_name(Doc* doc, const char* s, int len) ;
29 qs_parse_tag(Doc* doc, const char* s, int len)
37 QX_LOGGER_DEBUG("start parse_tag()");
40 /* s[0] == '<' && s[len-1] == '>' */
41 tag_name = (char *)s_get_tag_name(doc, ++s, --ll);
42 QX_LOGGER_DEBUG_INT("ll",ll);
43 node = (Node*)qs_new_tag(doc);
44 node->name = tag_name;
45 node->otext = qs_malloc(doc,len+2, QX_LOGMARK);
46 memset(node->otext, 0, len+2);
47 memcpy(node->otext, sp, len+1);
49 QX_LOGGER_DEBUG(tag_name);
51 ll -= (strlen(tag_name));
52 QX_LOGGER_DEBUG_INT("ll",ll);
53 sp += (strlen(tag_name)+1);
55 Attr* attr = qs_parse_attr(doc,sp, ll, &next_point);
57 QX_LOGGER_DEBUG("End of QS_PARSE_ATTR()");
60 QX_LOGGER_DEBUG(attr->name);
61 QX_LOGGER_DEBUG(attr->value);
64 QX_LOGGER_DEBUG_INT(sp, ll);
65 node = (Node*)qs_add_attr(doc,node, attr);
68 QX_LOGGER_DEBUG("end parse_tag()");
76 s_get_tag_name(Doc* doc, const char* s, int len) {
80 char* return_value = NULL;
83 for (ii = 0; ii < len; ii++) {
84 if (is_white_space(s[ii])) {
91 if (is_white_space(s[ii])) {
98 return_value = (char*)qs_malloc(doc, size+1,QX_LOGMARK);
100 memset(return_value, 0, size+1);
101 memcpy(return_value, &s[sp], size);
103 QX_LOGGER_DEBUG(return_value);
110 qs_new_tag(Doc* doc) {
111 Node* node = (Node*)qs_malloc(doc, sizeof(Node), QX_LOGMARK);
115 node->child_tail= NULL;
117 node->attr_tail = NULL;
128 qs_add_attr(Doc* doc, Node* node, Attr* attr) {
131 QX_LOGGER_FATAL("qs_add_attr() node is null");
136 if (node->attr == NULL)
139 node->attr_tail = attr;
143 node->attr_tail->next = attr;
144 node->attr_tail = attr;