-/* @(#) $Id$ */
+/* @(#) $Id: ./src/os_xml/os_xml_node_access.c, 2011/09/08 dcid Exp $
+ */
/* Copyright (C) 2009 Trend Micro Inc.
* All rights reserved.
#include <stdlib.h>
#include "os_xml.h"
+#include "os_xml_internal.h"
/* OS_ClearNode v0,1
- * Clear the Node structure
+ * Clear the Node structure
*/
void OS_ClearNode(xml_node **node)
{
if(node)
- {
+ {
int i=0;
while(node[i])
{
node[i]->values=NULL;
free(node[i]);
node[i]=NULL;
- i++;
+ i++;
}
free(node);
- node=NULL;
}
}
/** xml_node **OS_GetElementsbyNode(OS_XML *_lxml, xml_node *node)
* Get the elements by node.
*/
-xml_node **OS_GetElementsbyNode(OS_XML *_lxml, xml_node *node)
+xml_node **OS_GetElementsbyNode(const OS_XML *_lxml, const xml_node *node)
{
- int i,j,k=0;
+ unsigned int i, k =0,m;
xml_node **ret=NULL;
+ xml_node **ret_tmp=NULL;
if(node == NULL)
{
- j = -1;
+ m = 0;
i = 0;
}
else
{
i = node->key;
- j = _lxml->rl[i++];
+ m = _lxml->rl[i++] + 1;
}
-
-
+
+
for(;i<_lxml->cur;i++)
{
if(_lxml->tp[i] == XML_ELEM)
{
- if((_lxml->rl[i] == j+1) && (_lxml->el[i] != NULL))
+ if((_lxml->rl[i] == m) && (_lxml->el[i] != NULL))
{
- int l=i+1;
+ unsigned int l=i+1;
/* Allocating for xml_node ** */
- ret = (xml_node**)realloc(ret,(k+1)*sizeof(xml_node*));
- if(ret == NULL)
- return(NULL);
-
+ ret_tmp = (xml_node**)realloc(ret,(k+2)*sizeof(xml_node*));
+ if(ret_tmp == NULL)
+ goto fail;
+ ret = ret_tmp;
+
/* Allocating for the xml_node * */
ret[k] = (xml_node *)calloc(1,sizeof(xml_node));
+ ret[k+1] = NULL;
if(ret[k] == NULL)
- return(NULL);
-
+ goto fail;
+
ret[k]->element = NULL;
ret[k]->content = NULL;
ret[k]->attributes = NULL;
ret[k]->values = NULL;
-
+
/* Getting the element */
ret[k]->element=strdup(_lxml->el[i]);
if(ret[k]->element == NULL)
{
- free(ret);
- return(NULL);
+ goto fail;
}
-
+
/* Getting the content */
if(_lxml->ct[i])
{
ret[k]->content=strdup(_lxml->ct[i]);
if(ret[k]->content == NULL)
- return(NULL);
+ goto fail;
}
/* Assigning the key */
ret[k]->key = i;
/* Getting attributes */
while(l < _lxml->cur)
{
- if((_lxml->tp[l] == XML_ATTR)&&(_lxml->rl[l] == j+1)&&
+ if((_lxml->tp[l] == XML_ATTR)&&(_lxml->rl[l] == m)&&
(_lxml->el[l]) && (_lxml->ct[l]))
{
- ret[k]->attributes =
- (char**)realloc(ret[k]->attributes,
- (l-i+1)*sizeof(char*));
- ret[k]->values =
- (char**)realloc(ret[k]->values,
- (l-i+1)*sizeof(char*));
- if(!(ret[k]->attributes) ||
- !(ret[k]->values))
- return(NULL);
+ char **tmp;
+ tmp = (char**)realloc(ret[k]->attributes, (l-i+1)*sizeof(char*));
+ if(tmp == NULL)
+ goto fail;
+ ret[k]->attributes = tmp;
+ ret[k]->attributes[l-i] = NULL;
+ tmp = (char**)realloc(ret[k]->values, (l-i+1)*sizeof(char*));
+ if(tmp == NULL)
+ goto fail;
+ ret[k]->values = tmp;
+ ret[k]->values[l-i] = NULL;
+
ret[k]->attributes[l-i-1]=strdup(_lxml->el[l]);
ret[k]->values[l-i-1] = strdup(_lxml->ct[l]);
if(!(ret[k]->attributes[l-i-1]) ||
!(ret[k]->values[l-i-1]))
- return(NULL);
- l++;
+ goto fail;
+ l++;
}
else
{
break;
}
}
- if(ret[k]->attributes)
- {
- ret[k]->attributes[l-i-1] = NULL;
- ret[k]->values[l-i-1] = NULL;
- }
k++;
continue;
}
}
- if((_lxml->tp[i] == XML_ELEM)&&(j+1 > _lxml->rl[i]))
+ if((_lxml->tp[i] == XML_ELEM)&&(m > _lxml->rl[i]))
{
- if(j == -1)
+ if(node == NULL)
continue;
else
break;
}
}
-
- if(ret ==NULL)
- return(NULL);
-
- ret = (xml_node **)realloc(ret,(k+1)*sizeof(xml_node *));
- if(ret == NULL)
- return(NULL);
- ret[k]=NULL;
+
return(ret);
+
+ fail:
+ OS_ClearNode(ret);
+ return (NULL);
}