diff mcabber/libjabber/expat.c @ 25:bf3d6e241714

[/trunk] Changeset 41 by mikael * Add libjabber to trunk. Let the game begin! :-)
author mikael
date Sun, 27 Mar 2005 20:18:21 +0000
parents
children c3ae9251c197
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mcabber/libjabber/expat.c	Sun Mar 27 20:18:21 2005 +0000
@@ -0,0 +1,161 @@
+/*
+ *  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 <libxode.h>
+
+void expat_startElement(void* userdata, const char* name, const char** atts)
+{
+    /* get the xmlnode pointed to by the userdata */
+    xmlnode *x = userdata;
+    xmlnode current = *x;
+
+    if (current == NULL)
+    {
+        /* allocate a base node */
+        current = xmlnode_new_tag(name);
+        xmlnode_put_expat_attribs(current, atts);
+        *x = current;
+    }
+    else
+    {
+        *x = xmlnode_insert_tag(current, name);
+        xmlnode_put_expat_attribs(*x, atts);
+    }
+}
+
+void expat_endElement(void* userdata, const char* name)
+{
+    xmlnode *x = userdata;
+    xmlnode current = *x;
+
+    current->complete = 1;
+    current = xmlnode_get_parent(current);
+
+    /* if it's NULL we've hit the top folks, otherwise back up a level */
+    if(current != NULL)
+        *x = current;
+}
+
+void expat_charData(void* userdata, const char* s, int len)
+{
+    xmlnode *x = userdata;
+    xmlnode current = *x;
+
+    xmlnode_insert_cdata(current, s, len);
+}
+
+
+xmlnode xmlnode_str(char *str, int len)
+{
+    XML_Parser p;
+    xmlnode *x, node; /* pointer to an xmlnode */
+
+    if(NULL == str)
+        return NULL;
+
+    x = malloc(sizeof(void *));
+
+    *x = NULL; /* pointer to NULL */
+    p = XML_ParserCreate(NULL);
+    XML_SetUserData(p, x);
+    XML_SetElementHandler(p, expat_startElement, expat_endElement);
+    XML_SetCharacterDataHandler(p, expat_charData);
+    if(!XML_Parse(p, str, len, 1))
+    {
+        /*        jdebug(ZONE,"xmlnode_str_error: %s",(char *)XML_ErrorString(XML_GetErrorCode(p)));*/
+        xmlnode_free(*x);
+        *x = NULL;
+    }
+    node = *x;
+    free(x);
+    XML_ParserFree(p);
+    return node; /* return the xmlnode x points to */
+}
+
+xmlnode xmlnode_file(char *file)
+{
+    XML_Parser p;
+    xmlnode *x, node; /* pointer to an xmlnode */
+    char buf[BUFSIZ];
+    int done, fd, len;
+
+    if(NULL == file)
+        return NULL;
+
+    fd = open(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, expat_startElement, expat_endElement);
+    XML_SetCharacterDataHandler(p, 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)));*/
+            xmlnode_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 xmlnode2file(char *file, xmlnode node)
+{
+    char *doc;
+    int fd, i;
+
+    if(file == NULL || node == NULL)
+        return -1;
+
+    fd = open(file, O_CREAT | O_WRONLY | O_TRUNC, 0600);
+    if(fd < 0)
+        return -1;
+
+    doc = xmlnode2str(node);
+    i = write(fd,doc,strlen(doc));
+    if(i < 0)
+        return -1;
+
+    close(fd);
+    return 1;
+}
+
+void xmlnode_put_expat_attribs(xmlnode owner, const char** atts)
+{
+    int i = 0;
+    if (atts == NULL) return;
+    while (atts[i] != '\0')
+    {
+        xmlnode_put_attrib(owner, atts[i], atts[i+1]);
+        i += 2;
+    }
+}