Embperl
view release on metacpan or search on metacpan
while (*c)
{
pAllChars [tolower(*c) >> 3] |= 1 << (tolower(*c) & 7) ;
pAllChars [toupper(*c) >> 3] |= 1 << (toupper(*c) & 7) ;
c++ ;
}
}
}
}
m = 0 ;
n = HvKEYS (pTokenHash) ;
pSortTokenHash = (tSortToken *)malloc (sizeof (struct tSortToken) * n) ;
hv_iterinit (pTokenHash) ;
while ((pEntry = hv_iternext (pTokenHash)))
{
pKey = hv_iterkey (pEntry, &l) ;
pToken = hv_iterval (pTokenHash, pEntry) ;
pSortTokenHash[m].pKey = pKey ;
pSortTokenHash[m].pToken = pToken ;
m++ ;
}
qsort (pSortTokenHash, m, sizeof (struct tSortToken), CmpToken) ;
n = 0 ;
i = 0 ;
while (i < m)
{
HV * pHash ;
struct tTokenTable * pNewTokenTable ;
char * sContains ;
char * sC ;
pKey = pSortTokenHash[i].pKey ;
pToken = pSortTokenHash[i].pToken ;
i++ ;
if (r -> Component.Config.bDebug & dbgBuildToken)
lprintf (r -> pApp, "[%d]TOKENKey: %s\n", r -> pThread -> nPid, pKey) ;
if (*pKey != '-')
{
if (!SvROK (pToken) || SvTYPE (SvRV (pToken)) != SVt_PVHV)
{
strncpy (r -> errdat1, "BuildTokenHash", sizeof (r -> errdat1)) ;
sprintf (r -> errdat2, "%s", pKey) ;
return rcNotHashRef ;
}
pHash = (HV *)SvRV (pToken) ;
p = &pTable[n] ;
p -> sName = pKey ;
p -> sText = GetHashValueStrDup (aTHX_ r -> pThread -> pMainPool, pHash, "text", "") ;
p -> nTextLen = p -> sText?strlen (p -> sText):0 ;
p -> sEndText = GetHashValueStrDup (aTHX_ r -> pThread -> pMainPool, pHash, "end", (char *)pDefEnd) ;
p -> sNodeName = GetHashValueStrDup (aTHX_ r -> pThread -> pMainPool, pHash, "nodename", NULL) ;
p -> nNodeType = (tNodeType)GetHashValueInt (aTHX_ pHash, "nodetype", ntypTag) ;
p -> bUnescape = GetHashValueInt (aTHX_ pHash, "unescape", 0) ;
p -> bAddFlags = GetHashValueInt (aTHX_ pHash, "addflags", 0) ;
p -> nCDataType = (tNodeType)GetHashValueInt (aTHX_ pHash, "cdatatype", pTokenTable -> nDefNodeType) ;
p -> nForceType = (tNodeType)GetHashValueInt (aTHX_ pHash, "forcetype", 0) ;
p -> bRemoveSpaces = GetHashValueInt (aTHX_ pHash, "removespaces", p -> nNodeType != ntypCDATA?2:0) ;
p -> bInsideMustExist = GetHashValueInt (aTHX_ pHash, "insidemustexist", 0) ;
p -> bMatchAll = GetHashValueInt (aTHX_ pHash, "matchall", 0) ;
p -> bDontEat = GetHashValueInt (aTHX_ pHash, "donteat", 0) ;
p -> bExitInside= GetHashValueInt (aTHX_ pHash, "exitinside", 0) ;
p -> bAddFirstChild = GetHashValueInt (aTHX_ pHash, "addfirstchild", 0) ;
p -> pStartTag = (struct tToken *)GetHashValueStrDup (aTHX_ r -> pThread -> pMainPool, pHash, "starttag", NULL) ;
p -> pEndTag = (struct tToken *)GetHashValueStrDup (aTHX_ r -> pThread -> pMainPool, pHash, "endtag", NULL) ;
p -> sParseTimePerlCode = GetHashValueStrDup (aTHX_ r -> pThread -> pMainPool, pHash, "parsetimeperlcode", NULL) ;
if ((sC = sContains = GetHashValueStrDup (aTHX_ r -> pThread -> pMainPool, pHash, "contains", NULL)))
{
unsigned char * pC ;
if ((p -> pContains = parse_malloc (r, sizeof (tCharMap))) == NULL)
return rcOutOfMemory ;
pC = p -> pContains ;
memset (pC, 0, sizeof (tCharMap)) ;
while (*sContains)
{
pC[*sContains >> 3] |= 1 << (*sContains & 7) ;
pStartChars [*sContains >> 3] |= 1 << (*sContains & 7) ;
pStartChars [*sContains >> 3] |= 1 << (*sContains & 7) ;
sContains++ ;
}
}
else
p -> pContains = NULL ;
if (p -> bMatchAll)
{
memset (pStartChars, 0xff, sizeof(tCharMap)) ;
}
else if ((c = p -> sText))
{
pStartChars [toupper(*c) >> 3] |= 1 << (toupper(*c) & 7) ;
pStartChars [tolower(*c) >> 3] |= 1 << (tolower(*c) & 7) ;
while (*c)
{
pAllChars [tolower(*c) >> 3] |= 1 << (tolower(*c) & 7) ;
pAllChars [toupper(*c) >> 3] |= 1 << (toupper(*c) & 7) ;
c++ ;
}
}
if (r -> Component.Config.bDebug & dbgBuildToken)
lprintf (r -> pApp, "[%d]TOKEN: %*c%s ... %s unesc=%d nodetype=%d, cdatatype=%d, nodename=%s contains='%s' addfirstchild=%d\n", r -> pThread -> nPid, nLevel*2, ' ', p -> sText, p -> sEndText, p -> bUnescape, p -> nNodeType, p -> nCD...
if (p -> sNodeName)
{
if (p -> sNodeName[0] != '!')
p -> nNodeName = String2Ndx (r -> pApp, p -> sNodeName, strlen (p -> sNodeName)) ;
else
p -> nNodeName = String2UniqueNdx (r -> pApp, p -> sNodeName + 1, strlen (p -> sNodeName + 1)) ;
}
else
p -> nNodeName = String2Ndx (r -> pApp, p -> sText, strlen (p -> sText)) ;
if ((rc = CheckProcInfo (r, pHash, p, ppCompilerInfo)) != ok)
return rc ;
if ((rc = BuildSubTokenTable (r, nLevel, pHash, pKey, "follow", p -> sEndText, ppCompilerInfo, &pNewTokenTable)))
return rc ;
p -> pFollowedBy = pNewTokenTable ;
if ((rc = BuildSubTokenTable (r, nLevel, pHash, pKey, "inside", "", ppCompilerInfo, &pNewTokenTable)))
return rc ;
p -> pInside = pNewTokenTable ;
n++ ;
}
}
free (pSortTokenHash) ;
qsort (pTable, numTokens - 1, sizeof (struct tToken), pTokenTable -> bLSearch?CmpTokenDesc:CmpToken) ;
for (i = 0; i < n; i++)
{
if (pTable[i].pContains && !pTable[i].sText[0])
pTokenTable -> pContainsToken = &pTable[i] ;
if (pTable[i].pEndTag)
{
char * s = (char *)pTable[i].pEndTag ;
int j ;
pTable[i].pEndTag = NULL ;
for (j = 0; j < n; j++)
{
if (strcmp (pTable[j].sName, s) == 0)
pTable[i].pEndTag = &pTable[j] ;
}
if (pTable[i].pEndTag == NULL)
{
strncpy (r -> errdat1, "BuildTokenHash", sizeof (r -> errdat1)) ;
sprintf (r -> errdat2, " EndTag %s for %s not found", pTable[i].sText, s) ;
return rcTokenNotFound ;
}
}
if (pTable[i].pStartTag)
{
char * s = (char *)pTable[i].pStartTag ;
int j ;
if (!pEndCurr && pToken -> sEndText[0] == '\n' && pToken -> sEndText[1] == '\n' && sEndText[2] == '\0')
{
pEndCurr = strstr (pCurr, "\n\r\n") ;
if (pEndCurr && pEndCurr[-1] == '\r')
pEndCurr-- ;
}
if (pEndCurr)
{
tNode xNewAttrNode ;
if (pEndCurr - pCurr && pToken -> nCDataType && pToken -> nCDataType != ntypCDATA)
{ /* add text before end of token as node */
char * pEnd = pEndCurr ;
char c;
if (pToken -> bRemoveSpaces & 32)
while (pEnd > pCurrStart && isspace (*(pEnd-1)))
pEnd-- ;
else if (pToken -> bRemoveSpaces & 64)
while (pEnd > pCurrStart && ((c = *(pEnd-1)) == ' ' || c == '\t' || c == '\r'))
pEnd-- ;
if (pToken -> bUnescape)
{
int newlen ;
r -> Component.bEscInUrl = pToken -> bUnescape - 1 ;
newlen = TransHtml (r, pCurr, pEnd - pCurr) ;
pEnd = pCurr + newlen ;
r -> Component.bEscInUrl = 0 ;
}
if (!(xNewAttrNode = Node_appendChild (r -> pApp, pDomTree, xParentNode, 0, pToken -> nCDataType, 0, pCurr, pEnd - pCurr, level+1, GetLineNoOf (r, pCurr), NULL)))
return 1 ;
if (pToken -> bAddFlags)
Node_self (pDomTree, xNewAttrNode) -> bFlags |= pToken -> bAddFlags ;
}
pCurr = pEndCurr + strlen (pToken -> sEndText) ;
}
level-- ;
xParentNode = Node_parentNode (r -> pApp, pDomTree, xParentNode, 0) ;
pStartTag = Node_selfLastChild (r -> pApp, pDomTree, Node_self (pDomTree, xParentNode), 0) ;
if (pStartTag -> nText != pToken -> nNodeName &&
(pToken -> pStartTag == NULL
|| pStartTag -> nText != pToken -> pStartTag -> nNodeName))
{
strncpy (r -> errdat2, Ndx2String (pStartTag -> nText), sizeof (r -> errdat2)) ;
strncpy (r -> errdat1, Ndx2String (pToken -> nNodeName), sizeof (r -> errdat1)) ;
r -> Component.pCurrPos = pCurrTokenStart ;
return rcTagMismatch ;
}
}
else
{
if (pToken -> nNodeType == ntypEndStartTag && level > 0)
{
xParentNode = Node_parentNode (r -> pApp, pDomTree, xParentNode, 0) ;
level-- ;
}
if ((pToken -> nNodeType && pToken -> nNodeType != ntypCDATA) || pToken -> sNodeName)
{
/* add token as node if not cdata*/
tNodeType nType = pToken -> nNodeType ;
if (nType == ntypStartEndTag)
nType = ntypStartTag ;
if (!(xNewNode = Node_appendChild (r -> pApp, pDomTree, xParentNode, 0, nType, (nCDataType == ntypAttrValue && pToken -> nNodeType != ntypAttr)?(pToken -> nForceType?2:1):0, NULL, nNodeName, level, GetLineNoOf (r, pCurrTokenStart), pToken -> sText...
{
r -> Component.pCurrPos = pCurrTokenStart ;
return rc ;
}
if (pToken -> bAddFlags)
Node_self (pDomTree, xNewNode) -> bFlags |= pToken -> bAddFlags ;
if (!pToken -> pInside)
bInsideMustExist = 0 ;
if (pToken -> bAddFirstChild)
{
if (!(Node_appendChild (r -> pApp, pDomTree, xNewNode, 0, nCDataType,
0,
"", 0,
0, 0, NULL)))
{
return rc ;
}
}
}
else
{
xNewNode = xParentNode ;
}
if ((pInside = pToken -> pInside))
{ /* parse for further tokens inside of this token */
rc = ParseTokens (r, &pCurr, pEnd, pInside,
pToken -> sEndText,
pToken -> pContains,
(tNodeType)(pToken -> nCDataType == ntypCDATA && !pToken -> sNodeName?ntypAttrValue:pToken -> nCDataType),
0,
pToken -> bUnescape,
pToken -> bInsideMustExist + bInsideMustExist,
pToken -> bRemoveSpaces,
nNodeName,
xNewNode,
level+1,
pToken -> nNodeType == ntypCDATA?pCurrTokenStart:NULL,
sEndText && *sEndText?sEndText:NULL,
pToken -> bDontEat) ;
if (rc == ok)
bInsideMustExist = 0 ;
else if (pToken -> bInsideMustExist && rc == rcTokenNotFound)
{
rc = ok ;
/*
pToken = NULL ;
bFollow = 0 ;
sEndText = NULL ;
nEndText = 0 ;
pCurr = pCurrTokenStart ;
*/
if (xNewNode != xParentNode)
{
Node_removeChild (r -> pApp, pDomTree, xParentNode, xNewNode, 0) ;
if (r -> Component.Config.bDebug & dbgParse)
lprintf (r -> pApp, "[%d]PARSE: DelNode: +%02d %*s parent=%d node=%d\n",
r -> pThread -> nPid, level, level * 2, "", xParentNode, xNewNode) ;
}
/* add as cdata*/
if (!(xNewNode = Node_appendChild (r -> pApp, pDomTree, xParentNode, 0, (tNodeType)pTokenTable -> nDefNodeType, 0, pCurrStart, pCurr - pCurrStart, level, GetLineNoOf (r, pCurrStart), NULL)))
return 1 ;
}
else if (rc != rcTokenNotFound)
{
return rc ;
}
if (pToken -> nNodeType == ntypStartEndTag)
{
xParentNode = Node_parentNode (r -> pApp, pDomTree, xNewNode, 0) ;
pToken = NULL ;
bFollow = 2 ;
}
}
else
{ /* nothing more inside of this token allowed, so search for the end of the token */
char * pEndCurr ;
unsigned char * pContains ;
int nSkip = 0 ;
if ((pContains = pToken -> pContains))
{
pEndCurr = pCurr ;
while (pContains [*pEndCurr >> 3] & (1 << (*pEndCurr & 7)))
pEndCurr++ ;
nSkip = 0 ;
/*
if (pEndCurr == pCurr)
{
pEndCurr = NULL ;
pToken = NULL ;
}
*/
}
else
{
pEndCurr = NULL ;
if (strcmp (pToken -> sEndText, "\n\n") == 0)
{
if ((pEndCurr = strstr (pCurr, "\n\r\n")))
{
if (pEndCurr[-1] == '\r')
{
pEndCurr-- ;
nSkip = pCurr[4] == '\r'?5:4 ;
}
else
nSkip = pCurr[3] == '\r'?4:3 ;
}
}
if (!pEndCurr)
{
pEndCurr = strstr (pCurr, pToken -> sEndText) ;
nSkip = strlen (pToken -> sEndText) ;
}
if (pToken -> bDontEat & 2)
nSkip = 0 ;
if (pToken -> nNodeType == ntypCDATA && pEndCurr && !pToken -> sNodeName)
{
pEndCurr += nSkip ;
( run in 0.867 second using v1.01-cache-2.11-cpan-39bf76dae61 )