示例#1
0
文件: acl_xml.c 项目: DavadDi/acl
ACL_XML *acl_xml_alloc1(ACL_SLICE_POOL *slice)
{
    ACL_XML *xml;

    if (slice) {
        xml = (ACL_XML*) acl_slice_pool_calloc(__FILE__, __LINE__,
                                               slice, 1, sizeof(ACL_XML));
        xml->slice = slice;
    } else {
        xml = (ACL_XML*) acl_mycalloc(1, sizeof(ACL_XML));
        xml->slice = NULL;
    }

    xml->root = acl_xml_node_alloc(xml);
    xml->id_table = acl_htable_create3(10, 0, slice);

    xml->iter_head = xml_iter_head;
    xml->iter_next = xml_iter_next;
    xml->iter_tail = xml_iter_tail;
    xml->iter_prev = xml_iter_prev;
    return (xml);
}
示例#2
0
static const char *xml_parse_right_lt(ACL_XML *xml, const char *data)
{
	ACL_XML_NODE *node;

	SKIP_SPACE(data);
	if (*data == 0)
		return (NULL);
	if (*data == '/') {
		xml->curr_node->status = ACL_XML_S_RTAG;
		data++;
		return (data);
	} else if ((xml->curr_node->flag & ACL_XML_F_LEAF)) {
		ACL_VSTRING_ADDCH(xml->curr_node->text, '<');
		ACL_VSTRING_ADDCH(xml->curr_node->text, *data);
		ACL_VSTRING_TERMINATE(xml->curr_node->text);
		xml->curr_node->status = ACL_XML_S_TXT;
		data++;
		return (data);
	}

	/* 说明遇到了当前结点的子结点 */

	/* 重新设置当前结点状态,以便于其可以找到 "</" */
	xml->curr_node->status = ACL_XML_S_TXT;

	/* 创建新的子结点,并将其加入至当前结点的子结点集合中 */

	node = acl_xml_node_alloc(xml);
	acl_xml_node_add_child(xml->curr_node, node);
	node->depth = xml->curr_node->depth + 1;
	if (node->depth > xml->depth)
		xml->depth = node->depth;
	xml->curr_node = node;
	xml->curr_node->status = ACL_XML_S_LLT;
	return (data);
}