Backport of ixml from 1.8.x.
git-svn-id: https://pupnp.svn.sourceforge.net/svnroot/pupnp/branches/branch-1.6.x@478 119443c7-1b9e-41f8-b6fc-b9c35fce742c
This commit is contained in:
3230
ixml/inc/ixml.h
3230
ixml/inc/ixml.h
File diff suppressed because it is too large
Load Diff
@@ -1,60 +1,53 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
#include "ixmlparser.h"
|
||||
|
||||
/*================================================================
|
||||
* Function: Attr_init
|
||||
* Initializes an attribute node
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlAttr_init( IN IXML_Attr * attr )
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void ixmlAttr_init(IN IXML_Attr *attr)
|
||||
{
|
||||
if( attr != NULL ) {
|
||||
memset( attr, 0, sizeof( IXML_Attr ) );
|
||||
}
|
||||
if (attr != NULL) {
|
||||
memset(attr, 0, sizeof (IXML_Attr));
|
||||
}
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* Function: Attr_free
|
||||
* Frees an attribute node.
|
||||
* external function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlAttr_free( IN IXML_Attr * attr )
|
||||
|
||||
void ixmlAttr_free(IN IXML_Attr *attr)
|
||||
{
|
||||
if( attr != NULL ) {
|
||||
ixmlNode_free( ( IXML_Node * ) attr );
|
||||
}
|
||||
if (attr != NULL) {
|
||||
ixmlNode_free((IXML_Node *)attr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
1136
ixml/src/document.c
1136
ixml/src/document.c
File diff suppressed because it is too large
Load Diff
1434
ixml/src/element.c
1434
ixml/src/element.c
File diff suppressed because it is too large
Load Diff
@@ -1,73 +1,173 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#ifndef IXML_MEMBUF_H
|
||||
#define IXML_MEMBUF_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
#ifndef _IXML_MEMBUF_H
|
||||
#define _IXML_MEMBUF_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "ixml.h"
|
||||
|
||||
#define MINVAL( a, b ) ( (a) < (b) ? (a) : (b) )
|
||||
#define MAXVAL( a, b ) ( (a) > (b) ? (a) : (b) )
|
||||
|
||||
#include <stdlib.h> /* for size_t */
|
||||
|
||||
|
||||
#define MINVAL(a, b) ( (a) < (b) ? (a) : (b) )
|
||||
#define MAXVAL(a, b) ( (a) > (b) ? (a) : (b) )
|
||||
|
||||
|
||||
#define MEMBUF_DEF_SIZE_INC 20
|
||||
|
||||
|
||||
typedef struct // ixml_membuf
|
||||
/*!
|
||||
* \brief The ixml_membuf type.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
char *buf;
|
||||
|
||||
size_t length;
|
||||
size_t capacity;
|
||||
size_t size_inc;
|
||||
|
||||
char *buf;
|
||||
size_t length;
|
||||
size_t capacity;
|
||||
size_t size_inc;
|
||||
} ixml_membuf;
|
||||
|
||||
//--------------------------------------------------
|
||||
//////////////// functions /////////////////////////
|
||||
//--------------------------------------------------
|
||||
/*
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
*/
|
||||
|
||||
void ixml_membuf_init(INOUT ixml_membuf *m);
|
||||
void ixml_membuf_destroy(INOUT ixml_membuf *m);
|
||||
int ixml_membuf_assign(INOUT ixml_membuf *m, IN const void *buf,
|
||||
IN size_t buf_len );
|
||||
int ixml_membuf_assign_str(INOUT ixml_membuf *m, IN const char *c_str );
|
||||
int ixml_membuf_append(INOUT ixml_membuf *m, IN const void *buf);
|
||||
int ixml_membuf_append_str(INOUT ixml_membuf *m, IN const char *c_str);
|
||||
int ixml_membuf_insert(INOUT ixml_membuf *m, IN const void* buf,
|
||||
IN size_t buf_len, int index );
|
||||
/*!
|
||||
* \brief ixml_membuf initialization routine.
|
||||
*/
|
||||
void ixml_membuf_init(
|
||||
/*! [in,out] The memory buffer to initializa. */
|
||||
ixml_membuf *m);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief ixml_membuf clearing routine.
|
||||
*
|
||||
* The internal buffer is deleted and ixml_membuf_init() is called in the end
|
||||
* to reinitialize the buffer.
|
||||
*/
|
||||
void ixml_membuf_destroy(
|
||||
/*! [in,out] The memory buffer to clear. */
|
||||
ixml_membuf *m);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Copies the contents o a buffer to the designated ixml_membuf.
|
||||
*
|
||||
* The previous contents of the ixml_membuf are destroyed.
|
||||
*
|
||||
* \return IXML_SUCCESS if successfull, or the error code returned
|
||||
* by ixml_membuf_set_size().
|
||||
*
|
||||
* \sa ixml_membuf_assign_str().
|
||||
*/
|
||||
int ixml_membuf_assign(
|
||||
/*! [in,out] The memory buffer on which to operate. */
|
||||
ixml_membuf *m,
|
||||
/*! [in] The input buffer to copy from. */
|
||||
const void *buf,
|
||||
/*! [in] The number of bytes to copy from the input buffer. */
|
||||
size_t buf_len);
|
||||
|
||||
/*!
|
||||
* \brief Copies a \b NULL terminated string to the ixml_buffer.
|
||||
*
|
||||
* This is a convenience function that internally uses ixml_membuf_assign().
|
||||
*
|
||||
* \return The return value of ixml_membuf_assign().
|
||||
*
|
||||
* \sa ixml_membuf_assign().
|
||||
*/
|
||||
int ixml_membuf_assign_str(
|
||||
/*! [in,out] The memory buffer on which to operate. */
|
||||
ixml_membuf *m,
|
||||
/*! [in] The input string to copy from. */
|
||||
const char *c_str);
|
||||
|
||||
/*!
|
||||
* \brief Appends one byte to the designated ixml_membuffer.
|
||||
*
|
||||
* This is a convenience function that internally uses ixml_membuf_insert().
|
||||
*
|
||||
* \return The return value of ixml_membuf_insert().
|
||||
*
|
||||
* \sa ixml_membuf_insert()
|
||||
*/
|
||||
int ixml_membuf_append(
|
||||
/*! [in,out] The memory buffer on which to operate. */
|
||||
ixml_membuf *m,
|
||||
/*! [in] The pointer to the byte to append. */
|
||||
const void *buf);
|
||||
|
||||
/*!
|
||||
* \brief Appends the contents of a \b NULL terminated string to the designated
|
||||
* ixml_membuf.
|
||||
*
|
||||
* This is a convenience function that internally uses ixml_membuf_insert().
|
||||
*
|
||||
* \return The return value of ixml_membuf_insert().
|
||||
*
|
||||
* \sa ixml_membuf_insert().
|
||||
*/
|
||||
int ixml_membuf_append_str(
|
||||
/*! [in,out] The memory buffer on which to operate. */
|
||||
ixml_membuf *m,
|
||||
/*! [in] The input string to copy from. */
|
||||
const char *c_str);
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*
|
||||
* \return
|
||||
* \li 0 if successfull.
|
||||
* \li IXML_INDEX_SIZE_ERR if the index parameter is out of range.
|
||||
* \li Or the return code of ixml_membuf_set_size()
|
||||
*
|
||||
* \sa ixml_membuf_set_size()
|
||||
*/
|
||||
int ixml_membuf_insert(
|
||||
/*! [in,out] The memory buffer on which to operate. */
|
||||
ixml_membuf *m,
|
||||
/*! [in] The pointer to the input buffer. */
|
||||
const void *buf,
|
||||
/*! [in] The buffer length. */
|
||||
size_t buf_len,
|
||||
/*! [in] The point of insertion relative to the beggining of the
|
||||
* ixml_membuf internal buffer. */
|
||||
int index);
|
||||
|
||||
|
||||
#endif /* IXML_MEMBUF_H */
|
||||
|
||||
#endif // _IXML_MEMBUF_H
|
||||
|
||||
@@ -1,41 +1,49 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _IXMLPARSER_H
|
||||
#define _IXMLPARSER_H
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#ifndef IXMLPARSER_H
|
||||
#define IXMLPARSER_H
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "ixml.h"
|
||||
#include "ixmlmembuf.h"
|
||||
|
||||
// Parser definitions
|
||||
|
||||
/* Parser definitions */
|
||||
#define QUOT """
|
||||
#define LT "<"
|
||||
#define GT ">"
|
||||
@@ -44,77 +52,218 @@
|
||||
#define ESC_HEX "&#x"
|
||||
#define ESC_DEC "&#"
|
||||
|
||||
|
||||
typedef struct _IXML_NamespaceURI
|
||||
{
|
||||
char *nsURI;
|
||||
char *prefix;
|
||||
struct _IXML_NamespaceURI *nextNsURI;
|
||||
char *nsURI;
|
||||
char *prefix;
|
||||
struct _IXML_NamespaceURI *nextNsURI;
|
||||
} IXML_NamespaceURI;
|
||||
|
||||
|
||||
typedef struct _IXML_ElementStack
|
||||
{
|
||||
char *element;
|
||||
char *prefix;
|
||||
char *namespaceUri;
|
||||
IXML_NamespaceURI *pNsURI;
|
||||
struct _IXML_ElementStack *nextElement;
|
||||
char *element;
|
||||
char *prefix;
|
||||
char *namespaceUri;
|
||||
IXML_NamespaceURI *pNsURI;
|
||||
struct _IXML_ElementStack *nextElement;
|
||||
} IXML_ElementStack;
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
eELEMENT,
|
||||
eATTRIBUTE,
|
||||
eCONTENT,
|
||||
eELEMENT,
|
||||
eATTRIBUTE,
|
||||
eCONTENT,
|
||||
} PARSER_STATE;
|
||||
|
||||
|
||||
typedef struct _Parser
|
||||
{
|
||||
char *dataBuffer; //data buffer
|
||||
char *curPtr; //ptr to the token parsed
|
||||
char *savePtr; //Saves for backup
|
||||
ixml_membuf lastElem;
|
||||
ixml_membuf tokenBuf;
|
||||
|
||||
IXML_Node *pNeedPrefixNode;
|
||||
IXML_ElementStack *pCurElement;
|
||||
IXML_Node *currentNodePtr;
|
||||
PARSER_STATE state;
|
||||
|
||||
BOOL bHasTopLevel;
|
||||
|
||||
/*! Data buffer. */
|
||||
char *dataBuffer;
|
||||
/*! Pointer to the token parsed. */
|
||||
char *curPtr;
|
||||
/*! Saves for backup. */
|
||||
char *savePtr;
|
||||
ixml_membuf lastElem;
|
||||
ixml_membuf tokenBuf;
|
||||
IXML_Node *pNeedPrefixNode;
|
||||
IXML_ElementStack *pCurElement;
|
||||
IXML_Node *currentNodePtr;
|
||||
PARSER_STATE state;
|
||||
BOOL bHasTopLevel;
|
||||
} Parser;
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Check to see whether name is a valid xml name.
|
||||
*/
|
||||
BOOL Parser_isValidXmlName(
|
||||
/*! [in] The string to be checked. */
|
||||
const DOMString name);
|
||||
|
||||
int Parser_LoadDocument( IXML_Document **retDoc, const char * xmlFile, BOOL file);
|
||||
BOOL Parser_isValidXmlName( const DOMString name);
|
||||
int Parser_setNodePrefixAndLocalName(IXML_Node *newIXML_NodeIXML_Attr);
|
||||
void Parser_freeNodeContent( IXML_Node *IXML_Nodeptr);
|
||||
|
||||
void Parser_setErrorChar( char c );
|
||||
/*!
|
||||
* \brief Sets the error character.
|
||||
*
|
||||
* If 'c' is 0 (default), the parser is strict about XML encoding:
|
||||
* invalid UTF-8 sequences or "&" entities are rejected, and the parsing
|
||||
* aborts.
|
||||
*
|
||||
* If 'c' is not 0, the parser is relaxed: invalid UTF-8 characters
|
||||
* are replaced by this character, and invalid "&" entities are left
|
||||
* untranslated. The parsing is then allowed to continue.
|
||||
*/
|
||||
void Parser_setErrorChar(
|
||||
/*! [in] The character to become the error character. */
|
||||
char c);
|
||||
|
||||
void ixmlAttr_free(IXML_Attr *attrNode);
|
||||
void ixmlAttr_init(IXML_Attr *attrNode);
|
||||
|
||||
int ixmlElement_setTagName(IXML_Element *element, const char *tagName);
|
||||
/*!
|
||||
* \brief Fees a node contents.
|
||||
*/
|
||||
void Parser_freeNodeContent(
|
||||
/*! [in] The Node to process. */
|
||||
IXML_Node *IXML_Nodeptr);
|
||||
|
||||
void ixmlNamedNodeMap_init(IXML_NamedNodeMap *nnMap);
|
||||
int ixmlNamedNodeMap_addToNamedNodeMap(IXML_NamedNodeMap **nnMap, IXML_Node *add);
|
||||
int Parser_LoadDocument(IXML_Document **retDoc, const char * xmlFile, BOOL file);
|
||||
|
||||
void ixmlNode_init(IXML_Node *IXML_Nodeptr);
|
||||
BOOL ixmlNode_compare(IXML_Node *srcIXML_Node, IXML_Node *destIXML_Node);
|
||||
int Parser_setNodePrefixAndLocalName(IXML_Node *newIXML_NodeIXML_Attr);
|
||||
|
||||
void ixmlNode_getElementsByTagName( IXML_Node *n, const char *tagname, IXML_NodeList **list);
|
||||
void ixmlNode_getElementsByTagNameNS( IXML_Node *IXML_Node, const char *namespaceURI,
|
||||
const char *localName, IXML_NodeList **list);
|
||||
|
||||
int ixmlNode_setNodeProperties(IXML_Node* node, IXML_Node *src);
|
||||
int ixmlNode_setNodeName( IXML_Node* node, const DOMString qualifiedName);
|
||||
void ixmlAttr_init(IXML_Attr *attrNode);
|
||||
|
||||
void ixmlNodeList_init(IXML_NodeList *nList);
|
||||
int ixmlNodeList_addToNodeList(IXML_NodeList **nList, IXML_Node *add);
|
||||
/*!
|
||||
* \brief Set the given element's tagName.
|
||||
*
|
||||
* \return One of the following:
|
||||
* \li \b IXML_SUCCESS, if successfull.
|
||||
* \li \b IXML_FAILED, if element of tagname is \b NULL.
|
||||
* \li \b IXML_INSUFFICIENT_MEMORY, if there is no memory to allocate the
|
||||
* buffer for the element's tagname.
|
||||
*/
|
||||
int ixmlElement_setTagName(
|
||||
/*! [in] The element to change the tagname. */
|
||||
IXML_Element *element,
|
||||
/*! [in] The new tagName for the element. */
|
||||
const char *tagName);
|
||||
|
||||
#endif // _IXMLPARSER_H
|
||||
|
||||
/*!
|
||||
* \brief Initializes a NamedNodeMap object.
|
||||
*/
|
||||
void ixmlNamedNodeMap_init(
|
||||
/*! [in] The named node map to process. */
|
||||
IXML_NamedNodeMap *nnMap);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Add a node to a NamedNodeMap.
|
||||
*
|
||||
* \return IXML_SUCCESS or failure.
|
||||
*/
|
||||
int ixmlNamedNodeMap_addToNamedNodeMap(
|
||||
/* [in] The named node map. */
|
||||
IXML_NamedNodeMap **nnMap,
|
||||
/* [in] The node to add. */
|
||||
IXML_Node *add);
|
||||
|
||||
/*!
|
||||
* \brief Add a node to nodelist.
|
||||
*/
|
||||
int ixmlNodeList_addToNodeList(
|
||||
/*! [in] The pointer to the nodelist. */
|
||||
IXML_NodeList **nList,
|
||||
/*! [in] The node to add. */
|
||||
IXML_Node *add);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Intializes a node.
|
||||
*/
|
||||
void ixmlNode_init(
|
||||
/*! [in] The \b Node to iniatialize. */
|
||||
IN IXML_Node *nodeptr);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Compare two nodes to see whether they are the same node.
|
||||
* Parent, sibling and children node are ignored.
|
||||
*
|
||||
* \return
|
||||
* \li TRUE, the two nodes are the same.
|
||||
* \li FALSE, the two nodes are not the same.
|
||||
*/
|
||||
BOOL ixmlNode_compare(
|
||||
/*! [in] The first \b Node. */
|
||||
IXML_Node *srcNode,
|
||||
/*! [in] The second \b Node. */
|
||||
IXML_Node *destNode);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Returns a nodeList of all descendant Elements with a given tagName,
|
||||
* in the order in which they are encountered in a traversal of this element
|
||||
* tree.
|
||||
*/
|
||||
void ixmlNode_getElementsByTagName(
|
||||
/*! [in] The \b Node tree. */
|
||||
IXML_Node *n,
|
||||
/*! [in] The tag name to match. */
|
||||
const char *tagname,
|
||||
/*! [out] The output \b NodeList. */
|
||||
IXML_NodeList **list);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Returns a nodeList of all the descendant Elements with a given local
|
||||
* name and namespace URI in the order in which they are encountered in a
|
||||
* preorder traversal of this Elememt tree.
|
||||
*/
|
||||
void ixmlNode_getElementsByTagNameNS(
|
||||
/*! [in] The \b Element tree. */
|
||||
IXML_Node *n,
|
||||
/*! [in] The name space to match. */
|
||||
const char *namespaceURI,
|
||||
/*! [in] The local name to match. */
|
||||
const char *localName,
|
||||
/*! [out] The output \b NodeList. */
|
||||
IXML_NodeList **list);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*
|
||||
* \return
|
||||
*/
|
||||
int ixmlNode_setNodeName(
|
||||
/*! [in] The \b Node. */
|
||||
IXML_Node *node,
|
||||
/*! [in] . */
|
||||
const DOMString qualifiedName);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief
|
||||
*
|
||||
* \return
|
||||
*/
|
||||
int ixmlNode_setNodeProperties(
|
||||
/*! [in] . */
|
||||
IXML_Node *destNode,
|
||||
/*! [in] . */
|
||||
IXML_Node *src);
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Initializes a nodelist
|
||||
*/
|
||||
void ixmlNodeList_init(
|
||||
/*! [in,out] The \b NodeList to initialize. */
|
||||
IXML_NodeList *nList);
|
||||
|
||||
|
||||
#endif /* IXMLPARSER_H */
|
||||
|
||||
|
||||
956
ixml/src/ixml.c
956
ixml/src/ixml.c
@@ -1,531 +1,469 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "ixmldebug.h"
|
||||
#include "ixmlmembuf.h"
|
||||
#include "ixmlparser.h"
|
||||
|
||||
/*================================================================
|
||||
* copy_with_escape
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
static void
|
||||
copy_with_escape( INOUT ixml_membuf * buf,
|
||||
IN const char *p )
|
||||
|
||||
#include <stdlib.h> /* for free() */
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Appends a string to a buffer, substituting some characters by escape
|
||||
* sequences.
|
||||
*/
|
||||
static void copy_with_escape(
|
||||
/*! [in,out] The input/output buffer. */
|
||||
ixml_membuf *buf,
|
||||
/*! [in] The string to copy from. */
|
||||
const char *p)
|
||||
{
|
||||
int i;
|
||||
int plen;
|
||||
|
||||
if( p == NULL )
|
||||
return;
|
||||
|
||||
plen = strlen( p );
|
||||
|
||||
for( i = 0; i < plen; i++ ) {
|
||||
switch ( p[i] ) {
|
||||
case '<':
|
||||
ixml_membuf_append_str( buf, "<" );
|
||||
break;
|
||||
|
||||
case '>':
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
break;
|
||||
|
||||
case '&':
|
||||
ixml_membuf_append_str( buf, "&" );
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
ixml_membuf_append_str( buf, "'" );
|
||||
break;
|
||||
|
||||
case '\"':
|
||||
ixml_membuf_append_str( buf, """ );
|
||||
break;
|
||||
|
||||
default:
|
||||
ixml_membuf_append( buf, &p[i] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlPrintDomTreeRecursive
|
||||
* It is a recursive function to print all the node in a tree.
|
||||
* Internal to parser only.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlPrintDomTreeRecursive( IN IXML_Node * nodeptr,
|
||||
IN ixml_membuf * buf )
|
||||
{
|
||||
const char *nodeName = NULL;
|
||||
const char *nodeValue = NULL;
|
||||
IXML_Node *child = NULL,
|
||||
*sibling = NULL;
|
||||
|
||||
if( nodeptr != NULL ) {
|
||||
nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
|
||||
nodeValue = ixmlNode_getNodeValue( nodeptr );
|
||||
|
||||
switch ( ixmlNode_getNodeType( nodeptr ) ) {
|
||||
|
||||
case eTEXT_NODE:
|
||||
copy_with_escape( buf, nodeValue );
|
||||
break;
|
||||
|
||||
case eCDATA_SECTION_NODE:
|
||||
ixml_membuf_append_str( buf, "<![CDATA[" );
|
||||
ixml_membuf_append_str( buf, nodeValue );
|
||||
ixml_membuf_append_str( buf, "]]>" );
|
||||
break;
|
||||
|
||||
case ePROCESSING_INSTRUCTION_NODE:
|
||||
ixml_membuf_append_str( buf, "<?" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, " " );
|
||||
copy_with_escape( buf, nodeValue );
|
||||
ixml_membuf_append_str( buf, "?>\n" );
|
||||
break;
|
||||
|
||||
case eDOCUMENT_NODE:
|
||||
ixmlPrintDomTreeRecursive( ixmlNode_getFirstChild
|
||||
( nodeptr ), buf );
|
||||
break;
|
||||
|
||||
case eATTRIBUTE_NODE:
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, "=\"" );
|
||||
copy_with_escape( buf, nodeValue );
|
||||
ixml_membuf_append_str( buf, "\"" );
|
||||
|
||||
if( nodeptr->nextSibling != NULL ) {
|
||||
ixml_membuf_append_str( buf, " " );
|
||||
ixmlPrintDomTreeRecursive( nodeptr->nextSibling, buf );
|
||||
}
|
||||
break;
|
||||
|
||||
case eELEMENT_NODE:
|
||||
ixml_membuf_append_str( buf, "<" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
|
||||
if( nodeptr->firstAttr != NULL ) {
|
||||
ixml_membuf_append_str( buf, " " );
|
||||
ixmlPrintDomTreeRecursive( nodeptr->firstAttr, buf );
|
||||
}
|
||||
|
||||
child = ixmlNode_getFirstChild( nodeptr );
|
||||
if( ( child != NULL )
|
||||
&& ( ixmlNode_getNodeType( child ) ==
|
||||
eELEMENT_NODE ) ) {
|
||||
ixml_membuf_append_str( buf, ">\r\n" );
|
||||
} else {
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
}
|
||||
|
||||
// output the children
|
||||
ixmlPrintDomTreeRecursive( ixmlNode_getFirstChild
|
||||
( nodeptr ), buf );
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
ixml_membuf_append_str( buf, "</" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
|
||||
sibling = ixmlNode_getNextSibling( nodeptr );
|
||||
if( sibling != NULL
|
||||
&& ixmlNode_getNodeType( sibling ) == eTEXT_NODE ) {
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
} else {
|
||||
ixml_membuf_append_str( buf, ">\r\n" );
|
||||
}
|
||||
ixmlPrintDomTreeRecursive( ixmlNode_getNextSibling
|
||||
( nodeptr ), buf );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlPrintDomTree
|
||||
* Print a DOM tree.
|
||||
* Element, and Attribute nodes are handled differently.
|
||||
* We don't want to print the Element and Attribute nodes' sibling.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlPrintDomTree( IN IXML_Node * nodeptr,
|
||||
IN ixml_membuf * buf )
|
||||
{
|
||||
const char *nodeName = NULL;
|
||||
const char *nodeValue = NULL;
|
||||
IXML_Node *child = NULL;
|
||||
|
||||
if( ( nodeptr == NULL ) || ( buf == NULL ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
|
||||
nodeValue = ixmlNode_getNodeValue( nodeptr );
|
||||
|
||||
switch ( ixmlNode_getNodeType( nodeptr ) ) {
|
||||
|
||||
case eTEXT_NODE:
|
||||
case eCDATA_SECTION_NODE:
|
||||
case ePROCESSING_INSTRUCTION_NODE:
|
||||
case eDOCUMENT_NODE:
|
||||
ixmlPrintDomTreeRecursive( nodeptr, buf );
|
||||
break;
|
||||
|
||||
case eATTRIBUTE_NODE:
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, "=\"" );
|
||||
copy_with_escape( buf, nodeValue );
|
||||
ixml_membuf_append_str( buf, "\"" );
|
||||
break;
|
||||
|
||||
case eELEMENT_NODE:
|
||||
ixml_membuf_append_str( buf, "<" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
|
||||
if( nodeptr->firstAttr != NULL ) {
|
||||
ixml_membuf_append_str( buf, " " );
|
||||
ixmlPrintDomTreeRecursive( nodeptr->firstAttr, buf );
|
||||
}
|
||||
|
||||
child = ixmlNode_getFirstChild( nodeptr );
|
||||
if( ( child != NULL )
|
||||
&& ( ixmlNode_getNodeType( child ) == eELEMENT_NODE ) ) {
|
||||
ixml_membuf_append_str( buf, ">\r\n" );
|
||||
} else {
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
}
|
||||
|
||||
// output the children
|
||||
ixmlPrintDomTreeRecursive( ixmlNode_getFirstChild( nodeptr ),
|
||||
buf );
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
ixml_membuf_append_str( buf, "</" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, ">\r\n" );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlDomTreetoString
|
||||
* Converts a DOM tree into a text string
|
||||
* Element, and Attribute nodes are handled differently.
|
||||
* We don't want to print the Element and Attribute nodes' sibling.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlDomTreetoString( IN IXML_Node * nodeptr,
|
||||
IN ixml_membuf * buf )
|
||||
{
|
||||
const char *nodeName = NULL;
|
||||
const char *nodeValue = NULL;
|
||||
IXML_Node *child = NULL;
|
||||
|
||||
if( ( nodeptr == NULL ) || ( buf == NULL ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
nodeName = ( const char * )ixmlNode_getNodeName( nodeptr );
|
||||
nodeValue = ixmlNode_getNodeValue( nodeptr );
|
||||
|
||||
switch ( ixmlNode_getNodeType( nodeptr ) ) {
|
||||
|
||||
case eTEXT_NODE:
|
||||
case eCDATA_SECTION_NODE:
|
||||
case ePROCESSING_INSTRUCTION_NODE:
|
||||
case eDOCUMENT_NODE:
|
||||
ixmlPrintDomTreeRecursive( nodeptr, buf );
|
||||
break;
|
||||
|
||||
case eATTRIBUTE_NODE:
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, "=\"" );
|
||||
copy_with_escape( buf, nodeValue );
|
||||
ixml_membuf_append_str( buf, "\"" );
|
||||
break;
|
||||
|
||||
case eELEMENT_NODE:
|
||||
ixml_membuf_append_str( buf, "<" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
|
||||
if( nodeptr->firstAttr != NULL ) {
|
||||
ixml_membuf_append_str( buf, " " );
|
||||
ixmlPrintDomTreeRecursive( nodeptr->firstAttr, buf );
|
||||
}
|
||||
|
||||
child = ixmlNode_getFirstChild( nodeptr );
|
||||
if( ( child != NULL )
|
||||
&& ( ixmlNode_getNodeType( child ) == eELEMENT_NODE ) ) {
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
} else {
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
}
|
||||
|
||||
// output the children
|
||||
ixmlPrintDomTreeRecursive( ixmlNode_getFirstChild( nodeptr ),
|
||||
buf );
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
ixml_membuf_append_str( buf, "</" );
|
||||
ixml_membuf_append_str( buf, nodeName );
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlLoadDocumentEx
|
||||
* Parses the given file, and returns the DOM tree from it.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixmlLoadDocumentEx( IN const char *xmlFile,
|
||||
IXML_Document ** doc )
|
||||
{
|
||||
|
||||
if( ( xmlFile == NULL ) || ( doc == NULL ) ) {
|
||||
return IXML_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return Parser_LoadDocument( doc, xmlFile, TRUE );
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlLoadDocument
|
||||
* Parses the given file, and returns the DOM tree from it.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
IXML_Document *
|
||||
ixmlLoadDocument( IN const char *xmlFile )
|
||||
{
|
||||
|
||||
IXML_Document *doc = NULL;
|
||||
|
||||
ixmlLoadDocumentEx( xmlFile, &doc );
|
||||
return doc;
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlPrintDocument
|
||||
* Prints entire document, prepending XML prolog first.
|
||||
* Puts lots of white spaces.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
|
||||
DOMString
|
||||
ixmlPrintDocument(IXML_Document *doc)
|
||||
{
|
||||
IXML_Node* rootNode = ( IXML_Node * )doc;
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if( rootNode == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init( buf );
|
||||
ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\r\n" );
|
||||
ixmlPrintDomTree( rootNode, buf );
|
||||
return buf->buf;
|
||||
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlPrintNode
|
||||
* Print DOM tree under node. Puts lots of white spaces
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
DOMString
|
||||
ixmlPrintNode( IN IXML_Node * node )
|
||||
{
|
||||
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if( node == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init( buf );
|
||||
ixmlPrintDomTree( node, buf );
|
||||
return buf->buf;
|
||||
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlDocumenttoString
|
||||
* converts DOM tree under node to text string,
|
||||
* prepending XML prolog first.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
|
||||
DOMString
|
||||
ixmlDocumenttoString(IXML_Document *doc)
|
||||
{
|
||||
IXML_Node* rootNode = ( IXML_Node * )doc;
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if( rootNode == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init( buf );
|
||||
ixml_membuf_append_str( buf, "<?xml version=\"1.0\"?>\r\n" );
|
||||
ixmlDomTreetoString( rootNode, buf );
|
||||
return buf->buf;
|
||||
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlNodetoString
|
||||
* converts DOM tree under node to text string
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
DOMString
|
||||
ixmlNodetoString( IN IXML_Node * node )
|
||||
{
|
||||
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if( node == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init( buf );
|
||||
ixmlDomTreetoString( node, buf );
|
||||
return buf->buf;
|
||||
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlRelaxParser
|
||||
* Makes the XML parser more tolerant to malformed text.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlRelaxParser(char errorChar)
|
||||
{
|
||||
Parser_setErrorChar( errorChar );
|
||||
int i;
|
||||
int plen;
|
||||
|
||||
if (p == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
plen = strlen( p );
|
||||
|
||||
for (i = 0; i < plen; i++) {
|
||||
switch (p[i]) {
|
||||
case '<':
|
||||
ixml_membuf_append_str(buf, "<");
|
||||
break;
|
||||
|
||||
case '>':
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
break;
|
||||
|
||||
case '&':
|
||||
ixml_membuf_append_str(buf, "&");
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
ixml_membuf_append_str(buf, "'");
|
||||
break;
|
||||
|
||||
case '\"':
|
||||
ixml_membuf_append_str(buf, """);
|
||||
break;
|
||||
|
||||
default:
|
||||
ixml_membuf_append(buf, &p[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*================================================================
|
||||
* ixmlParseBufferEx
|
||||
* Parse xml file stored in buffer.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixmlParseBufferEx( IN const char *buffer,
|
||||
IXML_Document ** retDoc )
|
||||
/*!
|
||||
* \brief Recursive function to print all the node in a tree.
|
||||
* Internal to parser only.
|
||||
*/
|
||||
static void ixmlPrintDomTreeRecursive(
|
||||
/*! [in] \todo documentation. */
|
||||
IXML_Node *nodeptr,
|
||||
/*! [in] \todo documentation. */
|
||||
ixml_membuf *buf)
|
||||
{
|
||||
const char *nodeName = NULL;
|
||||
const char *nodeValue = NULL;
|
||||
IXML_Node *child = NULL,
|
||||
*sibling = NULL;
|
||||
|
||||
if( ( buffer == NULL ) || ( retDoc == NULL ) ) {
|
||||
return IXML_INVALID_PARAMETER;
|
||||
}
|
||||
if (nodeptr != NULL) {
|
||||
nodeName = (const char *)ixmlNode_getNodeName(nodeptr);
|
||||
nodeValue = ixmlNode_getNodeValue(nodeptr);
|
||||
|
||||
switch (ixmlNode_getNodeType(nodeptr)) {
|
||||
case eTEXT_NODE:
|
||||
copy_with_escape(buf, nodeValue);
|
||||
break;
|
||||
|
||||
if( buffer[0] == '\0' ) {
|
||||
return IXML_INVALID_PARAMETER;
|
||||
}
|
||||
case eCDATA_SECTION_NODE:
|
||||
ixml_membuf_append_str(buf, "<![CDATA[");
|
||||
ixml_membuf_append_str(buf, nodeValue);
|
||||
ixml_membuf_append_str(buf, "]]>");
|
||||
break;
|
||||
|
||||
return Parser_LoadDocument( retDoc, buffer, FALSE );
|
||||
case ePROCESSING_INSTRUCTION_NODE:
|
||||
ixml_membuf_append_str(buf, "<?");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, " ");
|
||||
copy_with_escape(buf, nodeValue);
|
||||
ixml_membuf_append_str(buf, "?>\n");
|
||||
break;
|
||||
|
||||
case eDOCUMENT_NODE:
|
||||
ixmlPrintDomTreeRecursive(
|
||||
ixmlNode_getFirstChild(nodeptr), buf);
|
||||
break;
|
||||
|
||||
case eATTRIBUTE_NODE:
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, "=\"");
|
||||
copy_with_escape(buf, nodeValue);
|
||||
ixml_membuf_append_str(buf, "\"");
|
||||
if (nodeptr->nextSibling != NULL) {
|
||||
ixml_membuf_append_str(buf, " ");
|
||||
ixmlPrintDomTreeRecursive(nodeptr->nextSibling, buf);
|
||||
}
|
||||
break;
|
||||
|
||||
case eELEMENT_NODE:
|
||||
ixml_membuf_append_str(buf, "<");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
if (nodeptr->firstAttr != NULL) {
|
||||
ixml_membuf_append_str(buf, " ");
|
||||
ixmlPrintDomTreeRecursive(nodeptr->firstAttr, buf);
|
||||
}
|
||||
child = ixmlNode_getFirstChild(nodeptr);
|
||||
if (child != NULL &&
|
||||
ixmlNode_getNodeType(child) == eELEMENT_NODE) {
|
||||
ixml_membuf_append_str(buf, ">\r\n");
|
||||
} else {
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
}
|
||||
// output the children
|
||||
ixmlPrintDomTreeRecursive(
|
||||
ixmlNode_getFirstChild(nodeptr), buf);
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
ixml_membuf_append_str(buf, "</");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
|
||||
sibling = ixmlNode_getNextSibling(nodeptr);
|
||||
if (sibling != NULL &&
|
||||
ixmlNode_getNodeType(sibling) == eTEXT_NODE) {
|
||||
ixml_membuf_append_str( buf, ">" );
|
||||
} else {
|
||||
ixml_membuf_append_str( buf, ">\r\n" );
|
||||
}
|
||||
ixmlPrintDomTreeRecursive(
|
||||
ixmlNode_getNextSibling(nodeptr), buf);
|
||||
break;
|
||||
|
||||
default:
|
||||
IxmlPrintf("(%s::ixmlPrintDomTreeRecursive) line %d: "
|
||||
"Warning, unknown node type %d\n",
|
||||
__FILE__, __LINE__, ixmlNode_getNodeType(nodeptr));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlParseBuffer
|
||||
* Parse xml file stored in buffer.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
IXML_Document *
|
||||
ixmlParseBuffer( IN const char *buffer )
|
||||
{
|
||||
IXML_Document *doc = NULL;
|
||||
|
||||
ixmlParseBufferEx( buffer, &doc );
|
||||
return doc;
|
||||
/*!
|
||||
* \brief Print a DOM tree.
|
||||
*
|
||||
* Element, and Attribute nodes are handled differently. We don't want to print
|
||||
* the Element and Attribute nodes' sibling.
|
||||
*/
|
||||
static void ixmlPrintDomTree(
|
||||
/*! [in] \todo documentation. */
|
||||
IXML_Node *nodeptr,
|
||||
/*! [in] \todo documentation. */
|
||||
ixml_membuf *buf)
|
||||
{
|
||||
const char *nodeName = NULL;
|
||||
const char *nodeValue = NULL;
|
||||
IXML_Node *child = NULL;
|
||||
|
||||
if (nodeptr == NULL || buf == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
nodeName = (const char *)ixmlNode_getNodeName(nodeptr);
|
||||
nodeValue = ixmlNode_getNodeValue(nodeptr);
|
||||
switch (ixmlNode_getNodeType(nodeptr)) {
|
||||
case eTEXT_NODE:
|
||||
case eCDATA_SECTION_NODE:
|
||||
case ePROCESSING_INSTRUCTION_NODE:
|
||||
case eDOCUMENT_NODE:
|
||||
ixmlPrintDomTreeRecursive(nodeptr, buf);
|
||||
break;
|
||||
|
||||
case eATTRIBUTE_NODE:
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, "=\"");
|
||||
copy_with_escape(buf, nodeValue);
|
||||
ixml_membuf_append_str(buf, "\"");
|
||||
break;
|
||||
|
||||
case eELEMENT_NODE:
|
||||
ixml_membuf_append_str(buf, "<");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
if (nodeptr->firstAttr != NULL) {
|
||||
ixml_membuf_append_str(buf, " ");
|
||||
ixmlPrintDomTreeRecursive(nodeptr->firstAttr, buf);
|
||||
}
|
||||
child = ixmlNode_getFirstChild(nodeptr);
|
||||
if (child != NULL &&
|
||||
ixmlNode_getNodeType(child) == eELEMENT_NODE) {
|
||||
ixml_membuf_append_str(buf, ">\r\n");
|
||||
} else {
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
}
|
||||
|
||||
// output the children
|
||||
ixmlPrintDomTreeRecursive(
|
||||
ixmlNode_getFirstChild(nodeptr), buf);
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
ixml_membuf_append_str(buf, "</");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, ">\r\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
IxmlPrintf("(%s::ixmlPrintDomTree) line %d: "
|
||||
"Warning, unknown node type %d\n",
|
||||
__FILE__, __LINE__, ixmlNode_getNodeType(nodeptr));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlCloneDOMString
|
||||
* Clones a DOM String.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
DOMString
|
||||
ixmlCloneDOMString( IN const DOMString src )
|
||||
{
|
||||
if( src == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ( strdup( src ) );
|
||||
/*!
|
||||
* \brief Converts a DOM tree into a text string.
|
||||
*
|
||||
* Element, and Attribute nodes are handled differently. We don't want to print
|
||||
* the Element and Attribute nodes' sibling.
|
||||
*/
|
||||
static void ixmlDomTreetoString(
|
||||
/*! [in] \todo documentation. */
|
||||
IXML_Node *nodeptr,
|
||||
/*! [in] \todo documentation. */
|
||||
ixml_membuf *buf)
|
||||
{
|
||||
const char *nodeName = NULL;
|
||||
const char *nodeValue = NULL;
|
||||
IXML_Node *child = NULL;
|
||||
|
||||
if (nodeptr == NULL || buf == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
nodeName = (const char *)ixmlNode_getNodeName(nodeptr);
|
||||
nodeValue = ixmlNode_getNodeValue(nodeptr);
|
||||
|
||||
switch (ixmlNode_getNodeType(nodeptr)) {
|
||||
case eTEXT_NODE:
|
||||
case eCDATA_SECTION_NODE:
|
||||
case ePROCESSING_INSTRUCTION_NODE:
|
||||
case eDOCUMENT_NODE:
|
||||
ixmlPrintDomTreeRecursive(nodeptr, buf);
|
||||
break;
|
||||
|
||||
case eATTRIBUTE_NODE:
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, "=\"");
|
||||
copy_with_escape(buf, nodeValue );
|
||||
ixml_membuf_append_str(buf, "\"");
|
||||
break;
|
||||
|
||||
case eELEMENT_NODE:
|
||||
ixml_membuf_append_str(buf, "<");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
if (nodeptr->firstAttr != NULL) {
|
||||
ixml_membuf_append_str(buf, " ");
|
||||
ixmlPrintDomTreeRecursive(nodeptr->firstAttr, buf);
|
||||
}
|
||||
child = ixmlNode_getFirstChild(nodeptr);
|
||||
if (child != NULL &&
|
||||
ixmlNode_getNodeType(child) == eELEMENT_NODE) {
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
} else {
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
}
|
||||
|
||||
// output the children
|
||||
ixmlPrintDomTreeRecursive(ixmlNode_getFirstChild(nodeptr), buf);
|
||||
|
||||
// Done with children. Output the end tag.
|
||||
ixml_membuf_append_str(buf, "</");
|
||||
ixml_membuf_append_str(buf, nodeName);
|
||||
ixml_membuf_append_str(buf, ">");
|
||||
break;
|
||||
|
||||
default:
|
||||
IxmlPrintf("(%s::ixmlDomTreetoString) line %d: "
|
||||
"Warning, unknown node type %d\n",
|
||||
__FILE__, __LINE__, ixmlNode_getNodeType(nodeptr));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlFreeDOMString
|
||||
* Frees a DOM String.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlFreeDOMString( IN DOMString buf )
|
||||
|
||||
int ixmlLoadDocumentEx(const char *xmlFile, IXML_Document **doc)
|
||||
{
|
||||
if( buf != NULL ) {
|
||||
free( buf );
|
||||
}
|
||||
if (xmlFile == NULL || doc == NULL) {
|
||||
return IXML_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return Parser_LoadDocument(doc, xmlFile, TRUE);
|
||||
}
|
||||
|
||||
|
||||
IXML_Document *ixmlLoadDocument(const char *xmlFile)
|
||||
{
|
||||
IXML_Document *doc = NULL;
|
||||
|
||||
ixmlLoadDocumentEx(xmlFile, &doc);
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
|
||||
DOMString ixmlPrintDocument(IXML_Document *doc)
|
||||
{
|
||||
IXML_Node* rootNode = (IXML_Node *)doc;
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if(rootNode == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init(buf);
|
||||
ixml_membuf_append_str(buf, "<?xml version=\"1.0\"?>\r\n");
|
||||
ixmlPrintDomTree(rootNode, buf);
|
||||
|
||||
return buf->buf;
|
||||
}
|
||||
|
||||
|
||||
DOMString ixmlPrintNode(IXML_Node *node)
|
||||
{
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if (node == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init(buf);
|
||||
ixmlPrintDomTree(node, buf);
|
||||
|
||||
return buf->buf;
|
||||
}
|
||||
|
||||
|
||||
DOMString ixmlDocumenttoString(IXML_Document *doc)
|
||||
{
|
||||
IXML_Node* rootNode = (IXML_Node *)doc;
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if(rootNode == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init(buf);
|
||||
ixml_membuf_append_str(buf, "<?xml version=\"1.0\"?>\r\n");
|
||||
ixmlDomTreetoString(rootNode, buf);
|
||||
|
||||
return buf->buf;
|
||||
}
|
||||
|
||||
|
||||
DOMString ixmlNodetoString(IXML_Node *node)
|
||||
{
|
||||
ixml_membuf memBuf;
|
||||
ixml_membuf *buf = &memBuf;
|
||||
|
||||
if (node == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ixml_membuf_init(buf);
|
||||
ixmlDomTreetoString(node, buf);
|
||||
|
||||
return buf->buf;
|
||||
}
|
||||
|
||||
|
||||
void ixmlRelaxParser(char errorChar)
|
||||
{
|
||||
Parser_setErrorChar(errorChar);
|
||||
}
|
||||
|
||||
|
||||
int ixmlParseBufferEx(const char *buffer, IXML_Document **retDoc)
|
||||
{
|
||||
if (buffer == NULL || retDoc == NULL) {
|
||||
return IXML_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (buffer[0] == '\0') {
|
||||
return IXML_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
return Parser_LoadDocument(retDoc, buffer, FALSE);
|
||||
}
|
||||
|
||||
|
||||
IXML_Document *ixmlParseBuffer(const char *buffer)
|
||||
{
|
||||
IXML_Document *doc = NULL;
|
||||
|
||||
ixmlParseBufferEx(buffer, &doc);
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
|
||||
DOMString ixmlCloneDOMString(const DOMString src)
|
||||
{
|
||||
if (src == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return strdup(src);
|
||||
}
|
||||
|
||||
|
||||
void ixmlFreeDOMString(DOMString buf)
|
||||
{
|
||||
if (buf != NULL) {
|
||||
free(buf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,236 +1,218 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "ixmlmembuf.h"
|
||||
#include "ixml.h"
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "ixmlmembuf.h"
|
||||
#include "ixml.h"
|
||||
|
||||
/*================================================================
|
||||
* ixml_membuf_set_size
|
||||
*
|
||||
* Increases or decreases buffer cap so that at least
|
||||
* 'new_length' bytes can be stored
|
||||
*
|
||||
* On error, m's fields do not change.
|
||||
*
|
||||
* returns:
|
||||
* UPNP_E_SUCCESS
|
||||
* UPNP_E_OUTOF_MEMORY
|
||||
*
|
||||
*=================================================================*/
|
||||
static int
|
||||
ixml_membuf_set_size( INOUT ixml_membuf * m,
|
||||
IN size_t new_length )
|
||||
|
||||
/*!
|
||||
* \brief Increases or decreases buffer capacity so that at least 'new_length'
|
||||
* bytes can be stored.
|
||||
*
|
||||
* On error, m's fields do not change.
|
||||
*
|
||||
* \return
|
||||
* \li UPNP_E_SUCCESS
|
||||
* \li UPNP_E_OUTOF_MEMORY
|
||||
*/
|
||||
static int ixml_membuf_set_size(
|
||||
/*! [in,out] The memory buffer. */
|
||||
INOUT ixml_membuf *m,
|
||||
/*! [in] The new lenght. */
|
||||
IN size_t new_length)
|
||||
{
|
||||
size_t diff;
|
||||
size_t alloc_len;
|
||||
char *temp_buf;
|
||||
size_t diff;
|
||||
size_t alloc_len;
|
||||
char *temp_buf;
|
||||
|
||||
if( new_length >= m->length ) // increase length
|
||||
{
|
||||
// need more mem?
|
||||
if( new_length <= m->capacity ) {
|
||||
return 0; // have enough mem; done
|
||||
}
|
||||
if (new_length >= m->length) {
|
||||
/* increase length */
|
||||
/* need more mem? */
|
||||
if (new_length <= m->capacity) {
|
||||
/* have enough mem; done */
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff = new_length - m->length;
|
||||
alloc_len = MAXVAL( m->size_inc, diff ) + m->capacity;
|
||||
} else // decrease length
|
||||
{
|
||||
assert( new_length <= m->length );
|
||||
diff = new_length - m->length;
|
||||
alloc_len = MAXVAL(m->size_inc, diff) + m->capacity;
|
||||
} else {
|
||||
// decrease length
|
||||
assert(new_length <= m->length);
|
||||
|
||||
// if diff is 0..m->size_inc, don't free
|
||||
if( ( m->capacity - new_length ) <= m->size_inc ) {
|
||||
return 0;
|
||||
}
|
||||
// if diff is 0..m->size_inc, don't free
|
||||
if ((m->capacity - new_length) <= m->size_inc) {
|
||||
return 0;
|
||||
}
|
||||
alloc_len = new_length + m->size_inc;
|
||||
}
|
||||
|
||||
alloc_len = new_length + m->size_inc;
|
||||
}
|
||||
assert(alloc_len >= new_length);
|
||||
|
||||
assert( alloc_len >= new_length );
|
||||
temp_buf = realloc(m->buf, alloc_len + 1);
|
||||
if (temp_buf == NULL) {
|
||||
/* try smaller size */
|
||||
alloc_len = new_length;
|
||||
temp_buf = realloc(m->buf, alloc_len + 1);
|
||||
if (temp_buf == NULL) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
}
|
||||
/* save */
|
||||
m->buf = temp_buf;
|
||||
m->capacity = alloc_len;
|
||||
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 );
|
||||
if( temp_buf == NULL ) {
|
||||
// try smaller size
|
||||
alloc_len = new_length;
|
||||
temp_buf = realloc( m->buf, alloc_len + 1 );
|
||||
|
||||
if( temp_buf == NULL ) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
}
|
||||
// save
|
||||
m->buf = temp_buf;
|
||||
m->capacity = alloc_len;
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* membuffer_init
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixml_membuf_init( INOUT ixml_membuf * m )
|
||||
{
|
||||
assert( m != NULL );
|
||||
|
||||
m->size_inc = MEMBUF_DEF_SIZE_INC;
|
||||
m->buf = NULL;
|
||||
m->length = 0;
|
||||
m->capacity = 0;
|
||||
void ixml_membuf_init(ixml_membuf *m)
|
||||
{
|
||||
assert(m != NULL);
|
||||
|
||||
m->size_inc = MEMBUF_DEF_SIZE_INC;
|
||||
m->buf = NULL;
|
||||
m->length = 0;
|
||||
m->capacity = 0;
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* membuffer_destroy
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixml_membuf_destroy( INOUT ixml_membuf * m )
|
||||
{
|
||||
if( m == NULL ) {
|
||||
return;
|
||||
}
|
||||
|
||||
free( m->buf );
|
||||
ixml_membuf_init( m );
|
||||
void ixml_membuf_destroy(ixml_membuf *m)
|
||||
{
|
||||
if (m == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
free(m->buf);
|
||||
ixml_membuf_init(m);
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixml_membuf_assign
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixml_membuf_assign( INOUT ixml_membuf * m,
|
||||
IN const void *buf,
|
||||
IN size_t buf_len )
|
||||
|
||||
int ixml_membuf_assign(
|
||||
ixml_membuf *m,
|
||||
const void *buf,
|
||||
size_t buf_len)
|
||||
{
|
||||
int return_code;
|
||||
int return_code;
|
||||
|
||||
assert( m != NULL );
|
||||
assert(m != NULL);
|
||||
|
||||
// set value to null
|
||||
if( buf == NULL ) {
|
||||
ixml_membuf_destroy( m );
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
// alloc mem
|
||||
return_code = ixml_membuf_set_size( m, buf_len );
|
||||
if( return_code != 0 ) {
|
||||
return return_code;
|
||||
}
|
||||
// copy
|
||||
memcpy( m->buf, buf, buf_len );
|
||||
m->buf[buf_len] = 0; // null-terminate
|
||||
// set value to null
|
||||
if (buf == NULL) {
|
||||
ixml_membuf_destroy(m);
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
// alloc mem
|
||||
return_code = ixml_membuf_set_size(m, buf_len);
|
||||
if (return_code != 0) {
|
||||
return return_code;
|
||||
}
|
||||
|
||||
m->length = buf_len;
|
||||
// copy
|
||||
memcpy(m->buf, buf, buf_len);
|
||||
|
||||
return IXML_SUCCESS;
|
||||
// null-terminate
|
||||
m->buf[buf_len] = 0;
|
||||
m->length = buf_len;
|
||||
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixml_membuf_assign_str
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixml_membuf_assign_str( INOUT ixml_membuf * m,
|
||||
IN const char *c_str )
|
||||
|
||||
int ixml_membuf_assign_str(
|
||||
ixml_membuf *m,
|
||||
const char *c_str)
|
||||
{
|
||||
return ixml_membuf_assign( m, c_str, strlen( c_str ) );
|
||||
return ixml_membuf_assign(m, c_str, strlen(c_str));
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixml_membuf_append
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixml_membuf_append( INOUT ixml_membuf * m,
|
||||
IN const void *buf )
|
||||
{
|
||||
assert( m != NULL );
|
||||
|
||||
return ixml_membuf_insert( m, buf, 1, m->length );
|
||||
int ixml_membuf_append(
|
||||
INOUT ixml_membuf *m,
|
||||
IN const void *buf)
|
||||
{
|
||||
assert(m != NULL);
|
||||
|
||||
return ixml_membuf_insert(m, buf, 1, m->length);
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixml_membuf_append_str
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixml_membuf_append_str( INOUT ixml_membuf * m,
|
||||
IN const char *c_str )
|
||||
|
||||
int ixml_membuf_append_str(
|
||||
INOUT ixml_membuf *m,
|
||||
IN const char *c_str)
|
||||
{
|
||||
return ixml_membuf_insert( m, c_str, strlen( c_str ), m->length );
|
||||
return ixml_membuf_insert(m, c_str, strlen(c_str), m->length);
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixml_membuf_insert
|
||||
*
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixml_membuf_insert( INOUT ixml_membuf * m,
|
||||
IN const void *buf,
|
||||
IN size_t buf_len,
|
||||
int index )
|
||||
|
||||
int ixml_membuf_insert(
|
||||
INOUT ixml_membuf *m,
|
||||
IN const void *buf,
|
||||
IN size_t buf_len,
|
||||
int index)
|
||||
{
|
||||
int return_code;
|
||||
int return_code = 0;
|
||||
|
||||
assert( m != NULL );
|
||||
assert(m != NULL);
|
||||
|
||||
if( index < 0 || index > ( int )m->length )
|
||||
return IXML_INDEX_SIZE_ERR;
|
||||
if (index < 0 || index > (int)m->length) {
|
||||
return IXML_INDEX_SIZE_ERR;
|
||||
}
|
||||
|
||||
if( buf == NULL || buf_len == 0 ) {
|
||||
return 0;
|
||||
}
|
||||
// alloc mem
|
||||
return_code = ixml_membuf_set_size( m, m->length + buf_len );
|
||||
if( return_code != 0 ) {
|
||||
return return_code;
|
||||
}
|
||||
// insert data
|
||||
// move data to right of insertion point
|
||||
memmove( m->buf + index + buf_len, m->buf + index, m->length - index );
|
||||
memcpy( m->buf + index, buf, buf_len );
|
||||
m->length += buf_len;
|
||||
m->buf[m->length] = 0; // null-terminate
|
||||
if (buf == NULL || buf_len == 0) {
|
||||
return 0;
|
||||
}
|
||||
/* alloc mem */
|
||||
return_code = ixml_membuf_set_size(m, m->length + buf_len);
|
||||
if (return_code != 0) {
|
||||
return return_code;
|
||||
}
|
||||
/* insert data */
|
||||
/* move data to right of insertion point */
|
||||
memmove(m->buf + index + buf_len, m->buf + index, m->length - index);
|
||||
memcpy(m->buf + index, buf, buf_len);
|
||||
m->length += buf_len;
|
||||
/* Null terminate */
|
||||
m->buf[m->length] = 0;
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,242 +1,195 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/**************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "ixmlparser.h"
|
||||
|
||||
/*================================================================
|
||||
* NamedNodeMap_getItemNumber
|
||||
* return the item number of a item in NamedNodeMap.
|
||||
* Internal to parser only.
|
||||
* Parameters:
|
||||
* name: the name of the item to find
|
||||
*
|
||||
*=================================================================*/
|
||||
unsigned long
|
||||
ixmlNamedNodeMap_getItemNumber( IN IXML_NamedNodeMap * nnMap,
|
||||
IN const char *name )
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h> /* for free(), malloc() */
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Return the item number of a item in NamedNodeMap.
|
||||
*/
|
||||
static unsigned long ixmlNamedNodeMap_getItemNumber(
|
||||
/*! [in] The named node map to process. */
|
||||
IN IXML_NamedNodeMap *nnMap,
|
||||
/*! [in] The name of the item to find. */
|
||||
IN const char *name)
|
||||
{
|
||||
IXML_Node *tempNode;
|
||||
unsigned long returnItemNo = 0;
|
||||
IXML_Node *tempNode;
|
||||
unsigned long returnItemNo = 0;
|
||||
|
||||
assert( nnMap != NULL && name != NULL );
|
||||
if( ( nnMap == NULL ) || ( name == NULL ) ) {
|
||||
return IXML_INVALID_ITEM_NUMBER;
|
||||
}
|
||||
assert(nnMap != NULL && name != NULL);
|
||||
if (nnMap == NULL || name == NULL) {
|
||||
return IXML_INVALID_ITEM_NUMBER;
|
||||
}
|
||||
|
||||
tempNode = nnMap->nodeItem;
|
||||
while( tempNode != NULL ) {
|
||||
if( strcmp( name, tempNode->nodeName ) == 0 ) {
|
||||
return returnItemNo;
|
||||
}
|
||||
tempNode = nnMap->nodeItem;
|
||||
while (tempNode != NULL) {
|
||||
if (strcmp(name, tempNode->nodeName) == 0) {
|
||||
return returnItemNo;
|
||||
}
|
||||
tempNode = tempNode->nextSibling;
|
||||
returnItemNo++;
|
||||
}
|
||||
|
||||
tempNode = tempNode->nextSibling;
|
||||
returnItemNo++;
|
||||
}
|
||||
|
||||
return IXML_INVALID_ITEM_NUMBER;
|
||||
return IXML_INVALID_ITEM_NUMBER;
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* NamedNodeMap_init
|
||||
* Initializes a NamedNodeMap object.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlNamedNodeMap_init( IN IXML_NamedNodeMap * nnMap )
|
||||
|
||||
void ixmlNamedNodeMap_init(IXML_NamedNodeMap *nnMap)
|
||||
{
|
||||
assert( nnMap != NULL );
|
||||
memset( nnMap, 0, sizeof( IXML_NamedNodeMap ) );
|
||||
assert(nnMap != NULL);
|
||||
|
||||
memset(nnMap, 0, sizeof (IXML_NamedNodeMap));
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* NamedNodeMap_getNamedItem
|
||||
* Retrieves a node specified by name.
|
||||
* External function.
|
||||
*
|
||||
* Parameter:
|
||||
* name: type nodeName of a node to retrieve.
|
||||
*
|
||||
* Return Value:
|
||||
* A Node with the specified nodeName, or null if it
|
||||
* does not identify any node in this map.
|
||||
*
|
||||
*=================================================================*/
|
||||
IXML_Node *
|
||||
ixmlNamedNodeMap_getNamedItem( IN IXML_NamedNodeMap * nnMap,
|
||||
IN const char *name )
|
||||
|
||||
IXML_Node *ixmlNamedNodeMap_getNamedItem(
|
||||
IXML_NamedNodeMap *nnMap,
|
||||
const DOMString name)
|
||||
{
|
||||
long index;
|
||||
long index;
|
||||
|
||||
if( ( nnMap == NULL ) || ( name == NULL ) ) {
|
||||
return NULL;
|
||||
}
|
||||
if (nnMap == NULL || name == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
index = ixmlNamedNodeMap_getItemNumber( nnMap, name );
|
||||
if( index == IXML_INVALID_ITEM_NUMBER ) {
|
||||
return NULL;
|
||||
} else {
|
||||
return ( ixmlNamedNodeMap_item( nnMap, ( unsigned long )index ) );
|
||||
}
|
||||
index = ixmlNamedNodeMap_getItemNumber(nnMap, name);
|
||||
if (index == IXML_INVALID_ITEM_NUMBER) {
|
||||
return NULL;
|
||||
} else {
|
||||
return ixmlNamedNodeMap_item(nnMap, (unsigned long)index);
|
||||
}
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* NamedNodeMap_item
|
||||
* Returns the indexth item in the map. If index is greater than or
|
||||
* equal to the number of nodes in this map, this returns null.
|
||||
* External function.
|
||||
*
|
||||
* Parameter:
|
||||
* index: index into this map.
|
||||
*
|
||||
* Return Value:
|
||||
* The node at the indexth position in the map, or null if that is
|
||||
* not a valid index.
|
||||
*
|
||||
*=================================================================*/
|
||||
IXML_Node *
|
||||
ixmlNamedNodeMap_item( IN IXML_NamedNodeMap * nnMap,
|
||||
IN unsigned long index )
|
||||
|
||||
IXML_Node *ixmlNamedNodeMap_item(
|
||||
IN IXML_NamedNodeMap *nnMap,
|
||||
IN unsigned long index )
|
||||
{
|
||||
IXML_Node *tempNode;
|
||||
unsigned int i;
|
||||
IXML_Node *tempNode;
|
||||
unsigned int i;
|
||||
|
||||
if( nnMap == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
if (nnMap == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if( index > ixmlNamedNodeMap_getLength( nnMap ) - 1 ) {
|
||||
return NULL;
|
||||
}
|
||||
if (index > ixmlNamedNodeMap_getLength(nnMap) - 1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tempNode = nnMap->nodeItem;
|
||||
for( i = 0; i < index && tempNode != NULL; ++i ) {
|
||||
tempNode = tempNode->nextSibling;
|
||||
}
|
||||
tempNode = nnMap->nodeItem;
|
||||
for (i = 0; i < index && tempNode != NULL; ++i) {
|
||||
tempNode = tempNode->nextSibling;
|
||||
}
|
||||
|
||||
return tempNode;
|
||||
return tempNode;
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* NamedNodeMap_getLength
|
||||
* Return the number of Nodes in this map.
|
||||
* External function.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
*=================================================================*/
|
||||
unsigned long
|
||||
ixmlNamedNodeMap_getLength( IN IXML_NamedNodeMap * nnMap )
|
||||
{
|
||||
IXML_Node *tempNode;
|
||||
unsigned long length = 0;
|
||||
|
||||
if( nnMap != NULL ) {
|
||||
tempNode = nnMap->nodeItem;
|
||||
for( length = 0; tempNode != NULL; ++length ) {
|
||||
tempNode = tempNode->nextSibling;
|
||||
}
|
||||
}
|
||||
return length;
|
||||
unsigned long ixmlNamedNodeMap_getLength(IXML_NamedNodeMap *nnMap)
|
||||
{
|
||||
IXML_Node *tempNode;
|
||||
unsigned long length = 0;
|
||||
|
||||
if (nnMap != NULL) {
|
||||
tempNode = nnMap->nodeItem;
|
||||
for (length = 0; tempNode != NULL; ++length) {
|
||||
tempNode = tempNode->nextSibling;
|
||||
}
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlNamedNodeMap_free
|
||||
* frees a NamedNodeMap.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlNamedNodeMap_free( IXML_NamedNodeMap * nnMap )
|
||||
{
|
||||
IXML_NamedNodeMap *pNext;
|
||||
|
||||
while( nnMap != NULL ) {
|
||||
pNext = nnMap->next;
|
||||
free( nnMap );
|
||||
nnMap = pNext;
|
||||
}
|
||||
void ixmlNamedNodeMap_free(IXML_NamedNodeMap *nnMap)
|
||||
{
|
||||
IXML_NamedNodeMap *pNext;
|
||||
|
||||
while (nnMap != NULL) {
|
||||
pNext = nnMap->next;
|
||||
free(nnMap);
|
||||
nnMap = pNext;
|
||||
}
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* NamedNodeMap_addToNamedNodeMap
|
||||
* add a node to a NamedNodeMap.
|
||||
* Internal to parser only.
|
||||
* Parameters:
|
||||
* add: the node to add into NamedNodeMap.
|
||||
* Return:
|
||||
* IXML_SUCCESS or failure.
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixmlNamedNodeMap_addToNamedNodeMap( IN IXML_NamedNodeMap ** nnMap,
|
||||
IN IXML_Node * add )
|
||||
|
||||
int ixmlNamedNodeMap_addToNamedNodeMap(
|
||||
IXML_NamedNodeMap **nnMap,
|
||||
IXML_Node *add)
|
||||
{
|
||||
IXML_NamedNodeMap *traverse = NULL,
|
||||
*p = NULL;
|
||||
IXML_NamedNodeMap *newItem = NULL;
|
||||
IXML_NamedNodeMap *traverse = NULL;
|
||||
IXML_NamedNodeMap *p = NULL;
|
||||
IXML_NamedNodeMap *newItem = NULL;
|
||||
|
||||
if( add == NULL ) {
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
if(add == NULL) {
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
|
||||
if( *nnMap == NULL ) // nodelist is empty
|
||||
{
|
||||
*nnMap =
|
||||
( IXML_NamedNodeMap * ) malloc( sizeof( IXML_NamedNodeMap ) );
|
||||
if( *nnMap == NULL ) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
ixmlNamedNodeMap_init( *nnMap );
|
||||
}
|
||||
if (*nnMap == NULL) {
|
||||
// nodelist is empty
|
||||
*nnMap = (IXML_NamedNodeMap *)malloc(sizeof (IXML_NamedNodeMap));
|
||||
if (*nnMap == NULL) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
ixmlNamedNodeMap_init(*nnMap);
|
||||
}
|
||||
if ((*nnMap)->nodeItem == NULL) {
|
||||
(*nnMap)->nodeItem = add;
|
||||
} else {
|
||||
traverse = *nnMap;
|
||||
p = traverse;
|
||||
while (traverse != NULL) {
|
||||
p = traverse;
|
||||
traverse = traverse->next;
|
||||
}
|
||||
newItem = (IXML_NamedNodeMap *)malloc(sizeof (IXML_NamedNodeMap));
|
||||
if (newItem == NULL) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
p->next = newItem;
|
||||
newItem->nodeItem = add;
|
||||
newItem->next = NULL;
|
||||
}
|
||||
|
||||
if( ( *nnMap )->nodeItem == NULL ) {
|
||||
( *nnMap )->nodeItem = add;
|
||||
} else {
|
||||
traverse = *nnMap;
|
||||
p = traverse;
|
||||
while( traverse != NULL ) {
|
||||
p = traverse;
|
||||
traverse = traverse->next;
|
||||
}
|
||||
|
||||
newItem =
|
||||
( IXML_NamedNodeMap * ) malloc( sizeof( IXML_NamedNodeMap ) );
|
||||
if( newItem == NULL ) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
p->next = newItem;
|
||||
newItem->nodeItem = add;
|
||||
newItem->next = NULL;
|
||||
}
|
||||
|
||||
return IXML_SUCCESS;
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
2790
ixml/src/node.c
2790
ixml/src/node.c
File diff suppressed because it is too large
Load Diff
@@ -1,176 +1,152 @@
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (c) 2000-2003 Intel Corporation
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
// * Neither name of Intel Corporation nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Copyright (c) 2000-2003 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* - Neither name of Intel Corporation nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/*!
|
||||
* \file
|
||||
*/
|
||||
|
||||
|
||||
#include "ixmlparser.h"
|
||||
|
||||
/*================================================================
|
||||
* ixmlNodeList_init
|
||||
* initializes a nodelist
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlNodeList_init( IXML_NodeList * nList )
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
void ixmlNodeList_init(IXML_NodeList *nList)
|
||||
{
|
||||
assert( nList != NULL );
|
||||
|
||||
memset( nList, 0, sizeof( IXML_NodeList ) );
|
||||
assert(nList != NULL);
|
||||
|
||||
memset(nList, 0, sizeof (IXML_NodeList));
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlNodeList_item
|
||||
* Returns the indexth item in the collection. If index is greater
|
||||
* than or equal to the number of nodes in the list, this returns
|
||||
* null.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
IXML_Node *
|
||||
ixmlNodeList_item( IXML_NodeList * nList,
|
||||
unsigned long index )
|
||||
|
||||
IXML_Node *ixmlNodeList_item(
|
||||
IXML_NodeList *nList,
|
||||
unsigned long index)
|
||||
{
|
||||
IXML_NodeList *next;
|
||||
unsigned int i;
|
||||
IXML_NodeList *next;
|
||||
unsigned int i;
|
||||
|
||||
// if the list ptr is NULL
|
||||
if( nList == NULL ) {
|
||||
return NULL;
|
||||
}
|
||||
// if index is more than list length
|
||||
if( index > ixmlNodeList_length( nList ) - 1 ) {
|
||||
return NULL;
|
||||
}
|
||||
// if the list ptr is NULL
|
||||
if (nList == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
// if index is more than list length
|
||||
if (index > ixmlNodeList_length(nList) - 1) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
next = nList;
|
||||
for( i = 0; i < index && next != NULL; ++i ) {
|
||||
next = next->next;
|
||||
}
|
||||
next = nList;
|
||||
for (i = 0; i < index && next != NULL; ++i) {
|
||||
next = next->next;
|
||||
}
|
||||
|
||||
if( next == NULL ) return NULL;
|
||||
|
||||
return next->nodeItem;
|
||||
if (next == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return next->nodeItem;
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlNodeList_addToNodeList
|
||||
* Add a node to nodelist
|
||||
* Internal to parser only.
|
||||
*
|
||||
*=================================================================*/
|
||||
int
|
||||
ixmlNodeList_addToNodeList( IN IXML_NodeList ** nList,
|
||||
IN IXML_Node * add )
|
||||
int ixmlNodeList_addToNodeList(
|
||||
IXML_NodeList **nList,
|
||||
IXML_Node *add)
|
||||
{
|
||||
IXML_NodeList *traverse,
|
||||
*p = NULL;
|
||||
IXML_NodeList *newListItem;
|
||||
IXML_NodeList *traverse = NULL;
|
||||
IXML_NodeList *p = NULL;
|
||||
IXML_NodeList *newListItem;
|
||||
|
||||
assert( add != NULL );
|
||||
assert(add != NULL);
|
||||
|
||||
if( add == NULL ) {
|
||||
return IXML_FAILED;
|
||||
}
|
||||
if (add == NULL) {
|
||||
return IXML_FAILED;
|
||||
}
|
||||
|
||||
if( *nList == NULL ) // nodelist is empty
|
||||
{
|
||||
*nList = ( IXML_NodeList * ) malloc( sizeof( IXML_NodeList ) );
|
||||
if( *nList == NULL ) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
if (*nList == NULL) {
|
||||
// nodelist is empty
|
||||
*nList = (IXML_NodeList *)malloc(sizeof (IXML_NodeList));
|
||||
if (*nList == NULL) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
|
||||
ixmlNodeList_init( *nList );
|
||||
}
|
||||
ixmlNodeList_init(*nList);
|
||||
}
|
||||
|
||||
if( ( *nList )->nodeItem == NULL ) {
|
||||
( *nList )->nodeItem = add;
|
||||
} else {
|
||||
traverse = *nList;
|
||||
while( traverse != NULL ) {
|
||||
p = traverse;
|
||||
traverse = traverse->next;
|
||||
}
|
||||
if ((*nList)->nodeItem == NULL) {
|
||||
(*nList)->nodeItem = add;
|
||||
} else {
|
||||
traverse = *nList;
|
||||
while (traverse != NULL) {
|
||||
p = traverse;
|
||||
traverse = traverse->next;
|
||||
}
|
||||
|
||||
newListItem =
|
||||
( IXML_NodeList * ) malloc( sizeof( IXML_NodeList ) );
|
||||
if( newListItem == NULL ) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
p->next = newListItem;
|
||||
newListItem->nodeItem = add;
|
||||
newListItem->next = NULL;
|
||||
}
|
||||
newListItem = (IXML_NodeList *)malloc(sizeof (IXML_NodeList));
|
||||
if (newListItem == NULL) {
|
||||
return IXML_INSUFFICIENT_MEMORY;
|
||||
}
|
||||
p->next = newListItem;
|
||||
newListItem->nodeItem = add;
|
||||
newListItem->next = NULL;
|
||||
}
|
||||
|
||||
return IXML_SUCCESS;
|
||||
return IXML_SUCCESS;
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlNodeList_length
|
||||
* Returns the number of nodes in the list. The range of valid
|
||||
* child node indices is 0 to length-1 inclusive.
|
||||
* External function.
|
||||
*
|
||||
*=================================================================*/
|
||||
unsigned long
|
||||
ixmlNodeList_length( IN IXML_NodeList * nList )
|
||||
|
||||
unsigned long ixmlNodeList_length(IXML_NodeList *nList)
|
||||
{
|
||||
IXML_NodeList *list;
|
||||
unsigned long length = 0;
|
||||
IXML_NodeList *list;
|
||||
unsigned long length = 0;
|
||||
|
||||
list = nList;
|
||||
while( list != NULL ) {
|
||||
++length;
|
||||
list = list->next;
|
||||
}
|
||||
list = nList;
|
||||
while (list != NULL) {
|
||||
++length;
|
||||
list = list->next;
|
||||
}
|
||||
|
||||
return length;
|
||||
return length;
|
||||
}
|
||||
|
||||
/*================================================================
|
||||
* ixmlNodeList_free
|
||||
* frees a nodeList
|
||||
* External function
|
||||
*
|
||||
*=================================================================*/
|
||||
void
|
||||
ixmlNodeList_free( IN IXML_NodeList * nList )
|
||||
|
||||
void ixmlNodeList_free(IXML_NodeList *nList)
|
||||
{
|
||||
IXML_NodeList *next;
|
||||
|
||||
while( nList != NULL ) {
|
||||
next = nList->next;
|
||||
|
||||
free( nList );
|
||||
nList = next;
|
||||
}
|
||||
IXML_NodeList *next;
|
||||
|
||||
while (nList != NULL) {
|
||||
next = nList->next;
|
||||
free(nList);
|
||||
nList = next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user