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