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); }
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); }