⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xode.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -