PUBLIC DomElement* dom_element_create(SvgToken* token){ DomElement* thiz = NULL; ATTR* attr = NULL; Iterator* attr_iter = NULL; return_val_if_fail(token, NULL); thiz = (DomElement*)calloc(1, sizeof(DomElement)); thiz->nodeType = DOM_NODE_TYPE_ELEMENT; thiz->nodeName = copy_string(svg_token_get_data(token)); thiz->nodeValue = NULL; //读取属性信息 //thiz->attributes = attr_dlist_to_dom_attr_list(svg_token_get_attributes(token)); thiz->attributes = svg_token_get_attributes(token); //查找是否有id属性 attr_iter = dlist_iterator_create(thiz->attributes); while(attr = (ATTR*)attr_iter->get(attr_iter)){ if(!_tcscmp(attr->name, _T("id"))){ thiz->id = attr->value;//FIXME:这里没有拷贝 break; } attr_iter->next(attr_iter); } //FIXME:创建子节点链表,这里有待完善 thiz->childNodes = dlist_create(NULL); thiz->tagName = copy_string(svg_token_get_data(token));//FIXME:一些相同的属性是否保留两份副本?如Element的tagName和nodeName return thiz; }
PRIVATE DList* attr_dlist_to_dom_attr_list(DList* attr_list){ DomAttr* dom_attr = NULL; ATTR* attr = NULL; Iterator* attr_iter = NULL; DList* dom_attr_list = NULL; return_val_if_fail(attr_list, NULL); dom_attr_list = dlist_create(NULL);//FIXME attr_iter = dlist_iterator_create(attr_list); while(attr = (ATTR*)attr_iter->get(attr_iter)){ dom_attr = dom_attr_create(attr); dlist_append(dom_attr_list, dom_attr); } return dom_attr_list; }
int main(int argc, char* argv[]) { int i = 0; int n = 101; int last = n - 1; DList* dlist = dlist_create(NULL, NULL); for (i = 0; i < n; i++) { dlist_append(dlist, (void*)i); } Iterator* forward = dlist_iterator_create(dlist); Iterator* backward = dlist_iterator_create(dlist); iterator_advance(backward, last); invert(forward, backward); dlist_foreach(dlist, check_and_dec_int, &last); iterator_destroy(forward); iterator_destroy(backward); dlist_destroy(dlist); return 0; }
PUBLIC DomElement* svg_dom_get_element_by_id(SvgDom* thiz, LPCTSTR id){ DomElement* dom_element = NULL; Iterator* dom_element_iter = NULL; BOOL id_element_found = FALSE; return_val_if_fail(thiz && id, NULL);//FIXME dom_element_iter = dlist_iterator_create(thiz->id_element_list); while(dom_element = (DomElement*)dom_element_iter->get(dom_element_iter)){ if(!_tcscmp(dom_element->id, id)){ id_element_found = TRUE; break; } dom_element_iter->next(dom_element_iter); } dom_element_iter->destroy(dom_element_iter); if(id_element_found){ return dom_element; }else{ return NULL; } }