mcabber/libjabber/xmlnode.c
author Mikael Berthe <mikael@lilotux.net>
Mon, 06 Mar 2006 12:27:00 +0100
changeset 731 f30031cdb56b
parent 417 c3ae9251c197
child 879 5f43b532cc37
permissions -rw-r--r--
Outgoing messages (color_highlight) default to cyan
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     1
/*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     2
 *  This program is free software; you can redistribute it and/or modify
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     3
 *  it under the terms of the GNU General Public License as published by
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     4
 *  the Free Software Foundation; either version 2 of the License, or
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     5
 *  (at your option) any later version.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     6
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     7
 *  This program is distributed in the hope that it will be useful,
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     8
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
     9
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    10
 *  GNU General Public License for more details.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    11
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    12
 *  You should have received a copy of the GNU General Public License
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    13
 *  along with this program; if not, write to the Free Software
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    14
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    15
 *
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    16
 * Copyrights
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    17
 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    18
 * Portions created by or assigned to Jabber.com, Inc. are
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    19
 * Copyright (c) 1999-2002 Jabber.com, Inc.  All Rights Reserved.  Contact
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    20
 * information for Jabber.com, Inc. is available at http://www.jabber.com/.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    21
 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    22
 * Portions Copyright (c) 1998-1999 Jeremie Miller.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    23
 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    24
 * Acknowledgements
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    25
 *
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    26
 * Special thanks to the Jabber Open Source Contributors for their
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    27
 * suggestions and support of Jabber.
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    28
 *
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    29
 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    30
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    31
#include "libxode.h"
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    32
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    33
/* Internal routines */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    34
xmlnode _xmlnode_new(pool p, const char* name, unsigned int type)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    35
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    36
    xmlnode result = NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    37
    if (type > NTYPE_LAST)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    38
        return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    39
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    40
    if (type != NTYPE_CDATA && name == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    41
        return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    42
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    43
    if (p == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    44
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    45
        p = pool_heap(1*1024);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    46
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    47
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    48
    /* Allocate & zero memory */
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    49
    result = (xmlnode)pmalloco(p, sizeof(_xmlnode));
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    50
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    51
    /* Initialize fields */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    52
    if (type != NTYPE_CDATA)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    53
        result->name = pstrdup(p,name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    54
    result->type = type;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    55
    result->p = p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    56
    return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    57
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    58
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    59
static xmlnode _xmlnode_append_sibling(xmlnode lastsibling, const char* name, unsigned int type)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    60
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    61
    xmlnode result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    62
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    63
    result = _xmlnode_new(xmlnode_pool(lastsibling), name, type);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    64
    if (result != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    65
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    66
        /* Setup sibling pointers */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    67
        result->prev = lastsibling;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    68
        lastsibling->next = result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    69
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    70
    return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    71
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    72
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    73
static xmlnode _xmlnode_insert(xmlnode parent, const char* name, unsigned int type)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    74
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    75
    xmlnode result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    76
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
    77
    if(parent == NULL || (type != NTYPE_CDATA && name == NULL)) return NULL;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    78
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    79
    /* If parent->firstchild is NULL, simply create a new node for the first child */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    80
    if (parent->firstchild == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    81
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    82
        result = _xmlnode_new(parent->p, name, type);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    83
        parent->firstchild = result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    84
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    85
    /* Otherwise, append this to the lastchild */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    86
    else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    87
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    88
        result= _xmlnode_append_sibling(parent->lastchild, name, type);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    89
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    90
    result->parent = parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    91
    parent->lastchild = result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    92
    return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    93
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    94
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    95
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    96
static xmlnode _xmlnode_search(xmlnode firstsibling, const char* name, unsigned int type)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    97
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    98
    xmlnode current;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
    99
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   100
    /* Walk the sibling list, looking for a NTYPE_TAG xmlnode with
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   101
    the specified name */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   102
    current = firstsibling;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   103
    while (current != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   104
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   105
        if ((current->type == type) && (j_strcmp(current->name, name) == 0))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   106
            return current;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   107
        else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   108
            current = current->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   109
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   110
    return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   111
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   112
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   113
void _xmlnode_merge(xmlnode data)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   114
{
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   115
    xmlnode cur;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   116
    char *merge, *scur;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   117
    int imerge;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   118
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   119
    /* get total size of all merged cdata */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   120
    imerge = 0;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   121
    for(cur = data; cur != NULL && cur->type == NTYPE_CDATA; cur = cur->next)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   122
        imerge += cur->data_sz;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   123
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   124
    /* copy in current data and then spin through all of them and merge */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   125
    scur = merge = pmalloc(data->p,imerge + 1);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   126
    for(cur = data; cur != NULL && cur->type == NTYPE_CDATA; cur = cur->next)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   127
    {
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   128
        memcpy(scur,cur->data,cur->data_sz);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   129
        scur += cur->data_sz;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   130
    }
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   131
    *scur = '\0';
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   132
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   133
    /* this effectively hides all of the merged-in chunks */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   134
    data->next = cur;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   135
    if(cur == NULL)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   136
        data->parent->lastchild = data;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   137
    else
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   138
        cur->prev = data;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   139
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   140
    /* reset data */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   141
    data->data = merge;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   142
    data->data_sz = imerge;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   143
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   144
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   145
static void _xmlnode_hide_sibling(xmlnode child)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   146
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   147
    if(child == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   148
        return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   149
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   150
    if(child->prev != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   151
        child->prev->next = child->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   152
    if(child->next != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   153
        child->next->prev = child->prev;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   154
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   155
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   156
void _xmlnode_tag2str(spool s, xmlnode node, int flag)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   157
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   158
    xmlnode tmp;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   159
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   160
    if(flag==0 || flag==1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   161
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   162
	    spooler(s,"<",xmlnode_get_name(node),s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   163
	    tmp = xmlnode_get_firstattrib(node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   164
	    while(tmp) {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   165
	        spooler(s," ",xmlnode_get_name(tmp),"='",strescape(xmlnode_pool(node),xmlnode_get_data(tmp)),"'",s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   166
	        tmp = xmlnode_get_nextsibling(tmp);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   167
	    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   168
	    if(flag==0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   169
	        spool_add(s,"/>");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   170
	    else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   171
	        spool_add(s,">");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   172
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   173
    else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   174
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   175
	    spooler(s,"</",xmlnode_get_name(node),">",s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   176
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   177
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   178
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   179
spool _xmlnode2spool(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   180
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   181
    spool s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   182
    int level=0,dir=0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   183
    xmlnode tmp;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   184
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   185
    if(!node || xmlnode_get_type(node)!=NTYPE_TAG)
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   186
        return NULL;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   187
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   188
    s = spool_new(xmlnode_pool(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   189
    if(!s) return(NULL);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   190
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   191
    while(1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   192
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   193
        if(dir==0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   194
        {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   195
            if(xmlnode_get_type(node) == NTYPE_TAG)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   196
            {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   197
                if(xmlnode_has_children(node))
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   198
                {
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   199
                    _xmlnode_tag2str(s,node,1);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   200
                    node = xmlnode_get_firstchild(node);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   201
                    level++;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   202
                    continue;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   203
                }else{
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   204
                    _xmlnode_tag2str(s,node,0);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   205
                }
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   206
            }else{
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   207
                spool_add(s,strescape(xmlnode_pool(node),xmlnode_get_data(node)));
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   208
            }
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   209
        }
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   210
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   211
        tmp = xmlnode_get_nextsibling(node);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   212
        if(!tmp)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   213
        {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   214
            node = xmlnode_get_parent(node);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   215
            level--;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   216
            if(level>=0) _xmlnode_tag2str(s,node,2);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   217
            if(level<1) break;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   218
            dir = 1;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   219
        }else{
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   220
            node = tmp;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   221
            dir = 0;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   222
        }
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   223
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   224
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   225
    return s;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   226
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   227
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   228
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   229
/* External routines */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   230
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   231
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   232
/*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   233
 *  xmlnode_new_tag -- create a tag node
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   234
 *  Automatically creates a memory pool for the node.
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   235
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   236
 *  parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   237
 *      name -- name of the tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   238
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   239
 *  returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   240
 *      a pointer to the tag node
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   241
 *      or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   242
 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   243
xmlnode xmlnode_new_tag(const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   244
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   245
    return _xmlnode_new(NULL, name, NTYPE_TAG);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   246
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   247
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   248
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   249
/*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   250
 *  xmlnode_new_tag_pool -- create a tag node within given pool
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   251
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   252
 *  parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   253
 *      p -- previously created memory pool
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   254
 *      name -- name of the tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   255
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   256
 *  returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   257
 *      a pointer to the tag node
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   258
 *      or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   259
 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   260
xmlnode xmlnode_new_tag_pool(pool p, const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   261
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   262
    return _xmlnode_new(p, name, NTYPE_TAG);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   263
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   264
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   265
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   266
/*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   267
 *  xmlnode_insert_tag -- append a child tag to a tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   268
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   269
 *  parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   270
 *      parent -- pointer to the parent tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   271
 *      name -- name of the child tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   272
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   273
 *  returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   274
 *      a pointer to the child tag node
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   275
 *      or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   276
 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   277
xmlnode xmlnode_insert_tag(xmlnode parent, const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   278
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   279
    return _xmlnode_insert(parent, name, NTYPE_TAG);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   280
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   281
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   282
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   283
/*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   284
 *  xmlnode_insert_cdata -- append character data to a tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   285
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   286
 *  parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   287
 *      parent -- parent tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   288
 *      CDATA -- character data
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   289
 *      size -- size of CDATA
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   290
 *              or -1 for null-terminated CDATA strings
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   291
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   292
 *  returns
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   293
 *      a pointer to the child CDATA node
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   294
 *      or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   295
 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   296
xmlnode xmlnode_insert_cdata(xmlnode parent, const char* CDATA, unsigned int size)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   297
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   298
    xmlnode result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   299
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   300
    if(CDATA == NULL || parent == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   301
        return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   302
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   303
    if(size == -1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   304
        size = strlen(CDATA);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   305
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   306
    result = _xmlnode_insert(parent, NULL, NTYPE_CDATA);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   307
    if (result != NULL)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   308
    {
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   309
        result->data = (char*)pmalloc(result->p, size + 1);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   310
        memcpy(result->data, CDATA, size);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   311
        result->data[size] = '\0';
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   312
        result->data_sz = size;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   313
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   314
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   315
    return result;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   316
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   317
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   318
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   319
/*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   320
 *  xmlnode_get_tag -- find given tag in an xmlnode tree
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   321
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   322
 *  parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   323
 *      parent -- pointer to the parent tag
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   324
 *      name -- "name" for the child tag of that name
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   325
 *              "name/name" for a sub child (recurses)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   326
 *              "?attrib" to match the first tag with that attrib defined
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   327
 *              "?attrib=value" to match the first tag with that attrib and value
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   328
 *              "=cdata" to match the cdata contents of the child
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   329
 *              or any combination: "name/name/?attrib", "name=cdata", etc
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   330
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   331
 *  results
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   332
 *      a pointer to the tag matching search criteria
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   333
 *      or NULL if search was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   334
 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   335
xmlnode xmlnode_get_tag(xmlnode parent, const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   336
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   337
    char *str, *slash, *qmark, *equals;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   338
    xmlnode step, ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   339
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   340
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   341
    if(parent == NULL || parent->firstchild == NULL || name == NULL || name == '\0') return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   342
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   343
    if(strstr(name, "/") == NULL && strstr(name,"?") == NULL && strstr(name, "=") == NULL)
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   344
        return _xmlnode_search(parent->firstchild, name, NTYPE_TAG);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   345
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   346
    str = strdup(name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   347
    slash = strstr(str, "/");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   348
    qmark = strstr(str, "?");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   349
    equals = strstr(str, "=");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   350
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   351
    if(equals != NULL && (slash == NULL || equals < slash) && (qmark == NULL || equals < qmark))
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   352
    { /* of type =cdata */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   353
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   354
        *equals = '\0';
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   355
        equals++;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   356
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   357
        for(step = parent->firstchild; step != NULL; step = xmlnode_get_nextsibling(step))
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   358
        {
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   359
            if(xmlnode_get_type(step) != NTYPE_TAG)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   360
                continue;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   361
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   362
            if(*str != '\0')
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   363
                if(j_strcmp(xmlnode_get_name(step),str) != 0)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   364
                    continue;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   365
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   366
            if(j_strcmp(xmlnode_get_data(step),equals) != 0)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   367
                continue;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   368
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   369
            break;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   370
        }
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   371
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   372
        free(str);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   373
        return step;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   374
    }
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   375
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   376
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   377
    if(qmark != NULL && (slash == NULL || qmark < slash))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   378
    { /* of type ?attrib */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   379
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   380
        *qmark = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   381
        qmark++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   382
        if(equals != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   383
        {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   384
            *equals = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   385
            equals++;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   386
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   387
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   388
        for(step = parent->firstchild; step != NULL; step = xmlnode_get_nextsibling(step))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   389
        {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   390
            if(xmlnode_get_type(step) != NTYPE_TAG)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   391
                continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   392
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   393
            if(*str != '\0')
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   394
                if(j_strcmp(xmlnode_get_name(step),str) != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   395
                    continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   396
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   397
            if(xmlnode_get_attrib(step,qmark) == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   398
                continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   399
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   400
            if(equals != NULL && j_strcmp(xmlnode_get_attrib(step,qmark),equals) != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   401
                continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   402
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   403
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   404
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   405
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   406
        free(str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   407
        return step;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   408
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   409
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   410
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   411
    *slash = '\0';
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   412
    ++slash;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   413
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   414
    for(step = parent->firstchild; step != NULL; step = xmlnode_get_nextsibling(step))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   415
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   416
        if(xmlnode_get_type(step) != NTYPE_TAG) continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   417
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   418
        if(j_strcmp(xmlnode_get_name(step),str) != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   419
            continue;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   420
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   421
        ret = xmlnode_get_tag(step, slash);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   422
        if(ret != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   423
        {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   424
            free(str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   425
            return ret;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   426
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   427
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   428
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   429
    free(str);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   430
    return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   431
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   432
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   433
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   434
/* return the cdata from any tag */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   435
char *xmlnode_get_tag_data(xmlnode parent, const char *name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   436
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   437
    xmlnode tag;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   438
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   439
    tag = xmlnode_get_tag(parent, name);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   440
    if(tag == NULL) return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   441
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   442
    return xmlnode_get_data(tag);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   443
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   444
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   445
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   446
void xmlnode_put_attrib(xmlnode owner, const char* name, const char* value)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   447
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   448
    xmlnode attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   449
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   450
    if(owner == NULL || name == NULL || value == NULL) return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   451
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   452
    /* If there are no existing attributs, allocate a new one to start
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   453
    the list */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   454
    if (owner->firstattrib == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   455
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   456
        attrib = _xmlnode_new(owner->p, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   457
        owner->firstattrib = attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   458
        owner->lastattrib  = attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   459
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   460
    else
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   461
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   462
        attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   463
        if(attrib == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   464
        {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   465
            attrib = _xmlnode_append_sibling(owner->lastattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   466
            owner->lastattrib = attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   467
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   468
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   469
    /* Update the value of the attribute */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   470
    attrib->data_sz = strlen(value);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   471
    attrib->data    = pstrdup(owner->p, value);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   472
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   473
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   474
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   475
char* xmlnode_get_attrib(xmlnode owner, const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   476
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   477
    xmlnode attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   478
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   479
    if (owner != NULL && owner->firstattrib != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   480
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   481
        attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   482
        if (attrib != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   483
            return (char*)attrib->data;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   484
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   485
    return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   486
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   487
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   488
void xmlnode_put_vattrib(xmlnode owner, const char* name, void *value)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   489
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   490
    xmlnode attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   491
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   492
    if (owner != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   493
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   494
        attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   495
        if (attrib == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   496
        {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   497
            xmlnode_put_attrib(owner, name, "");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   498
            attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   499
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   500
        if (attrib != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   501
            attrib->firstchild = (xmlnode)value;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   502
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   503
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   504
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   505
void* xmlnode_get_vattrib(xmlnode owner, const char* name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   506
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   507
    xmlnode attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   508
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   509
    if (owner != NULL && owner->firstattrib != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   510
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   511
        attrib = _xmlnode_search(owner->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   512
        if (attrib != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   513
            return (void*)attrib->firstchild;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   514
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   515
    return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   516
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   517
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   518
xmlnode xmlnode_get_firstattrib(xmlnode parent)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   519
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   520
    if (parent != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   521
        return parent->firstattrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   522
    return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   523
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   524
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   525
xmlnode xmlnode_get_firstchild(xmlnode parent)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   526
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   527
    if (parent != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   528
        return parent->firstchild;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   529
    return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   530
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   531
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   532
xmlnode xmlnode_get_lastchild(xmlnode parent)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   533
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   534
    if (parent != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   535
        return parent->lastchild;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   536
    return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   537
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   538
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   539
xmlnode xmlnode_get_nextsibling(xmlnode sibling)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   540
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   541
    if (sibling != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   542
        return sibling->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   543
    return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   544
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   545
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   546
xmlnode xmlnode_get_prevsibling(xmlnode sibling)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   547
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   548
    if (sibling != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   549
        return sibling->prev;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   550
    return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   551
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   552
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   553
xmlnode xmlnode_get_parent(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   554
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   555
    if (node != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   556
        return node->parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   557
    return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   558
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   559
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   560
char* xmlnode_get_name(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   561
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   562
    if (node != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   563
        return node->name;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   564
    return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   565
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   566
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   567
char* xmlnode_get_data(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   568
{
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   569
    if(xmlnode_get_type(node) == NTYPE_TAG) /* loop till we find a CDATA in the children */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   570
        for(node = xmlnode_get_firstchild(node); node != NULL; node = xmlnode_get_nextsibling(node))
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   571
            if(xmlnode_get_type(node) == NTYPE_CDATA) break;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   572
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   573
    if(node == NULL) return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   574
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   575
    /* check for a dirty node w/ unassembled cdata chunks */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   576
    if(xmlnode_get_type(node->next) == NTYPE_CDATA)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   577
        _xmlnode_merge(node);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   578
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   579
    return node->data;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   580
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   581
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   582
int xmlnode_get_datasz(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   583
{
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   584
    if(xmlnode_get_type(node) != NTYPE_CDATA) return 0;
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   585
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   586
    /* check for a dirty node w/ unassembled cdata chunks */
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   587
    if(xmlnode_get_type(node->next) == NTYPE_CDATA)
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   588
        _xmlnode_merge(node);
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   589
    return node->data_sz;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   590
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   591
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   592
int xmlnode_get_type(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   593
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   594
    if (node != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   595
        return node->type;
417
c3ae9251c197 Sync libjabber with upstream
Mikael Berthe <mikael@lilotux.net>
parents: 25
diff changeset
   596
    return NTYPE_UNDEF;
25
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   597
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   598
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   599
int xmlnode_has_children(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   600
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   601
    if ((node != NULL) && (node->firstchild != NULL))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   602
        return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   603
    return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   604
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   605
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   606
int xmlnode_has_attribs(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   607
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   608
    if ((node != NULL) && (node->firstattrib != NULL))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   609
        return 1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   610
    return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   611
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   612
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   613
pool xmlnode_pool(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   614
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   615
    if (node != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   616
        return node->p;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   617
    return (pool)NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   618
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   619
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   620
void xmlnode_hide(xmlnode child)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   621
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   622
    xmlnode parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   623
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   624
    if(child == NULL || child->parent == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   625
        return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   626
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   627
    parent = child->parent;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   628
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   629
    /* first fix up at the child level */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   630
    _xmlnode_hide_sibling(child);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   631
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   632
    /* next fix up at the parent level */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   633
    if(parent->firstchild == child)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   634
        parent->firstchild = child->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   635
    if(parent->lastchild == child)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   636
        parent->lastchild = child->prev;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   637
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   638
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   639
void xmlnode_hide_attrib(xmlnode parent, const char *name)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   640
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   641
    xmlnode attrib;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   642
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   643
    if(parent == NULL || parent->firstattrib == NULL || name == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   644
        return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   645
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   646
    attrib = _xmlnode_search(parent->firstattrib, name, NTYPE_ATTRIB);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   647
    if(attrib == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   648
        return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   649
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   650
    /* first fix up at the child level */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   651
    _xmlnode_hide_sibling(attrib);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   652
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   653
    /* next fix up at the parent level */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   654
    if(parent->firstattrib == attrib)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   655
        parent->firstattrib = attrib->next;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   656
    if(parent->lastattrib == attrib)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   657
        parent->lastattrib = attrib->prev;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   658
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   659
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   660
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   661
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   662
/*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   663
 *  xmlnode2str -- convert given xmlnode tree into a string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   664
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   665
 *  parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   666
 *      node -- pointer to the xmlnode structure
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   667
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   668
 *  results
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   669
 *      a pointer to the created string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   670
 *      or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   671
 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   672
char *xmlnode2str(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   673
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   674
     return spool_print(_xmlnode2spool(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   675
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   676
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   677
/*
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   678
 *  xmlnode2tstr -- convert given xmlnode tree into a newline terminated string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   679
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   680
 *  parameters
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   681
 *      node -- pointer to the xmlnode structure
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   682
 *
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   683
 *  results
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   684
 *      a pointer to the created string
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   685
 *      or NULL if it was unsuccessfull
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   686
 */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   687
char*    xmlnode2tstr(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   688
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   689
     spool s = _xmlnode2spool(node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   690
     if (s != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   691
	  spool_add(s, "\n");
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   692
    return spool_print(s);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   693
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   694
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   695
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   696
/* loop through both a and b comparing everything, attribs, cdata, children, etc */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   697
int xmlnode_cmp(xmlnode a, xmlnode b)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   698
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   699
    int ret = 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   700
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   701
    while(1)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   702
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   703
        if(a == NULL && b == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   704
            return 0;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   705
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   706
        if(a == NULL || b == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   707
            return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   708
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   709
        if(xmlnode_get_type(a) != xmlnode_get_type(b))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   710
            return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   711
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   712
        switch(xmlnode_get_type(a))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   713
        {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   714
        case NTYPE_ATTRIB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   715
            ret = j_strcmp(xmlnode_get_name(a), xmlnode_get_name(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   716
            if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   717
                return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   718
            ret = j_strcmp(xmlnode_get_data(a), xmlnode_get_data(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   719
            if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   720
                return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   721
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   722
        case NTYPE_TAG:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   723
            ret = j_strcmp(xmlnode_get_name(a), xmlnode_get_name(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   724
            if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   725
                return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   726
            ret = xmlnode_cmp(xmlnode_get_firstattrib(a), xmlnode_get_firstattrib(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   727
            if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   728
                return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   729
            ret = xmlnode_cmp(xmlnode_get_firstchild(a), xmlnode_get_firstchild(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   730
            if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   731
                return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   732
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   733
        case NTYPE_CDATA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   734
            ret = j_strcmp(xmlnode_get_data(a), xmlnode_get_data(b));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   735
            if(ret != 0)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   736
                return -1;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   737
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   738
        a = xmlnode_get_nextsibling(a);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   739
        b = xmlnode_get_nextsibling(b);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   740
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   741
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   742
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   743
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   744
xmlnode xmlnode_insert_tag_node(xmlnode parent, xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   745
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   746
    xmlnode child;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   747
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   748
    child = xmlnode_insert_tag(parent, xmlnode_get_name(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   749
    if (xmlnode_has_attribs(node))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   750
        xmlnode_insert_node(child, xmlnode_get_firstattrib(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   751
    if (xmlnode_has_children(node))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   752
        xmlnode_insert_node(child, xmlnode_get_firstchild(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   753
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   754
    return child;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   755
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   756
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   757
/* places copy of node and node's siblings in parent */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   758
void xmlnode_insert_node(xmlnode parent, xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   759
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   760
    if(node == NULL || parent == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   761
        return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   762
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   763
    while(node != NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   764
    {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   765
        switch(xmlnode_get_type(node))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   766
        {
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   767
        case NTYPE_ATTRIB:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   768
            xmlnode_put_attrib(parent, xmlnode_get_name(node), xmlnode_get_data(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   769
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   770
        case NTYPE_TAG:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   771
            xmlnode_insert_tag_node(parent, node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   772
            break;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   773
        case NTYPE_CDATA:
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   774
            xmlnode_insert_cdata(parent, xmlnode_get_data(node), xmlnode_get_datasz(node));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   775
        }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   776
        node = xmlnode_get_nextsibling(node);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   777
    }
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   778
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   779
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   780
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   781
/* produce full duplicate of x with a new pool, x must be a tag! */
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   782
xmlnode xmlnode_dup(xmlnode x)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   783
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   784
    xmlnode x2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   785
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   786
    if(x == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   787
        return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   788
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   789
    x2 = xmlnode_new_tag(xmlnode_get_name(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   790
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   791
    if (xmlnode_has_attribs(x))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   792
        xmlnode_insert_node(x2, xmlnode_get_firstattrib(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   793
    if (xmlnode_has_children(x))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   794
        xmlnode_insert_node(x2, xmlnode_get_firstchild(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   795
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   796
    return x2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   797
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   798
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   799
xmlnode xmlnode_dup_pool(pool p, xmlnode x)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   800
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   801
    xmlnode x2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   802
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   803
    if(x == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   804
        return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   805
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   806
    x2 = xmlnode_new_tag_pool(p, xmlnode_get_name(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   807
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   808
    if (xmlnode_has_attribs(x))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   809
        xmlnode_insert_node(x2, xmlnode_get_firstattrib(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   810
    if (xmlnode_has_children(x))
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   811
        xmlnode_insert_node(x2, xmlnode_get_firstchild(x));
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   812
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   813
    return x2;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   814
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   815
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   816
xmlnode xmlnode_wrap(xmlnode x,const char *wrapper)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   817
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   818
    xmlnode wrap;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   819
    if(x==NULL||wrapper==NULL) return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   820
    wrap=xmlnode_new_tag_pool(xmlnode_pool(x),wrapper);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   821
    if(wrap==NULL) return NULL;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   822
    wrap->firstchild=x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   823
    wrap->lastchild=x;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   824
    x->parent=wrap;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   825
    return wrap;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   826
}
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   827
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   828
void xmlnode_free(xmlnode node)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   829
{
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   830
    if(node == NULL)
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   831
        return;
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   832
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   833
    pool_free(node->p);
bf3d6e241714 [/trunk] Changeset 41 by mikael
mikael
parents:
diff changeset
   834
}