libUPnP  1.14.5
Data Structures | Macros | Typedefs | Functions | Variables
ixmlparser.c File Reference
#include "autoconfig.h"
#include "ixmlparser.h"
#include "ixmldebug.h"
#include <assert.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Include dependency graph for ixmlparser.c:

Data Structures

struct  char_info
 

Macros

#define LETTERTABLESIZE   (sizeof(Letter)/sizeof(Letter[0]))
 The size of the letter table array. More...
 
#define NAMECHARTABLESIZE   (sizeof(NameChar)/sizeof(NameChar[0]))
 The name char table array size. More...
 

Typedefs

typedef struct char_info char_info_t
 
typedef char utf8char[8]
 

Functions

static void Parser_freeElementStackItem (IXML_ElementStack *pItem)
 Frees one ElementStack item. More...
 
static void Parser_freeNsURI (IXML_NamespaceURI *pNsURI)
 Frees namespaceURI item. More...
 
static void Parser_free (Parser *xmlParser)
 Frees all temporary memory allocated by xmlparser. More...
 
static int Parser_skipDocType (char **pstr)
 Skips document type declaration. More...
 
static int Parser_skipString (char **pstrSrc, const char *strSkipKey)
 Skips all characters in the string until it finds the skip key. Then it skips the skip key and returns. More...
 
static void Parser_skipWhiteSpaces (Parser *xmlParser)
 Skip white spaces. More...
 
static int Parser_skipXMLDecl (Parser *xmlParser)
 Skips XML declarations. More...
 
static int Parser_skipComment (char **pstrSrc)
 Skips all characters in the string until it finds the skip key. Then it skips the skip key and returns. More...
 
static int Parser_skipMisc (Parser *xmlParser)
 Skip comment, PI and white space. More...
 
static int Parser_skipProlog (Parser *xmlParser)
 Skip prolog. More...
 
static int Parser_setLastElem (Parser *xmlParser, const char *s)
 Set the last element to be the given string. More...
 
static void Parser_clearTokenBuf (Parser *xmlParser)
 Clear token buffer. More...
 
static int Parser_UTF8ToInt (const char *ss, ptrdiff_t *len)
 In UTF-8, characters are encoded using sequences of 1 to 6 octets. This functions will return a UTF-8 character value and its octets number. More...
 
static int Parser_isCharInTable (int c, char_info_t *tbl, int sz)
 Will determine whether character c is in the table of tbl (either Letter table or NameChar table). More...
 
static int Parser_isNameChar (int c, int bNameChar)
 Check whether c (int) is in LetterTable or NameCharTable. More...
 
static int Parser_isXmlChar (int c)
 see XML 1.0 (2nd Edition) 2.2. More...
 
static int Parser_getChar (const char *src, ptrdiff_t *cLen)
 Returns next char value and its length. More...
 
static int Parser_appendTokBufChar (Parser *xmlParser, char c)
 Appends c to token buffer. More...
 
static int Parser_intToUTF8 (int c, utf8char s)
 Encodes a character to its UTF-8 character string, and return its length. More...
 
static int Parser_appendTokBufStr (Parser *xmlParser, const char *s)
 Appends string s to token buffer. More...
 
static int Parser_copyToken (Parser *xmlParser, const char *src, ptrdiff_t len)
 Copy string in src into xml parser token buffer. More...
 
static ptrdiff_t Parser_getNextToken (Parser *xmlParser)
 Return the length of next token in tokenBuff. More...
 
static char * safe_strdup (const char *s)
 Version of strdup() that handles NULL input. More...
 
static int Parser_processSTag (Parser *xmlParser, IXML_Node *node)
 Processes the STag as defined by XML spec. More...
 
static int Parser_skipPI (char **pSrc)
 
static int Parser_processCDSect (char **pSrc, IXML_Node *node)
 Processes CDSection as defined by XML spec. More...
 
static int Parser_processContent (Parser *xmlParser, IXML_Node *node)
 Processes the CONTENT as defined in XML spec. More...
 
static int Parser_processETag (Parser *xmlParser, IXML_Node *node, int *bETag)
 Process ETag as defined by XML spec. More...
 
static char * Parser_getNameSpace (Parser *xmlParser, const char *prefix)
 Unimplemented function. More...
 
static int Parser_addNamespace (Parser *xmlParser)
 Add a namespace definition. More...
 
static int Parser_xmlNamespace (Parser *xmlParser, IXML_Node *newNode)
 Add namespace definition. More...
 
static int Parser_processAttribute (Parser *xmlParser, IXML_Node *node)
 Processes attribute. More...
 
static int Parser_getNextNode (Parser *xmlParser, IXML_Node *node, int *bETag)
 Get the next node. More...
 
static int Parser_ElementPrefixDefined (Parser *xmlParser, IXML_Node *newNode, char **nsURI)
 Decides whether element's prefix is already defined. More...
 
static int Parser_setElementNamespace (IXML_Element *newElement, const char *nsURI)
 Set element's namespace. More...
 
static int isDuplicateAttribute (Parser *xmlParser, IXML_Node *newAttrNode)
 Reports whether the new attribute is the same as an existing one. More...
 
static int Parser_processAttributeName (IXML_Document *rootDoc, Parser *xmlParser, IXML_Node *newNode)
 Processes the attribute name. More...
 
static int Parser_pushElement (Parser *xmlParser, IXML_Node *newElement)
 Push a new element onto element stack. More...
 
static int isTopLevelElement (Parser *xmlParser)
 Reports whether there is a top level element in the parser. More...
 
static int Parser_hasDefaultNamespace (Parser *xmlParser, char **nsURI)
 Decide whether the current element has default namespace. More...
 
static int Parser_processElementName (IXML_Document *rootDoc, Parser *xmlParser, IXML_Node *newNode)
 Processes element name. More...
 
static int Parser_isValidEndElement (Parser *xmlParser, IXML_Node *newNode)
 Check if a new node->nodeName matches top of element stack. More...
 
static void Parser_popElement (Parser *xmlParser)
 Remove element from element stack. More...
 
static int Parser_eTagVerification (Parser *xmlParser, IXML_Node *newNode)
 Verifies endof element tag is the same as the openning element tag. More...
 
static int Parser_parseDocument (IXML_Document **retDoc, Parser *xmlParser)
 Parses the xml file and returns the DOM document tree. More...
 
int Parser_isValidXmlName (const DOMString name)
 Check to see whether name is a valid xml name. More...
 
void Parser_setErrorChar (char c)
 Sets the error character. More...
 
static ParserParser_init ()
 Initializes a xml parser. More...
 
static int Parser_readFileOrBuffer (Parser *xmlParser, const char *xmlFileName, int file)
 Read a xml file or buffer contents into xml parser. More...
 
int Parser_LoadDocument (IXML_Document **retDoc, const char *xmlFileName, int file)
 Parses a xml file and return the DOM tree. More...
 
void Parser_freeNodeContent (IXML_Node *nodeptr)
 Fees a node contents. More...
 
int Parser_setNodePrefixAndLocalName (IXML_Node *node)
 Set the node prefix and localName as defined by the nodeName in the form of ns:name. More...
 

Variables

static char g_error_char = '\0'
 
static const char LESSTHAN = '<'
 
static const char GREATERTHAN = '>'
 
static const char SLASH = '/'
 
static const char EQUALS = '='
 
static const char QUOTE = '\"'
 
static const char SINGLEQUOTE = '\''
 
static const char * WHITESPACE = "\n\t\r "
 
static const char * COMPLETETAG = "/>"
 
static const char * ENDTAG = "</"
 
static const char * XMLDECL = "<?xml "
 
static const char * XMLDECL2 = "<?xml?"
 
static const char * BEGIN_COMMENT = "<!--"
 
static const char * END_COMMENT = "-->"
 
static const char * BEGIN_PI = "<?"
 
static const char * END_PI = "?>"
 
static const char * BEGIN_DOCTYPE = "<!DOCTYPE"
 
static const char * CDSTART = "<![CDATA["
 
static const char * CDEND = "]]>"
 
static const char * DEC_NUMBERS = "0123456789"
 
static const char * HEX_NUMBERS = "0123456789ABCDEFabcdef"
 
static char_info_t Letter []
 The letter table contains all characters in XML 1.0 plus ":", "_" and ideographic. More...
 
static char_info_t NameChar []
 The NameChar table contains CombiningChar, Extender, Digit, '-', '.', less '_', ':'. More...
 

Macro Definition Documentation

◆ LETTERTABLESIZE

#define LETTERTABLESIZE   (sizeof(Letter)/sizeof(Letter[0]))

The size of the letter table array.

Referenced by Parser_isNameChar().

◆ NAMECHARTABLESIZE

#define NAMECHARTABLESIZE   (sizeof(NameChar)/sizeof(NameChar[0]))

The name char table array size.

Referenced by Parser_isNameChar().

Function Documentation

◆ isDuplicateAttribute()

static int isDuplicateAttribute ( Parser xmlParser,
IXML_Node newAttrNode 
)
static

Reports whether the new attribute is the same as an existing one.

Returns
1 if the new attribute is the same as an existing one.
Parameters
[in]xmlParserThe XML parser.
[in]newAttrNodeThe node attribute to compare.

◆ isTopLevelElement()

static int isTopLevelElement ( Parser xmlParser)
static

Reports whether there is a top level element in the parser.

Returns
1 if there is a top level element in the parser.
Parameters
[in]xmlParserThe XML parser.

◆ Parser_addNamespace()

static int Parser_addNamespace ( Parser xmlParser)
static

Add a namespace definition.

Parameters
[in]xmlParserThe XML parser.

◆ Parser_appendTokBufChar()

static int Parser_appendTokBufChar ( Parser xmlParser,
char  c 
)
static

Appends c to token buffer.

Parameters
[in]xmlParserThe XML parser.
[in]cThe character to append.

References ixml_membuf_append().

◆ Parser_appendTokBufStr()

static int Parser_appendTokBufStr ( Parser xmlParser,
const char *  s 
)
static

Appends string s to token buffer.

Parameters
[in]xmlParserThe XML parser.
[in]sThe string to append.

◆ Parser_clearTokenBuf()

static void Parser_clearTokenBuf ( Parser xmlParser)
static

Clear token buffer.

Parameters
[in]xmlParserThe XML parser.

References ixml_membuf_destroy().

Referenced by Parser_getNextToken().

◆ Parser_copyToken()

static int Parser_copyToken ( Parser xmlParser,
const char *  src,
ptrdiff_t  len 
)
static

Copy string in src into xml parser token buffer.

Parameters
[in]xmlParserThe XML parser.
[in]srcThe string to copy from.
[in]lenThe lenght to copy.

◆ Parser_ElementPrefixDefined()

static int Parser_ElementPrefixDefined ( Parser xmlParser,
IXML_Node newNode,
char **  nsURI 
)
static

Decides whether element's prefix is already defined.

Parameters
[in]xmlParserThe XML parser.
[in]newNodeThe Node to process.
[in,out]nsURIThe name space URI.

◆ Parser_eTagVerification()

static int Parser_eTagVerification ( Parser xmlParser,
IXML_Node newNode 
)
static

Verifies endof element tag is the same as the openning element tag.

Parameters
[in]xmlParserThe XML parser.
[in]newNodeThe Node to process.

◆ Parser_free()

static void Parser_free ( Parser xmlParser)
static

Frees all temporary memory allocated by xmlparser.

Parameters
[in]xmlParserThe XML parser.

References _Parser::dataBuffer, ixml_membuf_destroy(), Parser_freeElementStackItem(), and Parser_freeNsURI().

◆ Parser_freeElementStackItem()

static void Parser_freeElementStackItem ( IXML_ElementStack pItem)
static

Frees one ElementStack item.

Parameters
[in]pItemThe element stack item to free.

Referenced by Parser_free(), and Parser_popElement().

◆ Parser_freeNodeContent()

void Parser_freeNodeContent ( IXML_Node nodeptr)

Fees a node contents.

Parameters
[in]nodeptrThe Node to process.

◆ Parser_freeNsURI()

static void Parser_freeNsURI ( IXML_NamespaceURI pNsURI)
static

Frees namespaceURI item.

Parameters
[in]pNsURIThe name space URI item to free.

Referenced by Parser_free(), and Parser_popElement().

◆ Parser_getChar()

static int Parser_getChar ( const char *  src,
ptrdiff_t *  cLen 
)
static

Returns next char value and its length.

Parameters
[in]src.
[in,out]cLen.

References Parser_isXmlChar(), and Parser_UTF8ToInt().

◆ Parser_getNameSpace()

static char* Parser_getNameSpace ( Parser xmlParser,
const char *  prefix 
)
static

Unimplemented function.

Returns
IXML_SUCCESS.

Return the namespce as defined as prefix.

Parameters
[in]xmlParserThe XML parser.
[in]prefixThe prefix.

◆ Parser_getNextNode()

static int Parser_getNextNode ( Parser xmlParser,
IXML_Node node,
int *  bETag 
)
static

Get the next node.

Returns
IXML_SUCCESS and the next node or IXML_FILE_DONE or an error.
Parameters
[in]xmlParserThe XML parser.
[out]nodeThe XML parser.
[out]bETagThe XML parser.

◆ Parser_getNextToken()

static ptrdiff_t Parser_getNextToken ( Parser xmlParser)
static

Return the length of next token in tokenBuff.

Parameters
[in]xmlParserThe XML parser.

References _Parser::curPtr, Parser_clearTokenBuf(), and Parser_skipMisc().

Referenced by Parser_processSTag().

◆ Parser_hasDefaultNamespace()

static int Parser_hasDefaultNamespace ( Parser xmlParser,
char **  nsURI 
)
static

Decide whether the current element has default namespace.

Parameters
[in]xmlParserThe XML parser.
[in,out]nsURIThe name space URI.

◆ Parser_init()

static Parser* Parser_init ( )
static

Initializes a xml parser.

Returns
The parser object or NULL if there is not enough memory.

References ixml_membuf_init().

◆ Parser_intToUTF8()

static int Parser_intToUTF8 ( int  c,
utf8char  s 
)
static

Encodes a character to its UTF-8 character string, and return its length.

Returns
The length of the encoded string in bytes.
Parameters
[in]cThe character to encode.
[out]sThe resultant UTF-8 encoded string.

◆ Parser_isCharInTable()

static int Parser_isCharInTable ( int  c,
char_info_t tbl,
int  sz 
)
static

Will determine whether character c is in the table of tbl (either Letter table or NameChar table).

Returns
1 or 0.
Parameters
[in]cCharacter to check.
[in]tblTable to use.
[in]szSize of the table.

Referenced by Parser_isNameChar().

◆ Parser_isNameChar()

static int Parser_isNameChar ( int  c,
int  bNameChar 
)
static

Check whether c (int) is in LetterTable or NameCharTable.

Parameters
[in]cThe character to check.
[in]bNameChar1 if you also want to check in the NameChar table.

References LETTERTABLESIZE, NAMECHARTABLESIZE, and Parser_isCharInTable().

Referenced by Parser_isValidXmlName().

◆ Parser_isValidEndElement()

static int Parser_isValidEndElement ( Parser xmlParser,
IXML_Node newNode 
)
static

Check if a new node->nodeName matches top of element stack.

Returns
1 if matches.
Parameters
[in]xmlParserThe XML parser.
[in]newNodeThe node.

◆ Parser_isValidXmlName()

int Parser_isValidXmlName ( const DOMString  name)

Check to see whether name is a valid xml name.

Parameters
[in]nameThe string to be checked.

References Parser_isNameChar().

◆ Parser_isXmlChar()

static int Parser_isXmlChar ( int  c)
static

see XML 1.0 (2nd Edition) 2.2.

Parameters
[in]cThe character to check.

Referenced by Parser_getChar().

◆ Parser_LoadDocument()

int Parser_LoadDocument ( IXML_Document **  retDoc,
const char *  xmlFileName,
int  file 
)

Parses a xml file and return the DOM tree.

Parameters
[out]retDocThe output document tree.
[in]xmlFileNameThe file name or the buffer to copy, according to the parameter "file".
[in]file1 if you want to read from a file, 0 if xmlFileName is the buffer to copy to the parser.

◆ Parser_parseDocument()

static int Parser_parseDocument ( IXML_Document **  retDoc,
Parser xmlParser 
)
static

Parses the xml file and returns the DOM document tree.

Returns
Parameters
[out]retDocThe XML document.
[in]xmlParserThe XML parser.

◆ Parser_popElement()

static void Parser_popElement ( Parser xmlParser)
static

Remove element from element stack.

Parameters
[in]xmlParserThe XML parser.

References Parser_freeElementStackItem(), and Parser_freeNsURI().

◆ Parser_processAttribute()

static int Parser_processAttribute ( Parser xmlParser,
IXML_Node node 
)
static

Processes attribute.

Returns
IXML_SUCCESS or failure code.
Parameters
[in]xmlParserThe XML parser.
[in]nodeThe Node to process.

◆ Parser_processAttributeName()

static int Parser_processAttributeName ( IXML_Document rootDoc,
Parser xmlParser,
IXML_Node newNode 
)
static

Processes the attribute name.

Returns
IXML_SUCCESS if successful, otherwise or an error code.
Parameters
[in]rootDocThe XML document.
[in]xmlParserThe XML parser.
[in]newNodeThe Node to process.

◆ Parser_processCDSect()

static int Parser_processCDSect ( char **  pSrc,
IXML_Node node 
)
static

Processes CDSection as defined by XML spec.

Returns
Parameters
[in]pSrc.
[in]nodeThe Node to process.

◆ Parser_processContent()

static int Parser_processContent ( Parser xmlParser,
IXML_Node node 
)
static

Processes the CONTENT as defined in XML spec.

Parameters
[in]xmlParserThe XML parser.
[in]nodeThe Node to process.

◆ Parser_processElementName()

static int Parser_processElementName ( IXML_Document rootDoc,
Parser xmlParser,
IXML_Node newNode 
)
static

Processes element name.

Returns
IXML_SUCCESS if successful, otherwise or an error code.
Parameters
[in]rootDocThe XML document.
[in]xmlParserThe XML parser.
[in]newNodeThe Node to process.

◆ Parser_processETag()

static int Parser_processETag ( Parser xmlParser,
IXML_Node node,
int *  bETag 
)
static

Process ETag as defined by XML spec.

Parameters
[in]xmlParserThe XML parser.
[in]nodeThe Node to process.
[out]bETag.

◆ Parser_processSTag()

static int Parser_processSTag ( Parser xmlParser,
IXML_Node node 
)
static

Processes the STag as defined by XML spec.

Parameters
[in]xmlParserThe XML parser.
[in]nodeThe Node to process.

References Parser_getNextToken().

◆ Parser_pushElement()

static int Parser_pushElement ( Parser xmlParser,
IXML_Node newElement 
)
static

Push a new element onto element stack.

Returns
Parameters
[in]xmlParserThe XML parser.
[in]newElementThe element node to push.

◆ Parser_readFileOrBuffer()

static int Parser_readFileOrBuffer ( Parser xmlParser,
const char *  xmlFileName,
int  file 
)
static

Read a xml file or buffer contents into xml parser.

Parameters
[in]xmlParserThe XML parser.
[in]xmlFileNameThe file name or the buffer to copy, according to the parameter "file".
[in]file1 if you want to read from a file, 0 if xmlFileName is the buffer to copy to the parser.

◆ Parser_setElementNamespace()

static int Parser_setElementNamespace ( IXML_Element newElement,
const char *  nsURI 
)
static

Set element's namespace.

Parameters
[in]newElementThe Element Node to process.
[in]nsURIThe name space string.

◆ Parser_setErrorChar()

void Parser_setErrorChar ( char  c)

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.

Parameters
[in]cThe character to become the error character.

Referenced by ixmlRelaxParser().

◆ Parser_setLastElem()

static int Parser_setLastElem ( Parser xmlParser,
const char *  s 
)
static

Set the last element to be the given string.

Parameters
[in]xmlParserThe XML parser.
[in]sThe string to copy from.

◆ Parser_setNodePrefixAndLocalName()

int Parser_setNodePrefixAndLocalName ( IXML_Node node)

Set the node prefix and localName as defined by the nodeName in the form of ns:name.

Parameters
[in,out]nodeThe Node to process.

◆ Parser_skipComment()

static int Parser_skipComment ( char **  pstrSrc)
static

Skips all characters in the string until it finds the skip key. Then it skips the skip key and returns.

Parameters
[in,out]pstrSrcThe pointer to the skipped point.

◆ Parser_skipDocType()

static int Parser_skipDocType ( char **  pstr)
static

Skips document type declaration.

Parameters
[in,out]pstrThe pointer to the skipped point.

◆ Parser_skipMisc()

static int Parser_skipMisc ( Parser xmlParser)
static

Skip comment, PI and white space.

Parameters
[in]xmlParserThe XML parser.

Referenced by Parser_getNextToken().

◆ Parser_skipPI()

static int Parser_skipPI ( char **  pSrc)
static
Parameters
[in,out]pSrcThe pointer to the skipped point.

◆ Parser_skipProlog()

static int Parser_skipProlog ( Parser xmlParser)
static

Skip prolog.

Parameters
[in,out]xmlParserThe XML parser.

◆ Parser_skipString()

static int Parser_skipString ( char **  pstrSrc,
const char *  strSkipKey 
)
static

Skips all characters in the string until it finds the skip key. Then it skips the skip key and returns.

Parameters
[in,out]pstrSrcThe pointer to the skipped point.
[in]strSkipKeyThe skip key.

◆ Parser_skipWhiteSpaces()

static void Parser_skipWhiteSpaces ( Parser xmlParser)
static

Skip white spaces.

Parameters
[in]xmlParserThe XML parser.

References _Parser::curPtr.

◆ Parser_skipXMLDecl()

static int Parser_skipXMLDecl ( Parser xmlParser)
static

Skips XML declarations.

Parameters
[in,out]xmlParserThe XML parser.

◆ Parser_UTF8ToInt()

static int Parser_UTF8ToInt ( const char *  ss,
ptrdiff_t *  len 
)
static

In UTF-8, characters are encoded using sequences of 1 to 6 octets. This functions will return a UTF-8 character value and its octets number.

Returns
The UTF-8 character converted to an int (32 bits).
Parameters
[in]ssThe pointer to the character to encode.
[out]lenThe number of octets of the UTF-8 encoding of this character.

Referenced by Parser_getChar().

◆ Parser_xmlNamespace()

static int Parser_xmlNamespace ( Parser xmlParser,
IXML_Node newNode 
)
static

Add namespace definition.

Parameters
[in]xmlParserThe XML parser.
[in]newNodeThe Node to process.

◆ safe_strdup()

static char* safe_strdup ( const char *  s)
static

Version of strdup() that handles NULL input.

Returns
The same as strdup().
Parameters
[in]sString to be duplicated.

Variable Documentation

◆ Letter

char_info_t Letter[]
static

The letter table contains all characters in XML 1.0 plus ":", "_" and ideographic.

This table contains all the characters that an element name can start with. See XML 1.0 (2nd Edition) for more details.

◆ NameChar

char_info_t NameChar[]
static

The NameChar table contains CombiningChar, Extender, Digit, '-', '.', less '_', ':'.

NameChar ::= Digit | '-' | '.' | CombiningChar | Extender See XML 1.0 2nd Edition