📄 parser.c
字号:
Parser_skipUntilString (&pEndContent, END_COMMENT); else bReadContent = 0; if (!(*pEndContent)) bReadContent = 0; } TokenLength = pEndContent - pParser->CurrPtr; } } // Check for '>' token else if (char_match (*(pParser->CurrPtr), GREATERTHAN)) { // Equals found, so return it as a token TokenLength = strlen(GREATERTHAN); pParser->SavePtr=pParser->CurrPtr; // Saving this ptr for not ignoring the leading and trailing spaces. pParser->TagVal=1; } // Check for Content e.g. <tag>content</tag> else if (pParser->TagVal) { pParser->TagVal=0; pParser->CurrPtr=pParser->SavePtr+1;//SavePtr whould not have have already moved. char *pEndContent = pParser->CurrPtr; // Read content until a < is found that is not a comment <!-- short int bReadContent = 1; while (bReadContent) { while (!char_match (*pEndContent, LESSTHAN) && *pEndContent) pEndContent++; if (!strncmp (pEndContent, BEGIN_COMMENT, strlen (BEGIN_COMMENT))) Parser_skipUntilString (&pEndContent, END_COMMENT); else bReadContent = 0; if (!(*pEndContent)) bReadContent = 0; } TokenLength = pEndContent - pParser->CurrPtr; } // Check for name tokens else if (isnamech(toint(pParser->CurrPtr,&tlen),0)){ // Name found, so find out how long it is int iIndex=tlen; while (isnamech(toint(pParser->CurrPtr+iIndex,&tlen),1)) iIndex+=tlen; TokenLength=iIndex; }; // Copy the token to the return string if (TokenLength > 0){ //if (!copy_token (TokenBuff, pParser->CurrPtr, TokenLength)) if (!Parser_copy_token (pParser, pParser->CurrPtr, TokenLength)) return 1; } else if (*(pParser->CurrPtr) == '\0') { TokenLength = 0; Parser_clearTokBuf(pParser); return 0; } else { // return the unrecognized token for error information TokenLength = 1; //copy_token (TokenBuff, CurrPtr, TokenLength); Parser_appendTokBuf_char(pParser, *(pParser->CurrPtr)); return 1; } pParser->CurrPtr = pParser->CurrPtr+TokenLength; return 0;}//Will return a handle to the tree structure//The tree structure indicates to which parent the node belongs.int Parser_getNextNode(Parser *pParser, enum NODE_TYPE NodeType, char **NodeName, char **NodeValue, short int IsEnd, short int IgnoreWhiteSpace){ while(*(pParser->CurrPtr)!='\0') { if(IgnoreWhiteSpace) Parser_IgnoreWhiteSpaces(pParser); if(Parser_getNextToken(pParser)!=0) { *NodeValue=NULL; *NodeName=NULL; NodeType=INVALID_NODE; IsEnd=0; return 1; } //if(!strcmp(TokenBuff, LESSTHAN)) if(!strcmp(Parser_getTokBuf(pParser), LESSTHAN)) { if(IgnoreWhiteSpace) Parser_IgnoreWhiteSpaces(pParser); pParser->TagName=1; if(Parser_getNextToken(pParser)!=0) { *NodeValue=NULL; *NodeName=NULL; NodeType=INVALID_NODE; IsEnd=0; return 1; } pParser->TagName=0; //if(TokenBuff==NULL) // throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); //if(*TokenBuff=='\0') // throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); if (Parser_getTokBufLength(pParser) == 0) { Handle_DOMException(FATAL_ERROR_DURING_PARSING); //throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); } //*NodeName=(char *)malloc(strlen(TokenBuff)+1); *NodeName=(char *)malloc(Parser_getTokBufLength(pParser)+1); //strcpy(*NodeName,TokenBuff); strcpy(*NodeName,Parser_getTokBuf(pParser)); //strcpy(LastElement,TokenBuff); Parser_setLastElem(pParser, Parser_getTokBuf(pParser)); *NodeValue=NULL; NodeType=ELEMENT_NODE; pParser->attrFound=1; pParser->atLeastOneAttrFound=0; IsEnd=0; } //else if(!strcmp(TokenBuff, GREATERTHAN)) else if(!strcmp(Parser_getTokBuf(pParser), GREATERTHAN)) { pParser->attrFound=0; if(pParser->atLeastOneAttrFound)//forget the greater than { pParser->atLeastOneAttrFound=0; continue; } else return 0; } //else if(!strcmp(TokenBuff, ENDTAG)) else if(!strcmp(Parser_getTokBuf(pParser), ENDTAG)) { if(IgnoreWhiteSpace) Parser_IgnoreWhiteSpaces(pParser); if(Parser_getNextToken(pParser)!=0) { *NodeValue=NULL; *NodeName=NULL; NodeType=INVALID_NODE; IsEnd=0; return 1; } //if(TokenBuff==NULL) // throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); //if(*TokenBuff=='\0') // throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); if (Parser_getTokBufLength(pParser) == 0) { Handle_DOMException(FATAL_ERROR_DURING_PARSING); //throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); } //*NodeName=(char *)malloc(strlen(TokenBuff)+1); *NodeName=(char *)malloc(Parser_getTokBufLength(pParser)+1); //strcpy(*NodeName,TokenBuff); strcpy(*NodeName,Parser_getTokBuf(pParser)); *NodeValue=NULL; NodeType=ELEMENT_NODE; IsEnd=1; } //else if(!strcmp(TokenBuff, COMPLETETAG)) else if(!strcmp(Parser_getTokBuf(pParser), COMPLETETAG)) { if(NodeType==ELEMENT_NODE || (NodeType==ATTRIBUTE_NODE)) { IsEnd=0; //rewindCurrentPtr(strlen(TokenBuff)); Parser_rewindCurrentPtr(pParser, Parser_getTokBufLength(pParser)); return 0; } //store the last element tag and return back as end element node //*NodeName=(char *)malloc(strlen(LastElement)+1); *NodeName=(char *)malloc(Parser_getLastElemLength(pParser)+1); //strcpy(*NodeName,LastElement); strcpy(*NodeName,Parser_getLastElem(pParser)); *NodeValue=NULL; NodeType=ELEMENT_NODE; pParser->attrFound=1; pParser->atLeastOneAttrFound=0; IsEnd=1; return 0; } //else if(TokenBuff[0] == '\0') else if (Parser_getTokBufLength(pParser) == 0) { IsEnd=0; continue; } else if(!(pParser->attrFound)) { //if (TokenBuff != NULL) //{ // if(*TokenBuff!='\0') // { // *NodeValue=(char *)malloc(strlen(TokenBuff)+1); // strcpy(*NodeValue,TokenBuff); // } //} if (Parser_getTokBufLength(pParser) != 0){ *NodeValue=(char *)malloc(Parser_getTokBufLength(pParser)+1); strcpy(*NodeValue,Parser_getTokBuf(pParser)); } *NodeName=(char *)malloc(strlen("#text")+1); strcpy(*NodeName,"#text"); NodeType=TEXT_NODE; IsEnd=0; return 0; } else { //if(TokenBuff==NULL) // throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); //if(*TokenBuff=='\0') // throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); if (Parser_getTokBufLength(pParser) == 0) Handle_DOMException(FATAL_ERROR_DURING_PARSING); //throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); if(NodeType==ELEMENT_NODE) { //rewindCurrentPtr(strlen(TokenBuff)+1); Parser_rewindCurrentPtr(pParser, Parser_getTokBufLength(pParser)+1); return 0; } //*NodeName=(char *)malloc(strlen(TokenBuff)+1); *NodeName=(char *)malloc(Parser_getTokBufLength(pParser)+1); //strcpy(*NodeName,TokenBuff); strcpy(*NodeName,Parser_getTokBuf(pParser)); if(IgnoreWhiteSpace) Parser_IgnoreWhiteSpaces(pParser); //gets rid of equals if(Parser_getNextToken(pParser)!=0) { *NodeValue=NULL; *NodeName=NULL; NodeType=INVALID_NODE; IsEnd=0; return 1; } if(IgnoreWhiteSpace) Parser_IgnoreWhiteSpaces(pParser); if(Parser_getNextToken(pParser)!=0) { *NodeValue=NULL; *NodeName=NULL; NodeType=INVALID_NODE; IsEnd=0; return 1; } //gets rid of beginning quotes pParser->inAttrib=1; if(Parser_getNextToken(pParser)!=0) { *NodeValue=NULL; *NodeName=NULL; NodeType=INVALID_NODE; IsEnd=0; return 1; } pParser->inAttrib=0; //if(TokenBuff==NULL) // throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); //if(*TokenBuff=='\0') // throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); if (Parser_getTokBufLength(pParser) == 0) Handle_DOMException(FATAL_ERROR_DURING_PARSING); //throw DOMException(DOMException::FATAL_ERROR_DURING_PARSING); //*NodeValue=(char *)malloc(strlen(TokenBuff)+1); *NodeValue=(char *)malloc(Parser_getTokBufLength(pParser)+1); //strcpy(*NodeValue,TokenBuff); strcpy(*NodeValue,Parser_getTokBuf(pParser)); // gets rid of ending quotes if(Parser_getNextToken(pParser)!=0) { *NodeValue=NULL; *NodeName=NULL; NodeType=INVALID_NODE; IsEnd=0; return 1; } NodeType=ATTRIBUTE_NODE; IsEnd=0; pParser->atLeastOneAttrFound=1; return 0; } } return 0;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -