📄 ixmlparser.c
字号:
Parser_appendTokBufStr( xmlParser, uch ); psrc += cl; } } if( psrc > pend ) { return IXML_FAILED; } else { return IXML_SUCCESS; // success }}/*==============================================================================*** Parser_skipString* Skips all characters in the string until it finds the skip key.* Then it skips the skip key and returns.* Internal to parser only**===============================================================================*/static intParser_skipString( INOUT char **pstrSrc, IN const char *strSkipKey ){ if( !( *pstrSrc ) || !strSkipKey ) { return IXML_FAILED; } while( ( **pstrSrc ) && strncmp( *pstrSrc, strSkipKey, strlen( strSkipKey ) ) != 0 ) { ( *pstrSrc )++; } if( **pstrSrc == '\0' ) { return IXML_SYNTAX_ERR; } *pstrSrc = *pstrSrc + strlen( strSkipKey ); return IXML_SUCCESS; //success}/*==============================================================================*** Function: * Returns: * **===============================================================================*/static intParser_skipPI( INOUT char **pSrc ){ char *pEnd = NULL; assert( *pSrc ); if( *pSrc == NULL ) { return IXML_FAILED; } if( ( strncasecmp( *pSrc, ( char * )XMLDECL, strlen( XMLDECL ) ) == 0 ) || ( strncasecmp( *pSrc, ( char * )XMLDECL2, strlen( XMLDECL2 ) ) == 0 ) ) { // not allowed return IXML_SYNTAX_ERR; } if( strncasecmp( *pSrc, ( char * )BEGIN_PI, strlen( BEGIN_PI ) ) == 0 ) { pEnd = strstr( *pSrc, END_PI ); if( ( pEnd != NULL ) && ( pEnd != *pSrc ) ) { *pSrc = pEnd + strlen( BEGIN_PI ); } else { return IXML_SYNTAX_ERR; } } return IXML_SUCCESS;}/*==============================================================================** Parser_skipXMLDecl: * skips XML declarations.* Internal only to parser. **===============================================================================*/static intParser_skipXMLDecl( INOUT Parser * xmlParser ){ int rc = IXML_FAILED; assert( xmlParser ); if( xmlParser == NULL ) { return rc; } rc = Parser_skipString( &( xmlParser->curPtr ), END_PI ); Parser_skipWhiteSpaces( xmlParser ); return rc;}/*==============================================================================** Parser_skipProlog* skip prolog* Internal to parser only. **===============================================================================*/static intParser_skipProlog( INOUT Parser * xmlParser ){ int rc = IXML_SUCCESS; assert( xmlParser != NULL ); if( xmlParser == NULL ) { return IXML_FAILED; } Parser_skipWhiteSpaces( xmlParser ); if( strncmp( xmlParser->curPtr, ( char * )XMLDECL, strlen( XMLDECL ) ) == 0 ) { // <?xml rc = Parser_skipXMLDecl( xmlParser ); if( rc != IXML_SUCCESS ) { return rc; } } rc = Parser_skipMisc( xmlParser ); if( ( rc == IXML_SUCCESS ) && strncmp( xmlParser->curPtr, ( char * )BEGIN_DOCTYPE, strlen( BEGIN_DOCTYPE ) ) == 0 ) { // <! DOCTYPE xmlParser->curPtr++; rc = Parser_skipDocType( &( xmlParser->curPtr ) ); } if( rc == IXML_SUCCESS ) { rc = Parser_skipMisc( xmlParser ); } return rc;}/*==============================================================================*** Function:* Returns:* Skips all characters in the string until it finds the skip key.* Then it skips the skip key and returns.**===============================================================================*/static intParser_skipComment( INOUT char **pstrSrc ){ char *pStrFound = NULL; assert( ( *pstrSrc ) != NULL ); if( *pstrSrc == NULL ) { return IXML_FAILED; } pStrFound = strstr( *pstrSrc, END_COMMENT ); if( ( pStrFound != NULL ) && ( pStrFound != *pstrSrc ) && ( *( pStrFound - 1 ) != '-' ) ) { *pstrSrc = pStrFound + strlen( END_COMMENT ); } else { return IXML_SYNTAX_ERR; } return IXML_SUCCESS;}/*==============================================================================** Parser_skipDocType* skips document type declaration**===============================================================================*/static intParser_skipDocType( INOUT char **pstr ){ char *pCur = *pstr; char *pNext = NULL; // default there is no nested < int num = 1; assert( ( *pstr ) != NULL ); if( *pstr == NULL ) { return IXML_FAILED; } while( ( pCur != NULL ) && ( num != 0 ) && ( *pCur != 0 ) ) { if( *pCur == '<' ) { num++; } else if( *pCur == '>' ) { num--; } else if( *pCur == '"' ) { pNext = strchr( pCur + 1, '"' ); if( pNext == NULL ) { return IXML_SYNTAX_ERR; } pCur = pNext; } pCur++; } if( num == 0 ) { *pstr = pCur; return IXML_SUCCESS; } else { return IXML_SYNTAX_ERR; }}/*==============================================================================*** Parser_skipMisc: * skip comment, PI and white space * **===============================================================================*/static intParser_skipMisc( IN Parser * xmlParser ){ int rc = IXML_SUCCESS; int done = FALSE; while( ( done == FALSE ) && ( rc == IXML_SUCCESS ) ) { if( strncasecmp( xmlParser->curPtr, ( char * )BEGIN_COMMENT, strlen( BEGIN_COMMENT ) ) == 0 ) { // <!-- rc = Parser_skipComment( &( xmlParser->curPtr ) ); } else if( ( strncasecmp( xmlParser->curPtr, ( char * )XMLDECL, strlen( XMLDECL ) ) == 0 ) || ( strncasecmp( xmlParser->curPtr, ( char * )XMLDECL2, strlen( XMLDECL2 ) ) == 0 ) ) { // <?xml or <?xml? rc = IXML_SYNTAX_ERR; } else if( strncasecmp( xmlParser->curPtr, ( char * )BEGIN_PI, strlen( BEGIN_PI ) ) == 0 ) { // <? rc = Parser_skipString( &( xmlParser->curPtr ), END_PI ); } else { done = TRUE; } Parser_skipWhiteSpaces( xmlParser ); } return rc;}/*==============================================================================*** Parser_getNextToken* return the length of next token in tokenBuff* **===============================================================================*/static intParser_getNextToken( IN Parser * xmlParser ){ int tokenLength = 0; int temp, tlen; int rc; Parser_clearTokenBuf( xmlParser ); if( *( xmlParser->curPtr ) == '\0' ) { return 0; } // skip XML instructions rc = Parser_skipMisc( xmlParser ); if( rc != IXML_SUCCESS ) { return 0; } // Attribute value logic must come first, since all text untokenized until end-quote if( *( xmlParser->curPtr ) == QUOTE ) { tokenLength = 1; } else if( *( xmlParser->curPtr ) == SINGLEQUOTE ) { tokenLength = 1; } else if( *( xmlParser->curPtr ) == LESSTHAN ) { // Check for start tags temp = Parser_UTF8ToInt( xmlParser->curPtr + 1, &tlen ); if( temp == '/' ) { tokenLength = 2; // token is '</' end tag } else if( Parser_isNameChar( temp, FALSE ) == TRUE ) { tokenLength = 1; // '<' found, so return '<' token } else { return 0; //error } } else if( *( xmlParser->curPtr ) == EQUALS ) { // Check for '=' token, return it as a token tokenLength = 1; } else if( *( xmlParser->curPtr ) == SLASH ) { if( *( xmlParser->curPtr + 1 ) == GREATERTHAN ) { // token '/>' found tokenLength = 2; xmlParser->savePtr = xmlParser->curPtr; // fix } } else if( *( xmlParser->curPtr ) == GREATERTHAN ) { // > found, so return it as a token tokenLength = 1; } else if( Parser_isNameChar( Parser_UTF8ToInt( xmlParser->curPtr, &tlen ), FALSE ) ) { // Check for name tokens, name found, so find out how long it is int iIndex = tlen; while( Parser_isNameChar ( Parser_UTF8ToInt( xmlParser->curPtr + iIndex, &tlen ), TRUE ) ) { iIndex += tlen; } tokenLength = iIndex; } else { return 0; } // Copy the token to the return string if( Parser_copyToken( xmlParser, xmlParser->curPtr, tokenLength ) != IXML_SUCCESS ) { return 0; } xmlParser->curPtr += tokenLength; return tokenLength;}/*==============================================================================*** Parser_getNameSpace * return the namespce as defined as prefix.* Internal to parser only **===============================================================================*/static char *Parser_getNameSpace( IN Parser * xmlParser, IN char *prefix ){ IXML_ElementStack *pCur; IXML_NamespaceURI *pNsUri; pCur = xmlParser->pCurElement; if( strcmp( pCur->prefix, prefix ) != 0 ) { pNsUri = pCur->pNsURI; while( pNsUri != NULL ) { if( strcmp( pNsUri->prefix, prefix ) == 0 ) { return pNsUri->nsURI; } pNsUri = pNsUri->nextNsURI; } } else { return pCur->namespaceUri; } return NULL;}/*==============================================================================*** Parser_addNamespace* Add a namespace definition* Internal to parser only **===============================================================================*/static intParser_addNamespace( IN Parser * xmlParser ){ IXML_Node *pNode; IXML_ElementStack *pCur; char *namespaceUri; pNode = xmlParser->pNeedPrefixNode; pCur = xmlParser->pCurElement; if( pNode->prefix == NULL ) { // element does not have prefix if( strcmp( pNode->nodeName, pCur->element ) != 0 ) { return IXML_FAILED; } if( pCur->namespaceUri != NULL ) { // it would be wrong that pNode->namespace != NULL. assert( pNode->namespaceURI == NULL ); pNode->namespaceURI = strdup( pCur->namespaceUri ); if( pNode->namespaceURI == NULL ) { return IXML_INSUFFICIENT_MEMORY; } } xmlParser->pNeedPrefixNode = NULL; } else { if( ( strcmp( pNode->nodeName, pCur->element ) != 0 ) && ( strcmp( pNode->prefix, pCur->prefix ) != 0 ) ) { return IXML_FAILED; } namespaceUri = Parser_getNameSpace( xmlParser, pCur->prefix ); if( namespaceUri != NULL ) { pNode->namespaceURI = strdup( namespaceUri ); if( pNode->namespaceURI == NULL ) { return IXML_INSUFFICIENT_MEMORY; } xmlParser->pNeedPrefixNode = NULL; } } return IXML_SUCCESS;}/*==============================================================================*** Parser_setNodePrefixAndLocalName* set the node prefix and localName as defined by the nodeName* in the form of ns:name* Internal to parser only. **===============================================================================*/intParser_setNodePrefixAndLocalName( IN IXML_Node * node ){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -