📄 xode.c
字号:
attrib = _xode_new(owner->p, name, XODE_TYPE_ATTRIB); owner->firstattrib = attrib; owner->lastattrib = attrib; } else { attrib = _xode_search(owner->firstattrib, name, XODE_TYPE_ATTRIB); if(attrib == NULL) { attrib = _xode_appendsibling(owner->lastattrib, name, XODE_TYPE_ATTRIB); owner->lastattrib = attrib; } } /* Update the value of the attribute */ attrib->data_sz = strlen(value); attrib->data = xode_pool_strdup(owner->p, value);}char* xode_get_attrib(xode owner, const char* name){ xode attrib; if (owner != NULL && owner->firstattrib != NULL) { attrib = _xode_search(owner->firstattrib, name, XODE_TYPE_ATTRIB); if (attrib != NULL) return (char*)attrib->data; } return NULL;}void xode_put_vattrib(xode owner, const char* name, void *value){ xode attrib; if (owner != NULL) { attrib = _xode_search(owner->firstattrib, name, XODE_TYPE_ATTRIB); if (attrib == NULL) { xode_put_attrib(owner, name, ""); attrib = _xode_search(owner->firstattrib, name, XODE_TYPE_ATTRIB); } if (attrib != NULL) attrib->firstchild = (xode)value; }}void* xode_get_vattrib(xode owner, const char* name){ xode attrib; if (owner != NULL && owner->firstattrib != NULL) { attrib = _xode_search(owner->firstattrib, name, XODE_TYPE_ATTRIB); if (attrib != NULL) return (void*)attrib->firstchild; } return NULL;}xode xode_get_firstattrib(xode parent){ if (parent != NULL) return parent->firstattrib; return NULL;}xode xode_get_firstchild(xode parent){ if (parent != NULL) return parent->firstchild; return NULL;}xode xode_get_lastchild(xode parent){ if (parent != NULL) return parent->lastchild; return NULL;}xode xode_get_nextsibling(xode sibling){ if (sibling != NULL) return sibling->next; return NULL;}xode xode_get_prevsibling(xode sibling){ if (sibling != NULL) return sibling->prev; return NULL;}xode xode_get_parent(xode node){ if (node != NULL) return node->parent; return NULL;}char* xode_get_name(xode node){ if (node != NULL) return node->name; return NULL;}char* xode_get_data(xode node){ xode cur; if(node == NULL) return NULL; if(xode_get_type(node) == XODE_TYPE_TAG) /* loop till we find a CDATA */ { for(cur = xode_get_firstchild(node); cur != NULL; cur = xode_get_nextsibling(cur)) if(xode_get_type(cur) == XODE_TYPE_CDATA) return cur->data; }else{ return node->data; } return NULL;}int xode_get_datasz(xode node){ if( node == NULL ) { return (int)NULL; } else if(xode_get_type(node) == XODE_TYPE_TAG) /* loop till we find a CDATA */ { xode cur; for(cur = xode_get_firstchild(node); cur != NULL; cur = xode_get_nextsibling(cur)) if(xode_get_type(cur) == XODE_TYPE_CDATA) return cur->data_sz; }else{ return node->data_sz; } return (int)NULL;}int xode_get_type(xode node){ if (node != NULL) { return node->type; } return (int)NULL;}int xode_has_children(xode node){ if ((node != NULL) && (node->firstchild != NULL)) return 1; return 0;}int xode_has_attribs(xode node){ if ((node != NULL) && (node->firstattrib != NULL)) return 1; return 0;}xode_pool xode_get_pool(xode node){ if (node != NULL) return node->p; return (xode_pool)NULL;}void xode_hide(xode child){ xode parent; if(child == NULL || child->parent == NULL) return; parent = child->parent; /* first fix up at the child level */ _xode_hidesibling(child); /* next fix up at the parent level */ if(parent->firstchild == child) parent->firstchild = child->next; if(parent->lastchild == child) parent->lastchild = child->prev;}void xode_hide_attrib(xode parent, const char *name){ xode attrib; if(parent == NULL || parent->firstattrib == NULL || name == NULL) return; attrib = _xode_search(parent->firstattrib, name, XODE_TYPE_ATTRIB); if(attrib == NULL) return; /* first fix up at the child level */ _xode_hidesibling(attrib); /* next fix up at the parent level */ if(parent->firstattrib == attrib) parent->firstattrib = attrib->next; if(parent->lastattrib == attrib) parent->lastattrib = attrib->prev;}/* * xode2str -- convert given xode tree into a string * * parameters * node -- pointer to the xode structure * * results * a pointer to the created string * or NULL if it was unsuccessful */char *xode_to_str(xode node){ return xode_spool_tostr(_xode_tospool(node));}/* loop through both a and b comparing everything, attribs, cdata, children, etc */int xode_cmp(xode a, xode b){ int ret = 0; while(1) { if(a == NULL && b == NULL) return 0; if(a == NULL || b == NULL) return -1; if(xode_get_type(a) != xode_get_type(b)) return -1; switch(xode_get_type(a)) { case XODE_TYPE_ATTRIB: ret = _xode_strcmp(xode_get_name(a), xode_get_name(b)); if(ret != 0) return -1; ret = _xode_strcmp(xode_get_data(a), xode_get_data(b)); if(ret != 0) return -1; break; case XODE_TYPE_TAG: ret = _xode_strcmp(xode_get_name(a), xode_get_name(b)); if(ret != 0) return -1; ret = xode_cmp(xode_get_firstattrib(a), xode_get_firstattrib(b)); if(ret != 0) return -1; ret = xode_cmp(xode_get_firstchild(a), xode_get_firstchild(b)); if(ret != 0) return -1; break; case XODE_TYPE_CDATA: ret = _xode_strcmp(xode_get_data(a), xode_get_data(b)); if(ret != 0) return -1; } a = xode_get_nextsibling(a); b = xode_get_nextsibling(b); }}xode xode_insert_tagnode(xode parent, xode node){ xode child; child = xode_insert_tag(parent, xode_get_name(node)); if (xode_has_attribs(node)) xode_insert_node(child, xode_get_firstattrib(node)); if (xode_has_children(node)) xode_insert_node(child, xode_get_firstchild(node)); return child;}/* places copy of node and node's siblings in parent */void xode_insert_node(xode parent, xode node){ if(node == NULL || parent == NULL) return; while(node != NULL) { switch(xode_get_type(node)) { case XODE_TYPE_ATTRIB: xode_put_attrib(parent, xode_get_name(node), xode_get_data(node)); break; case XODE_TYPE_TAG: xode_insert_tagnode(parent, node); break; case XODE_TYPE_CDATA: xode_insert_cdata(parent, xode_get_data(node), xode_get_datasz(node)); } node = xode_get_nextsibling(node); }}/* produce full duplicate of x with a new xode_pool, x must be a tag! */xode xode_dup(xode x){ xode x2; if(x == NULL) return NULL; x2 = xode_new(xode_get_name(x)); if (xode_has_attribs(x)) xode_insert_node(x2, xode_get_firstattrib(x)); if (xode_has_children(x)) xode_insert_node(x2, xode_get_firstchild(x)); return x2;}xode xode_dup_frompool(xode_pool p, xode x){ xode x2; if(x == NULL) return NULL; x2 = xode_new_frompool(p, xode_get_name(x)); if (xode_has_attribs(x)) xode_insert_node(x2, xode_get_firstattrib(x)); if (xode_has_children(x)) xode_insert_node(x2, xode_get_firstchild(x)); return x2;}xode xode_wrap(xode x,const char *wrapper){ xode wrap; if(x==NULL||wrapper==NULL) return NULL; wrap=xode_new_frompool(xode_get_pool(x),wrapper); if(wrap==NULL) return NULL; wrap->firstchild=x; wrap->lastchild=x; x->parent=wrap; return wrap;}void xode_free(xode node){ if(node == NULL) return; xode_pool_free(node->p);}void_xode_to_prettystr( xode_spool s, xode x, int deep ){ int i; xode y; if(xode_get_type(x) != XODE_TYPE_TAG) return; for(i=0; i<deep; i++) xode_spool_add(s, "\t"); xode_spooler( s , "<" , xode_get_name(x) , s ); y = xode_get_firstattrib(x); while( y ) { xode_spooler( s , " " , xode_get_name(y) , "='", xode_get_data(y) , "'" , s ); y = xode_get_nextsibling( y ); } xode_spool_add(s,">"); xode_spool_add(s,"\n"); if( xode_get_data(x)) { for(i=0; i<=deep; i++) xode_spool_add(s, "\t"); xode_spool_add( s , xode_get_data(x)); } y = xode_get_firstchild(x); while( y ) { _xode_to_prettystr(s , y, deep+1); y = xode_get_nextsibling(y); xode_spool_add(s,"\n"); } for(i=0; i<deep; i++) xode_spool_add(s, "\t"); xode_spooler( s , "</" , xode_get_name(x) , ">" , s ); return;}char * xode_to_prettystr( xode x ){ xode_spool s; if( !x) return NULL; s = xode_spool_newfrompool( xode_get_pool(x)); _xode_to_prettystr( s , x, 0 ); return xode_spool_tostr(s);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -