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

📄 callback.c

📁 这是一个完全开放的
💻 C
字号:
/* * jabberd - Jabber Open Source Server * Copyright (c) 2002 Jeremie Miller, Thomas Muldowney, *                    Ryan Eatmon, Robert Norris * * 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, MA02111-1307USA */#include "sx.h"/** primary expat callbacks */void _sx_element_start(void *arg, const char *name, const char **atts) {    sx_t s = (sx_t) arg;    char buf[1024];    char *uri, *elem, *prefix;    const char **attr;    int ns;    if(s->fail) return;    /* starting a new nad */    if(s->nad == NULL)        s->nad = nad_new(s->nad_cache);    /* make a copy */    strncpy(buf, name, 1024);    buf[1023] = '\0';    /* expat gives us:         prefixed namespaced elem: uri|elem|prefix          default namespaced elem: uri|elem               un-namespaced elem: elem     */    /* extract all the bits */    uri = buf;    elem = strchr(uri, '|');    if(elem != NULL) {        *elem = '\0';        elem++;        prefix = strchr(elem, '|');        if(prefix != NULL) {            *prefix = '\0';            prefix++;        }        ns = nad_add_namespace(s->nad, uri, prefix);    } else {        /* un-namespaced, just take it as-is */        uri = NULL;        elem = buf;        prefix = NULL;        ns = -1;    }    /* add it */    nad_append_elem(s->nad, ns, elem, s->depth - 1);    /* now the attributes, one at a time */    attr = atts;    while(attr[0] != NULL) {        /* make a copy */        strncpy(buf, attr[0], 1024);        buf[1023] = '\0';        /* extract all the bits */        uri = buf;        elem = strchr(uri, '|');        if(elem != NULL) {            *elem = '\0';            elem++;            prefix = strchr(elem, '|');            if(prefix != NULL) {                *prefix = '\0';                prefix++;            }            ns = nad_add_namespace(s->nad, uri, prefix);        } else {            /* un-namespaced, just take it as-is */            uri = NULL;            elem = buf;            prefix = NULL;            ns = -1;        }        /* add it */        nad_append_attr(s->nad, ns, elem, (char *) attr[1]);        attr += 2;    }    s->depth++;}void _sx_element_end(void *arg, const char *name) {    sx_t s = (sx_t) arg;    if(s->fail) return;    s->depth--;    if(s->depth == 1) {        /* completed nad, save it for later processing */        jqueue_push(s->rnadq, s->nad, 0);        s->nad = NULL;    }    /* close received */    else if(s->depth == 0)        s->depth = -1;}void _sx_cdata(void *arg, const char *str, int len) {    sx_t s = (sx_t) arg;    if(s->fail) return;    /* no nad? no cdata */    if(s->nad == NULL)        return;    /* go */    nad_append_cdata(s->nad, (char *) str, len, s->depth - 1);}void _sx_namespace_start(void *arg, const char *prefix, const char *uri) {    sx_t s = (sx_t) arg;    int ns;    if(s->fail) return;    /* some versions of MSXML send xmlns='' occassionaally. it seems safe to ignore it */    if(uri == NULL) return;    /* starting a new nad */    if(s->nad == NULL)        s->nad = nad_new(s->nad_cache);    ns = nad_add_namespace(s->nad, (char *) uri, (char *) prefix);    /* Always set the namespace (to catch cases where nad_add_namespace doesn't add it) */    s->nad->scope = ns;}

⌨️ 快捷键说明

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