Embperl
view release on metacpan or search on metacpan
{
pParent = Node_selfCondCloneNode (a, pDomTree, pParent, nRepeatLevel) ;
}
}
if (nType == ntypAttr)
{ /* add new attribute to node */
struct tAttrData * pNew ;
tIndex xNdx ;
pParent = Node_selfExpand (a, pDomTree, pParent, (tUInt16)-1, (tUInt16)(pParent -> numAttr + 1)) ;
pNew = ((struct tAttrData * )(pParent + 1)) + pParent -> numAttr ;
xNdx = ArrayAdd (a, &pDomTree -> pLookup, 1) ;
pDomTree -> pLookup[xNdx].pLookup = (struct tNodeData *)pNew ;
pDomTree -> pLookup[xNdx].pLookupLevel = NULL ;
pNew -> xName = sText?String2NdxNoInc (a, sText, nTextLen):nTextLen ;
NdxStringRefcntInc (a, pNew -> xName) ;
pNew -> xValue = 0 ;
pNew -> bFlags = aflgOK ;
pNew -> nType = nType ;
pNew -> xNdx = xNdx ;
pNew -> nNodeOffset = ((tUInt8 *)pNew) - ((tUInt8 *)pParent) ;
pParent -> numAttr++ ;
numAttr++ ;
if ((a -> pCurrReq?a -> pCurrReq -> Component.Config.bDebug:a -> Config.bDebug) & dbgParse)
lprintf (a, "[%d]PARSE: AddNode: +%02d %*s Attribut parent=%d node=%d type=%d text=%*.*s (#%d) %s\n",
a -> pThread -> nPid, nLevel, nLevel * 2, "", xParent, xNdx, nType, sText?nTextLen:0, sText?nTextLen:1000, sText?sText:Ndx2String (nTextLen), sText?String2NdxNoInc (a, sText, nTextLen):nTextLen, sLogMsg?sLogMsg:"") ;
return xNdx ;
}
if ((bForceAttrValue || nType == ntypAttrValue) &&
(pParent -> nType != ntypAttr || (pParent -> bFlags & aflgAttrChilds) == 0))
{
/* --- add value of attribute, to non attribute parent node */
/* first add dummy attribute to parent with xNoName as name index */
/* if this attribute already exist, append the new value as new _child_ */
/* to that attribute. This means, that an attribute can have multiple */
/* child(values), in which case we set the aflgAttrChilds flag */
struct tAttrData * pNew = (struct tAttrData * )pParent ;
int bAddChild = 0 ;
if (pNew -> nType != ntypAttr)
{ /* --- parent is not a attribute --- */
if (nType == ntypAttrValue)
{
int i ;
for (i = 0; i < nTextLen; i++)
{
if (!isspace (sText[i]))
break ;
}
if (i == nTextLen)
return 1 ; /* do not add only spaces as cdata inside a tag */
}
pNew = ((tAttrData *)(pParent + 1)) + pParent -> numAttr - 1 ; /* get last attribute of node */
if (pParent -> numAttr == 0 || pNew -> xName != xNoName || bForceAttrValue > 1)
{ /* --- add dummy attribute --- */
if (!(xParent = Node_appendChild (a, pDomTree, xParent, nRepeatLevel, ntypAttr, 0, NULL, xNoName, nLevel, nLinenumber, "<noname>")))
return 0 ;
nLevel++ ;
pNew = Attr_self (pDomTree, xParent) ;
}
else
{ /* --- dummy attribute already exist, reuse it --- */
xParent = pNew -> xNdx ;
bAddChild = 1 ;
nLevel++ ;
}
}
if (!bAddChild && !bForceAttrValue)
{ /* we have an simple attribute, now put the value into it */
pNew -> xValue = sText?String2NdxNoInc (a, sText, nTextLen):nTextLen ;
NdxStringRefcntInc (a, pNew -> xValue) ;
if ((a -> pCurrReq?a -> pCurrReq -> Component.Config.bDebug:a -> Config.bDebug) & dbgParse)
lprintf (a, "[%d]PARSE: AddNode: +%02d %*s AttributValue parent=%d node=%d type=%d text=%*.*s (#%d) %s\n", a -> pThread -> nPid, nLevel, nLevel * 2, "", xParent, pNew -> xNdx, nType,
sText?nTextLen:0, sText?nTextLen:1000, sText?sText:Ndx2String (nTextLen), sText?String2NdxNoInc (a, sText, nTextLen):nTextLen, sLogMsg?sLogMsg:"") ;
pNew -> bFlags |= aflgAttrValue ;
return xParent ;
}
else
/* --- we have to add a new child to the attribute, so set the attribute as parent --- */
pParent = (tNodeData *)pNew ;
}
/* --- if we come we here we have add a new child node --- */
{
struct tNodeData * pNew ;
tIndex xOldValue = 0 ;
if (pParent && pParent -> nType == ntypAttr)
{ /* --- we add a new child to an attribute --- */
if (((tAttrData *)pParent) -> bFlags & aflgAttrValue)
{
xOldValue = ((tAttrData *)pParent) -> xValue ;
((tAttrData *)pParent) -> xValue = 0 ;
pNew = Node_newAndAppend (a, pDomTree, xParent, nRepeatLevel, &(((tAttrData *)pParent) -> xValue), nLinenumber, 0) ;
pNew -> nType = ntypAttrValue ;
pNew -> nText = xOldValue ;
}
((tAttrData *)pParent) -> bFlags &= ~aflgAttrValue ;
((tAttrData *)pParent) -> bFlags |= aflgAttrChilds ;
pNew = Node_newAndAppend (a, pDomTree, xParent, nRepeatLevel, &(((tAttrData *)pParent) -> xValue), nLinenumber, 0) ;
}
else
}
pRefNode = Node_selfCondCloneNode (a, pRefNodeDomTree, pRefNode, nRefRepeatLevel) ;
if (pNxtNode)
pNxtNode = Node_selfCondCloneNode (a, pRefNodeDomTree, pNxtNode, nRefRepeatLevel) ;
else
{
tNodeData * pParent ;
if ((pParent = Node_selfLevel (a, pRefNodeDomTree, pRefNode -> xParent, nRefRepeatLevel)) == NULL ||
pParent -> xChilds != pRefNode -> xNext)
pNxtNode = Node_selfLevel (a, pRefNodeDomTree, pRefNode -> xNext, nRefRepeatLevel) ; /* first one */
else
pNxtNode = NULL ;
}
if (pNxtNode)
{
pNxtNode -> xPrev = pNewNode -> xNdx ;
pNewNode -> xNext = pNxtNode -> xNdx ;
}
else
pNewNode -> xNext = pRefNode -> xNext ;
pRefNode -> xNext = pNewNode -> xNdx ;
pNewNode -> xPrev = pRefNode -> xNdx ;
if (pNewNode -> nType == ntypDocument)
{
pNewNode -> nType = ntypDocumentFraq ;
if (pNewNode -> nText != xDocumentFraq)
{
NdxStringFree (a, pNewNode -> nText) ;
pNewNode -> nText = xDocumentFraq ;
NdxStringRefcntInc (a, xDocumentFraq) ;
}
}
if (pNewNode -> nType == ntypDocumentFraq)
{
tAttrData * pAttr = Element_selfSetAttribut (a, pRefNodeDomTree, pNewNode, nRefRepeatLevel, NULL, xDomTreeAttr, (char *)&pNewNodeDomTree -> xNdx, sizeof (pNewNodeDomTree -> xNdx)) ;
pAttr -> bFlags = aflgOK ; /* reset string value flag */
}
if (pRefNodeDomTree -> xNdx != pNewNodeDomTree -> xNdx)
{
if ((a -> pCurrReq?a -> pCurrReq -> Component.Config.bDebug:a -> Config.bDebug) & dbgDOM)
lprintf (a, "[%d]DOM: DomTree %d depends on DomTree %d\n", a -> pThread -> nPid, pRefNodeDomTree -> xNdx, pNewNodeDomTree -> xNdx) ;
av_push (pRefNodeDomTree -> pDependsOn, SvREFCNT_inc (pNewNodeDomTree -> pDomTreeSV)) ;
}
return pNewNode -> xNdx ;
}
/* ------------------------------------------------------------------------ */
/* */
/* Node_insertAfter_CDATA */
/* */
/* Inserts a cdata after another node */
/* */
/* ------------------------------------------------------------------------ */
tNode Node_insertAfter_CDATA (/*in*/ tApp * a,
/*in*/ const char * sText,
/*in*/ int nTextLen,
/*in*/ int nEscMode,
/*in*/ tDomTree * pRefNodeDomTree,
/*in*/ tNode xRefNode,
/*in*/ tRepeatLevel nRefRepeatLevel)
{
tNodeData * pRefNode = Node_selfLevel (a, pRefNodeDomTree, xRefNode, nRefRepeatLevel) ;
tNodeData * pNxtNode = Node_selfNextSibling (a, pRefNodeDomTree, pRefNode, nRefRepeatLevel) ;
tNodeData * pNew = Node_newAndAppend (a, pRefNodeDomTree, pRefNode -> xParent, nRefRepeatLevel, NULL, pRefNode -> nLinenumber, sizeof (tNodeData)) ;
pNew -> xChilds = 0 ;
pNew -> bFlags = 0 ;
if (nEscMode != -1)
{
pNew -> nType = (nEscMode & 8)?ntypText:((nEscMode & 3)?ntypTextHTML:ntypCDATA) ;
pNew -> bFlags &= ~(nflgEscUTF8 + nflgEscUrl + nflgEscChar) ;
pNew -> bFlags |= (nEscMode ^ nflgEscChar) & (nflgEscUTF8 + nflgEscUrl + nflgEscChar) ;
}
else
pNew -> nType = ntypCDATA ;
pNew -> nText = String2Ndx (a, sText, nTextLen) ;
pRefNode = Node_selfCondCloneNode (a, pRefNodeDomTree, pRefNode, nRefRepeatLevel) ;
if (pNxtNode)
pNxtNode = Node_selfCondCloneNode (a, pRefNodeDomTree, pNxtNode, nRefRepeatLevel) ;
else
{
tNodeData * pParent ;
if ((pParent = Node_selfLevel (a, pRefNodeDomTree, pRefNode -> xParent, nRefRepeatLevel)) == NULL ||
pParent -> xChilds != pRefNode -> xNext)
pNxtNode = Node_selfLevel (a, pRefNodeDomTree, pRefNode -> xNext, nRefRepeatLevel) ; /* first one */
else
pNxtNode = NULL ;
}
if (pNxtNode)
{
pNxtNode -> xPrev = pNew -> xNdx ;
pNew -> xNext = pNxtNode -> xNdx ;
}
else
pNew -> xNext = pRefNode -> xNext ;
pRefNode -> xNext = pNew -> xNdx ;
pNew -> xPrev = pRefNode -> xNdx ;
return pNew -> xNdx ;
}
( run in 1.818 second using v1.01-cache-2.11-cpan-39bf76dae61 )