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

📄 xode_from.c

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 C
字号:
/* * $Id: xode_from.c,v 1.2 2003/06/02 15:42:21 dcm Exp $ * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * *  Jabber *  Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ */#include "xode.h"#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>static void _xode_put_expatattribs(xode current, const char **atts){    int i = 0;    if (atts == NULL) return;    while (atts[i] != '\0')    {        xode_put_attrib(current, atts[i], atts[i+1]);        i += 2;    }}static void _xode_expat_startElement(void* userdata, const char* name, const char** atts){    /* get the xmlnode pointed to by the userdata */    xode *x = userdata;    xode current = *x;    if (current == NULL)    {        /* allocate a base node */        current = xode_new(name);        _xode_put_expatattribs(current, atts);        *x = current;    }    else    {        *x = xode_insert_tag(current, name);        _xode_put_expatattribs(*x, atts);    }}static void _xode_expat_endElement(void* userdata, const char* name){    xode *x = userdata;    xode current = *x;    current->complete = 1;    current = xode_get_parent(current);    /* if it's NULL we've hit the top folks, otherwise back up a level */    if(current != NULL)        *x = current;}static void _xode_expat_charData(void* userdata, const char* s, int len){    xode *x = userdata;    xode current = *x;    xode_insert_cdata(current, s, len);}xode xode_from_str(char *str, int len){    XML_Parser p;    xode *x, node; /* pointer to an xmlnode */    if(NULL == str)        return NULL;    if(len == -1)        len = strlen(str);    x = malloc(sizeof(void *));    *x = NULL; /* pointer to NULL */    p = XML_ParserCreate(NULL);    XML_SetUserData(p, x);    XML_SetElementHandler(p, _xode_expat_startElement, _xode_expat_endElement);    XML_SetCharacterDataHandler(p, _xode_expat_charData);    if(!XML_Parse(p, str, len, 1))    {        /*        jdebug(ZONE,"xmlnode_str_error: %s",(char *)XML_ErrorString(XML_GetErrorCode(p)));*/        xode_free(*x);        *x = NULL;    }    node = *x;    free(x);    XML_ParserFree(p);    return node; /* return the xmlnode x points to */}xode xode_from_strx(char *str, int len, int *err, int *pos){    XML_Parser p;    xode *x, node; /* pointer to an xmlnode */    if(NULL == str)        return NULL;    if(len == -1)        len = strlen(str);    x = malloc(sizeof(void *));    *x = NULL; /* pointer to NULL */    p = XML_ParserCreate(NULL);    XML_SetUserData(p, x);    XML_SetElementHandler(p, _xode_expat_startElement, _xode_expat_endElement);    XML_SetCharacterDataHandler(p, _xode_expat_charData);    XML_Parse(p, str, len, 0);	if(err != NULL)		*err = XML_GetErrorCode(p);	if(pos != NULL)		*pos = XML_GetCurrentByteIndex(p);		    node = *x;    free(x);    XML_ParserFree(p);    	return node; /* return the xmlnode x points to */}xode xode_from_file(char *file){    XML_Parser p;    xode *x, node; /* pointer to an xmlnode */    char buf[BUFSIZ];    int done, fd, len;    char _file[1000];    if(NULL == file)        return NULL;    /* perform tilde expansion */    if(*file == '~')    {        char *env = getenv("HOME");        if(env != NULL)            snprintf((char*)_file, 1000, "%s%s", env, file + 1);        else            snprintf((char*)_file, 1000, "%s", file);    }    else    {        snprintf((char*)_file, 1000, "%s", file);    }    fd = open((char*)&_file,O_RDONLY);    if(fd < 0)        return NULL;    x = malloc(sizeof(void *));    *x = NULL; /* pointer to NULL */    p = XML_ParserCreate(NULL);    XML_SetUserData(p, x);    XML_SetElementHandler(p, _xode_expat_startElement, _xode_expat_endElement);    XML_SetCharacterDataHandler(p, _xode_expat_charData);    do{        len = read(fd, buf, BUFSIZ);        done = len < BUFSIZ;        if(!XML_Parse(p, buf, len, done))        {            /*            jdebug(ZONE,"xmlnode_file_parseerror: %s",(char *)XML_ErrorString(XML_GetErrorCode(p)));*/            xode_free(*x);            *x = NULL;            done = 1;        }    }while(!done);    node = *x;    XML_ParserFree(p);    free(x);    close(fd);    return node; /* return the xmlnode x points to */}int xode_to_file(char *file, xode node){    char *doc;    int fd, i;    char _file[1000];    if(file == NULL || node == NULL)        return -1;    /* perform tilde expansion */    if(*file == '~')    {        char *env = getenv("HOME");        if(env != NULL)            snprintf((char*)_file, 1000, "%s%s", env, file + 1);        else            snprintf((char*)_file, 1000, "%s", file);    }    else    {        snprintf((char*)_file, 1000, "%s", file);    }    fd = open((char*)&_file, O_CREAT | O_WRONLY | O_TRUNC, 0600);    if(fd < 0)        return -1;    doc = xode_to_str(node);    i = write(fd,doc,strlen(doc));    if(i < 0)        return -1;    close(fd);    return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -