Exemple #1
0
static ACL_XML_NODE *xml_iter_prev(ACL_ITER *it, ACL_XML *xml)
{
    ACL_RING *ring_ptr;
    struct ACL_XML_NODE *node, *parent;

    node = (struct ACL_XML_NODE*) it->data;

    /* 先遍历当前结点的子结点 */

    ring_ptr = acl_ring_pred(&node->children);
    if (ring_ptr != &node->children) {
        it->i++;
        it->ptr = acl_ring_to_appl(ring_ptr, ACL_XML_NODE, node);
        it->data = it->ptr;
        return (it->ptr);
    }

    /* 当前结点的子结点遍历完毕,再遍历当前结点的兄弟结点 */

    parent = acl_xml_node_parent(node);
    ring_ptr = acl_ring_pred(&node->node);
    if (ring_ptr != &parent->children) {
        it->i++;
        it->ptr = acl_ring_to_appl(ring_ptr, ACL_XML_NODE, node);
        it->data = it->ptr;
        return (it->ptr);
    }

    /* 当前结点的兄弟结点遍历完毕,最后遍历当前结点的父结点的兄弟结点 */

    do {
        if (parent == xml->root)
            break;
        ring_ptr = acl_ring_pred(&parent->node);
        parent = acl_xml_node_parent(parent);
        if (parent == NULL)
            acl_msg_fatal("%s(%d): parent null", __FILE__, __LINE__);

        if (ring_ptr != &parent->children) {
            it->i++;
            it->ptr = acl_ring_to_appl(ring_ptr, ACL_XML_NODE, node);
            it->data = it->ptr;
            return (it->ptr);
        }
    } while (ring_ptr != &xml->root->children);

    /* 遍历完所有结点 */

    it->ptr = it->data = NULL;
    return (NULL);
}
Exemple #2
0
static const char *xml_parse_right_gt(ACL_XML *xml, const char *data)
{
	xml->curr_node = acl_xml_node_parent(xml->curr_node);
	if (xml->curr_node == xml->root) {
		xml->curr_node = NULL;
	}
	return (data);
}
Exemple #3
0
static const char *xml_parse_text(ACL_XML *xml, const char *data)
{
	int   ch;

	if (LEN(xml->curr_node->text) == 0) {
		SKIP_SPACE(data);
		if (*data == 0)
			return (NULL);
	}

	while ((ch = *data) != 0) {
		if (ch == '<') {
			xml->curr_node->status = ACL_XML_S_RLT;
			data++;
			break;
		}
		ACL_VSTRING_ADDCH(xml->curr_node->text, ch);
		data++;
	}

	ACL_VSTRING_TERMINATE(xml->curr_node->text);

	if (xml->curr_node->status != ACL_XML_S_RLT)
		return (data);

	if ((xml->curr_node->flag & ACL_XML_F_SELF_CL)) {
		/* 如果该标签是自关闭类型,则应使父结点直接跳至右边 '/' 处理位置,
		 * 同时使本结点跳至右边 '>' 处理位置
		 */
		ACL_XML_NODE *parent = acl_xml_node_parent(xml->curr_node);
		if (parent != xml->root)
			parent->status = ACL_XML_S_RLT;
		xml->curr_node->status = ACL_XML_S_RGT;
	}

	if (LEN(xml->curr_node->text) == 0)
		return (data);

	return (data);
}