You are viewing a plain text version of this content. The canonical link for it is here.
Posted to embperl-cvs@perl.apache.org by ri...@apache.org on 2001/10/24 16:13:15 UTC

cvs commit: embperl DOM.xs Makefile.PL epdom.c epdom.h

richter     01/10/24 07:13:15

  Modified:    .        Tag: Embperl2c DOM.xs Makefile.PL epdom.c epdom.h
  Log:
  Embperl 2 - tree structure rewrite
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.16  +15 -15    embperl/DOM.xs
  
  Index: DOM.xs
  ===================================================================
  RCS file: /home/cvs/embperl/DOM.xs,v
  retrieving revision 1.1.2.15
  retrieving revision 1.1.2.16
  diff -u -r1.1.2.15 -r1.1.2.16
  --- DOM.xs	2001/10/22 13:52:15	1.1.2.15
  +++ DOM.xs	2001/10/24 14:13:14	1.1.2.16
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: DOM.xs,v 1.1.2.15 2001/10/22 13:52:15 richter Exp $
  +#   $Id: DOM.xs,v 1.1.2.16 2001/10/24 14:13:14 richter Exp $
   #
   ###################################################################################
   
  @@ -63,7 +63,7 @@
   PPCODE:
       SvGETMAGIC_P4(sText) ;
       s = SV2String (sText, l) ;
  -    Node_replaceChildWithCDATA (DomTree_self(pDomNode -> xDomTree), pDomNode -> xNode, 0, s, l, (pCurrReq -> nCurrEscMode & 3)== 3?1 + (pCurrReq -> nCurrEscMode & 4):pCurrReq -> nCurrEscMode, nflgModified | nflgReturn) ;
  +    Node_replaceChildWithCDATA (DomTree_self(pDomNode -> xDomTree), pDomNode -> xNode, pCurrReq -> nCurrRepeatLevel, s, l, (pCurrReq -> nCurrEscMode & 3)== 3?1 + (pCurrReq -> nCurrEscMode & 4):pCurrReq -> nCurrEscMode, nflgModified | nflgReturn) ;
       pCurrReq -> nCurrEscMode = pCurrReq -> nEscMode ;
       pCurrReq -> bEscModeSet = -1 ;
       /*SvREFCNT_inc (sText) ;*/
  @@ -82,7 +82,7 @@
   PPCODE:
       SvGETMAGIC_P4(sText) ;
       s = SV2String (sText, l) ;
  -    Node_replaceChildWithCDATA (DomTree_self(xDomTree), xOldChild, 0, s, l, (pCurrReq -> nCurrEscMode & 3)== 3?1 + (pCurrReq -> nCurrEscMode & 4):pCurrReq -> nCurrEscMode, nflgModified | nflgReturn) ;
  +    Node_replaceChildWithCDATA (DomTree_self(xDomTree), xOldChild, pCurrReq -> nCurrRepeatLevel, s, l, (pCurrReq -> nCurrEscMode & 3)== 3?1 + (pCurrReq -> nCurrEscMode & 4):pCurrReq -> nCurrEscMode, nflgModified | nflgReturn) ;
       pCurrReq -> nCurrEscMode = pCurrReq -> nEscMode ;
       pCurrReq -> bEscModeSet = -1 ;
       /*SvREFCNT_inc (sText) ;*/
  @@ -100,7 +100,7 @@
   PPCODE:
       SvGETMAGIC_P4(sText) ;
       s = SV2String (sText, l) ;
  -    Node_replaceChildWithCDATA (DomTree_self(pCurrReq -> xCurrDomTree), xOldChild, 0, s, l, (pCurrReq -> nCurrEscMode & 3)== 3?1 + (pCurrReq -> nCurrEscMode & 4):pCurrReq -> nCurrEscMode, nflgModified | nflgReturn) ;
  +    Node_replaceChildWithCDATA (DomTree_self(pCurrReq -> xCurrDomTree), xOldChild, pCurrReq -> nCurrRepeatLevel, s, l, (pCurrReq -> nCurrEscMode & 3)== 3?1 + (pCurrReq -> nCurrEscMode & 4):pCurrReq -> nCurrEscMode, nflgModified | nflgReturn) ;
       pCurrReq -> nCurrEscMode = pCurrReq -> nEscMode ;
       pCurrReq -> bEscModeSet = -1 ;
       /*SvREFCNT_inc (sText) ;*/
  @@ -117,7 +117,7 @@
       SV * sRet  ;
   PPCODE:
       SvGETMAGIC_P4(sText) ;
  -    sRet = Node_replaceChildWithUrlDATA (pDomNode -> xDomTree, pDomNode -> xNode, 0, sText) ;
  +    sRet = Node_replaceChildWithUrlDATA (pDomNode -> xDomTree, pDomNode -> xNode, pCurrReq -> nCurrRepeatLevel, sText) ;
   
       ST(0) = sRet ;
       XSRETURN(1) ;
  @@ -130,7 +130,7 @@
       SV * sRet  ;
   PPCODE:
       SvGETMAGIC_P4(sText) ;
  -    sRet = Node_replaceChildWithUrlDATA (pCurrReq -> xCurrDomTree, xOldChild, 0, sText) ;
  +    sRet = Node_replaceChildWithUrlDATA (pCurrReq -> xCurrDomTree, xOldChild, pCurrReq -> nCurrRepeatLevel, sText) ;
   
       ST(0) = sRet ;
       XSRETURN(1) ;
  @@ -167,7 +167,7 @@
       Node_self (pDomTree,pParentNode -> xNode) -> bFlags |= nflgModified | nflgReturn ;
       xNewParent = Node_cloneNode (pDomTree, pParentNode -> xNode, 0, 1) ;
       DomTree_selfCheckpoint (pDomTree, pParentNode -> xNode, xNewParent) ;
  -    Node_appendChild (pDomTree, xNewParent, 0, nType, 0, sT, nText, 0, 0, NULL) ;
  +    Node_appendChild (pDomTree, xNewParent, pCurrReq -> nCurrRepeatLevel, nType, 0, sT, nText, 0, 0, NULL) ;
   
   
   void
  @@ -184,7 +184,7 @@
       Node_self (pDomTree,xParent) -> bFlags |= nflgModified | nflgReturn ;
       xNewParent = Node_cloneNode (pDomTree, xParent, 0, 1) ;
       DomTree_selfCheckpoint (pDomTree, xParent, xNewParent) ;
  -    Node_appendChild (pDomTree, xNewParent, 0, nType, 0, sT, nText, 0, 0, NULL) ;
  +    Node_appendChild (pDomTree, xNewParent, pCurrReq -> nCurrRepeatLevel, nType, 0, sT, nText, 0, 0, NULL) ;
   
   
   char *
  @@ -195,7 +195,7 @@
   PREINIT:
       char * sText ;
   CODE:
  -    sText = Node_childsText (DomTree_self (xDomTree), xChild, 0, 0, bDeep) ;
  +    sText = Node_childsText (DomTree_self (xDomTree), xChild, pCurrReq -> nCurrRepeatLevel, 0, bDeep) ;
       RETVAL = sText?sText:"" ;
   OUTPUT:
       RETVAL
  @@ -252,7 +252,7 @@
   
       pDomTree = DomTree_self (pDomNode -> xDomTree) ;
   
  -    Element_selfSetAttribut (pDomTree, Node_self (pDomTree, pDomNode -> xNode), 0, sA, nAttr, sT, nText, 1) ;
  +    Element_selfSetAttribut (pDomTree, Node_self (pDomTree, pDomNode -> xNode), pCurrReq -> nCurrRepeatLevel, sA, nAttr, sT, nText, 1) ;
   
   
   void
  @@ -268,7 +268,7 @@
       char * sA = SV2String (sAttr, nAttr) ;
       tDomTree * pDomTree = DomTree_self (xDomTree) ;
   
  -    Element_selfSetAttribut (pDomTree, Node_self (pDomTree, xNode), 0, sA, nAttr, sT, nText, 1) ;
  +    Element_selfSetAttribut (pDomTree, Node_self (pDomTree, xNode), pCurrReq -> nCurrRepeatLevel, sA, nAttr, sT, nText, 1) ;
   
   
   
  @@ -285,7 +285,7 @@
       sA = SV2String (sAttr, nAttr) ;
       pDomTree = DomTree_self (pDomNode -> xDomTree) ;
   
  -    Element_selfRemoveAttribut (pDomTree, Node_self (pDomTree, pDomNode -> xNode), 0, sA, nAttr, 1) ;
  +    Element_selfRemoveAttribut (pDomTree, Node_self (pDomTree, pDomNode -> xNode), pCurrReq -> nCurrRepeatLevel, sA, nAttr, 1) ;
   
   
   void
  @@ -298,7 +298,7 @@
       char * sA = SV2String (sAttr, nAttr) ;
       tDomTree * pDomTree = DomTree_self (xDomTree) ;
   
  -    Element_selfRemoveAttribut (pDomTree, Node_self (pDomTree, xNode), 0, sA, nAttr, 1) ;
  +    Element_selfRemoveAttribut (pDomTree, Node_self (pDomTree, xNode), pCurrReq -> nCurrRepeatLevel, sA, nAttr, 1) ;
   
   
   ################################################################################
  @@ -316,7 +316,7 @@
   CODE:
       pDomTree = DomTree_self (pAttr -> xDomTree) ;
   
  -    Attr_selfValue (pDomTree, Attr_self(pDomTree, pAttr -> xNode), 0, &sAttrText) ;
  +    Attr_selfValue (pDomTree, Attr_self(pDomTree, pAttr -> xNode), pCurrReq -> nCurrRepeatLevel, &sAttrText) ;
       RETVAL = newSVpv (sAttrText, ArrayGetSize (sAttrText)) ;
       StringFree (&sAttrText) ;
   OUTPUT:
  @@ -331,7 +331,7 @@
       tDomTree * pDomTree = DomTree_self (xDomTree) ;
       char * sAttrText = NULL ;
   
  -    Attr_selfValue (pDomTree, Attr_self(pDomTree, xAttr), 0, &sAttrText) ;
  +    Attr_selfValue (pDomTree, Attr_self(pDomTree, xAttr), pCurrReq -> nCurrRepeatLevel, &sAttrText) ;
       RETVAL = newSVpv (sAttrText, ArrayGetSize (sAttrText)) ;
       StringFree (&sAttrText) ;
   OUTPUT:
  
  
  
  1.31.4.28 +2 -1      embperl/Makefile.PL
  
  Index: Makefile.PL
  ===================================================================
  RCS file: /home/cvs/embperl/Makefile.PL,v
  retrieving revision 1.31.4.27
  retrieving revision 1.31.4.28
  diff -u -r1.31.4.27 -r1.31.4.28
  --- Makefile.PL	2001/10/22 08:05:31	1.31.4.27
  +++ Makefile.PL	2001/10/24 14:13:14	1.31.4.28
  @@ -3,7 +3,7 @@
   #
   # (C) 1997-2001 G.Richter (richter@dev.ecos.de) / ECOS
   #
  -# $Id: Makefile.PL,v 1.31.4.27 2001/10/22 08:05:31 richter Exp $
  +# $Id: Makefile.PL,v 1.31.4.28 2001/10/24 14:13:14 richter Exp $
   #
   
   
  @@ -1135,6 +1135,7 @@
       'ABSTRACT'     => 'Embed Perl code in HTML documents',
       'AUTHOR'       => 'Gerald Richter <ri...@dev.ecos.de>',
       'macro'        => $makemacros,
  +    $EP2?('depend'       => { 'Embperl.x' => ['Embperl.xs', 'DOM.xs', 'CMD.xs', 'Syntax.xs'] }):(),
   );
   
   
  
  
  
  1.4.2.56  +180 -36   embperl/Attic/epdom.c
  
  Index: epdom.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epdom.c,v
  retrieving revision 1.4.2.55
  retrieving revision 1.4.2.56
  diff -u -r1.4.2.55 -r1.4.2.56
  --- epdom.c	2001/10/24 10:20:36	1.4.2.55
  +++ epdom.c	2001/10/24 14:13:15	1.4.2.56
  @@ -9,7 +9,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epdom.c,v 1.4.2.55 2001/10/24 10:20:36 richter Exp $
  +#   $Id: epdom.c,v 1.4.2.56 2001/10/24 14:13:15 richter Exp $
   #
   ###################################################################################*/
   
  @@ -678,7 +678,7 @@
   
   
   tNodeData * Node_selfLevelItem (/*in*/ tDomTree *    pDomTree,
  -				/*in*/ tNode	 xNode,
  +				/*in*/ tNode	     xNode,
   				/*in*/ tRepeatLevel  nLevel)
   
       {
  @@ -1014,31 +1014,31 @@
       return pDomTree -> xNdx ;
       }
   
  -/***********************************************************************
  -*                                                                          
  +/*---------------------------------------------------------------------------
   * DomTree_checkpoint                                                       
  -*/                                                                          
  -/**
  +*//*!
  +*
   * \_en									   
   * Compare checkpoint from programm execution with list build during        
   * compilation and change the DomTree and repeat level according to the     
   * programm flow                                                            
   *                                                                          
   * @param   r               Embperl request data                            
  -* @param   xDomTree	    current DomTree we are working on              
  +* @param   xDomTree	   current DomTree we are working on              
   * @param   nRunCheckpoint  Number of checkpoint that was just executed     
   * \endif                                                                       
  +*
   * \_de									   
   * Vergeleicht den Checkpoint von der Programmausf�hrung mit dem Checkpoint 
   * beim Compilieren und �ndert den DomTree entsprechend dem Programmflu� ab 
   *                                                                          
   * @param   r               Embperl Requestdaten                            
  -* @param   xDomTree	    akuteller DomTree der bearbeitet wird          
  +* @param   xDomTree	   akuteller DomTree der bearbeitet wird          
   * @param   nRunCheckpoint  Nummer des Checkpoints der gerade abgearbeitet  
   *                          wurde                                           
   * \endif                                                                       
   *                                                                          
  -******************************************************************************/
  +* ------------------------------------------------------------------------ */
   
   void DomTree_checkpoint (tReq * r, tIndex xDomTree, tIndex nRunCheckpoint)
   
  @@ -1124,7 +1124,7 @@
               else
                   {
                   if (pCurrReq -> bDebug & dbgParse)
  -	            lprintf (pCurrReq, "[%d]Checkpoint: jump forward2 DomTree=%d Index=%d Node=%d,%d,%d Line=%d -> Index=%d Node=%d,%d,%d Line=%d SVs=%d\n", pCurrReq -> nPid, xDomTree, nCompileCheckpoint, pPrevNode -> xNdx, pCompileParent -> xNdx, pCompileParent2 -> xNdx, pPrevNode -> nLinenumber, nRunCheckpoint, pRunNode -> xNdx, pRunParent -> xNdx, pRunParent2 -> xNdx, pRunNode -> nLinenumber, sv_count) ; 
  +                    lprintf (pCurrReq, "[%d]Checkpoint: jump forward2 DomTree=%d Index=%d Node=%d,%d,%d Line=%d -> Index=%d Node=%d,%d,%d Line=%d SVs=%d\n", pCurrReq -> nPid, xDomTree, nCompileCheckpoint, pPrevNode -> xNdx, pCompileParent -> xNdx, pCompileParent2?pCompileParent2 -> xNdx:-1, pPrevNode -> nLinenumber, nRunCheckpoint, pRunNode -> xNdx, pRunParent -> xNdx, pRunParent2?pRunParent2 -> xNdx:-1, pRunNode -> nLinenumber, sv_count) ; 
       
                   mydie ("Unstrutured forward jump") ;
                   }
  @@ -1159,26 +1159,42 @@
               pPrevNode -> bFlags |= nflgIgnore ;
               }
   
  -        if (pCompileParent == pRunParent)
  +        if (pCompileParent -> xNdx  == pRunParent -> xNdx)
  +            {
  +            r -> nCurrRepeatLevel++ ;            
  +            Node_selfForceLevel (pDomTree, pPrevNode -> xNdx, r -> nCurrRepeatLevel) ; /* make sure we have a node that points out of the loop */
  +            pRunNode = Node_selfCondCloneNode (pDomTree, pRunNode, r -> nCurrRepeatLevel) ;
  +        
  +            pRunNode -> xPrev = pPrevNode -> xNdx ;
  +            pPrevNode -> xNext = pRunNode -> xNdx ;
  +
  +            if (pCurrReq -> bDebug & dbgParse)
  +	        lprintf (pCurrReq, "[%d]Checkpoint: jump backward DomTree=%d Index=%d Node=%d RepeatLevel=%d Line=%d -> Index=%d Node=%d Line=%d SVs=%d\n", pCurrReq -> nPid, xDomTree, nCompileCheckpoint, pPrevNode -> xNdx, r -> nCurrRepeatLevel, pPrevNode -> nLinenumber, nRunCheckpoint, pRunNode -> xNdx, pRunNode -> nLinenumber, sv_count) ; 
  +
  +            }
  +        else if (pPrevNode -> xNdx == pRunParent -> xNdx)
               {
  +            pRunNode = Node_selfLastChild (pDomTree, pRunParent, r -> nCurrRepeatLevel) ;
  +            r -> nCurrRepeatLevel++ ;            
  +            Node_selfForceLevel (pDomTree, pPrevNode -> xNdx, r -> nCurrRepeatLevel) ; /* make sure we have a node that points out of the loop */
               pRunNode = Node_selfCondCloneNode (pDomTree, pRunNode, r -> nCurrRepeatLevel) ;
           
               pRunNode -> xPrev = pPrevNode -> xNdx ;
               pPrevNode -> xNext = pRunNode -> xNdx ;
   
               if (pCurrReq -> bDebug & dbgParse)
  -	        lprintf (pCurrReq, "[%d]Checkpoint: jump backward DomTree=%d Index=%d Node=%d Line=%d -> Index=%d Node=%d Line=%d SVs=%d\n", pCurrReq -> nPid, xDomTree, nCompileCheckpoint, pPrevNode -> xNdx, pPrevNode -> nLinenumber, nRunCheckpoint, pRunNode -> xNdx, pRunNode -> nLinenumber, sv_count) ; 
  +	        lprintf (pCurrReq, "[%d]Checkpoint: jump backward last child DomTree=%d Index=%d Node=%d RepeatLevel=%d Line=%d -> Index=%d Node=%d Line=%d SVs=%d\n", pCurrReq -> nPid, xDomTree, nCompileCheckpoint, pPrevNode -> xNdx, r -> nCurrRepeatLevel, pPrevNode -> nLinenumber, nRunCheckpoint, pRunNode -> xNdx, pRunNode -> nLinenumber, sv_count) ; 
   
  -	    r -> nCurrRepeatLevel++ ;            
               }
           else
               {
               if (pCurrReq -> bDebug & dbgParse)
  -	        lprintf (pCurrReq, "[%d]Checkpoint: jump forward2 DomTree=%d Index=%d Node=%d,%d Line=%d -> Index=%d Node=%d,%d Line=%d SVs=%d\n", pCurrReq -> nPid, xDomTree, nCompileCheckpoint, pPrevNode -> xNdx, pCompileParent -> xNdx, pPrevNode -> nLinenumber, nRunCheckpoint, pRunNode -> xNdx, pRunParent -> xNdx, pRunNode -> nLinenumber, sv_count) ; 
  +	        lprintf (pCurrReq, "[%d]Checkpoint: jump backward2 DomTree=%d Index=%d Node=%d,%d Line=%d -> Index=%d Node=%d,%d Line=%d SVs=%d\n", pCurrReq -> nPid, xDomTree, nCompileCheckpoint, pPrevNode -> xNdx, pCompileParent -> xNdx, pPrevNode -> nLinenumber, nRunCheckpoint, pRunNode -> xNdx, pRunParent -> xNdx, pRunNode -> nLinenumber, sv_count) ; 
   
               mydie ("Unstrutured backward jump") ;
               }
           }
  +    r -> nCurrCheckpoint = nRunCheckpoint + 1 ;
       }
   
   
  @@ -1230,6 +1246,8 @@
       int         o ;
   
   
  +    return 1 ;
  +
       if (!pArgNode)
   	{
       	pArgNode = pNode ;
  @@ -1253,7 +1271,7 @@
   
       xNode = pNode -> xNdx ;
   
  -    mydie ("DomTree_selfDiscardAfterCheckpoint missing") ;
  +    //mydie ("DomTree_selfDiscardAfterCheckpoint missing") ;
   #if 0
       pOrder = pDomTree -> pOrder ;
       o = n = ArrayGetSize (pOrder) ;
  @@ -1351,13 +1369,33 @@
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
   /* Node_cloneNode                                                           */
  -/*                                                                          */
  -/* clone a node                                                             */
  -/* bDeep = 1 clone childs also                                              */
  -/* bDeep = 0 clone no childs                                                */
  -/* bDeep = -1 clone no attributes and no childs                             */
   /*                                                                          */
  -/* ------------------------------------------------------------------------ */
  +/*! 
  +*   \_en
  +*   clones a node 
  +*   
  +*   @param  pDomTree	    current DomTree we are working on              
  +*   @param  pNode           node that should be cloned
  +*   @param  nRepeatLevel    repeat level for new node
  +*   @param  bDeep           determines how childs are handled
  +*                           - 1 clone childs also 
  +*                           - 0 clone no childs 
  +*                           - -1 clone no attributes and no childs
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Cloned einen Node
  +*
  +*   @param  pDomTree	    DomTree der den Node enth�lt              
  +*   @param  pNode           Node der gecloned werden soll
  +*   @param  nRepeatLevel    RepeatLevel f�r neuen Node
  +*   @param  bDeep           legt fest wie Kindelemente behandelt werden
  +*                           - 1 cloned Kindelemente 
  +*                           - 0 cloned keine Kindelemente
  +*                           - -1 cloned keine Attribute und keine Kindelemente
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
   
   
   tNodeData * Node_selfCloneNode (/*in*/ tDomTree *      pDomTree,
  @@ -1415,6 +1453,36 @@
       }
                                   
   
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* Node_cloneNode                                                           */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   clones a node 
  +*   
  +*   @param  pDomTree	    current DomTree we are working on              
  +*   @param  xNode           node that should be cloned
  +*   @param  nRepeatLevel    repeat level for new node
  +*   @param  bDeep           determines how childs are handled
  +*                           - 1 clone childs also 
  +*                           - 0 clone no childs 
  +*                           - -1 clone no attributes and no childs
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Cloned einen Node
  +*
  +*   @param  pDomTree	    DomTree der den Node enth�lt              
  +*   @param  xNode           Node der gecloned werden soll
  +*   @param  nRepeatLevel    RepeatLevel f�r neuen Node
  +*   @param  bDeep           legt fest wie Kindelemente behandelt werden
  +*                           - 1 cloned Kindelemente 
  +*                           - 0 cloned keine Kindelemente
  +*                           - -1 cloned keine Attribute und keine Kindelemente
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
   
   
   tNode Node_cloneNode (/*in*/ tDomTree *      pDomTree,
  @@ -1434,11 +1502,44 @@
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
   /* Node_selfCondCloneNode                                                   */
  -/*                                                                          */
  -/* clone a node if it's part of a different DomTree or has a different      */
  -/* repeat level in preparation for a modification                            */
   /*                                                                          */
  -/* ------------------------------------------------------------------------ */
  +/*! 
  +*   \_en
  +*   clone a node if it's part of a different DomTree or has a different     
  +*   repeat level in preparation for a modification. This is part of the
  +*   copy on write stragtegie. As long as a node isn't written to it may 
  +*   point to another node from which the current DomTree was copied or
  +*   within a different repeat level. Before writing to the node this
  +*   function has to be called to make sure we are modifing the right node                           
  +*
  +*   @note   Most times you will not call this function directly. All functions
  +*           that operates on the DomTree makes sure to call this function first
  +*           for you
  +*   
  +*   @param  pDomTree	    current DomTree we are working on              
  +*   @param  pNode           node that should be cloned
  +*   @param  nRepeatLevel    repeat level for new node
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Cloned einen Node wenn dieser Teil eines anderen DomTree oder eines
  +*   anderen RepeatLevel ist. Dies ist Teil der "copy on write" Strategie
  +*   solange ein Node nicht beschrieben wird, kann dieser als Zeiger auf
  +*   einen anderen Node in einem DomTree oder RepeatLevel aus dem er kopiert
  +*   wurde sein. Sobald der Node ge�ndert werden mu�, mu� diese Funktion
  +*   aufgerufen werden um sicherzustellen das der korekte Node modifiziert
  +*   wird.
  +*
  +*   @note   In den meisten F�llen ist es nicht n�tig diese Funktion direkt
  +*           aufzurufen, da alle Funktionen die den DomTree modifizieren
  +*           dies sicherstellen.
  +*
  +*   @param  pDomTree	    DomTree der den Node enth�lt              
  +*   @param  pNode           Node der gecloned werden soll
  +*   @param  nRepeatLevel    RepeatLevel f�r neuen Node
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
   
   
   tNodeData * Node_selfCondCloneNode (/*in*/ tDomTree *      pDomTree,
  @@ -1459,6 +1560,7 @@
       if (pNode -> xDomTree == pDomTree -> xNdx && pNode -> nRepeatLevel == nRepeatLevel)
           return pNode ;
   
  +
       if (nRepeatLevel == 0)
           {
           pLookup = pDomTree -> pLookup ;
  @@ -1498,6 +1600,7 @@
       if (!(pNew = Node_selfCloneNode (pDomTree, pNode, nRepeatLevel, 1))) 
           return NULL ;
   
  +    pLookup = pDomTree -> pLookup ;
       pLookupLevelNode = pLookup[pNode -> xNdx].pLookupLevel ;
       if (!pLookupLevelNode)
           {
  @@ -1508,6 +1611,7 @@
           pLookupLevelNode -> numItems = 8 ;
           memset (pLookupLevelNode -> items, 0, sizeof (*pLookupLevelNodeLevel) * 8) ;
           }
  +    pLookup[pNew -> xNdx].pLookupLevel = pLookupLevelNode ;
       pLookupLevelNodeLevel= &pLookupLevelNode -> items[nRepeatLevel & pLookupLevelNode -> nMask] ;
       if (pLookupLevelNodeLevel -> pNode)
           {
  @@ -1529,9 +1633,44 @@
       }
   
                                   
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* Node_selfForceLevel                                                      */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   returns a pointer to a node for a given index and repeat level. If the
  +*   node does not exist in the current DomTree or RepeatLevel it is created
  +*   
  +*   @param  pDomTree	    current DomTree we are working on              
  +*   @param  xNode           index for node
  +*   @param  nRepeatLevel    repeat level for node
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Liefert einen Zeiger auf eine Node zu einen gegebenen Index und RepeatLevel.
  +*   Existiert der Node noch nicht in diesem DomTree oder RepeatLevel wird er
  +*   erzeugt
  +*
  +*   @param  pDomTree	    DomTree der den Node enth�lt              
  +*   @param  xNode           index f�r Node
  +*   @param  nRepeatLevel    RepeatLevel f�r Node
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
   
   
  +tNodeData * Node_selfForceLevel(/*in*/ tDomTree *      pDomTree,
  +				/*in*/ tNode           xNode,
  +                                /*in*/ tRepeatLevel    nRepeatLevel)
   
  +    {
  +    tNodeData * pNode = Node_selfLevel (pDomTree, xNode, nRepeatLevel) ;
  +
  +    return Node_selfCondCloneNode (pDomTree, pNode, nRepeatLevel) ;
  +    }
  +
  +
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
   /* Node_newAndAppend                                                        */
  @@ -2293,7 +2432,7 @@
   
       {
       if (pNode -> xChilds)
  -        return Node_selfLevel (pDomTree, Node_selfFirstChild (pDomTree, pNode, nRepeatLevel) -> xPrev, nRepeatLevel) ;
  +        return Node_selfNotNullLevel (pDomTree, Node_selfFirstChild (pDomTree, pNode, nRepeatLevel) -> xPrev, nRepeatLevel) ;
       
       return 0 ;
       }
  @@ -2327,7 +2466,7 @@
   
           do
               {
  -            pChild = Node_selfLevel (pDomTree, pChild -> xNext, nRepeatLevel) ;
  +            pChild = Node_selfNotNullLevel (pDomTree, pChild -> xNext, nRepeatLevel) ;
               if (nChildNo-- < 2)
                   return pChild ;
               }
  @@ -2359,13 +2498,13 @@
       if (pNode -> xNext == pNode -> xNdx)
           return NULL ;
       
  -    if ((pParent = Node_selfLevel (pDomTree, pNode -> xParent, nRepeatLevel)) != NULL)
  +    if ((pParent = Node_selfNotNullLevel (pDomTree, pNode -> xParent, nRepeatLevel)) != NULL)
           {
           if (pParent -> xChilds == pNode -> xNext)
               return NULL ;
           }
   
  -    pNxt = Node_selfLevel (pDomTree, pNode -> xNext, nRepeatLevel) ; 
  +    pNxt = Node_selfNotNullLevel (pDomTree, pNode -> xNext, nRepeatLevel) ; 
       
       if (!pParent)
           {
  @@ -2391,13 +2530,13 @@
   
   
       {
  -    tNodeData * pNode = Node_selfLevel (pDomTree, xNode, nRepeatLevel) ;
  +    tNodeData * pNode = Node_selfNotNullLevel (pDomTree, xNode, nRepeatLevel) ;
       tNodeData * pParent  ;
   
       if (pNode -> xNext == pNode -> xNdx)
           return 0 ;
       
  -    pParent = Node_selfLevel (pDomTree, pNode -> xParent, nRepeatLevel) ;
  +    pParent = Node_selfNotNullLevel (pDomTree, pNode -> xParent, nRepeatLevel) ;
       if (pParent -> xChilds == pNode -> xNext)
           return 0 ;
       
  @@ -2424,11 +2563,11 @@
       if (pNode -> xPrev == pNode -> xNdx)
           return 0 ;
       
  -    pParent = Node_selfLevel (pDomTree, pNode -> xParent, nRepeatLevel) ;
  +    pParent = Node_selfNotNullLevel (pDomTree, pNode -> xParent, nRepeatLevel) ;
       if (pParent -> xChilds == pNode -> xNdx)
           return 0 ;
       
  -    return Node_selfLevel (pDomTree, pNode -> xPrev, nRepeatLevel) ;
  +    return Node_selfNotNullLevel (pDomTree, pNode -> xPrev, nRepeatLevel) ;
       }
   
   
  @@ -2447,13 +2586,13 @@
   
   
       {
  -    tNodeData * pNode = Node_selfLevel (pDomTree, xNode, nRepeatLevel) ;
  +    tNodeData * pNode = Node_selfNotNullLevel (pDomTree, xNode, nRepeatLevel) ;
       tNodeData * pParent  ;
   
       if (pNode -> xPrev == pNode -> xNdx)
           return 0 ;
       
  -    pParent = Node_selfLevel (pDomTree, pNode -> xParent, nRepeatLevel) ;
  +    pParent = Node_selfNotNullLevel (pDomTree, pNode -> xParent, nRepeatLevel) ;
       if (pParent -> xChilds == pNode -> xNdx)
           return 0 ;
       
  @@ -2539,6 +2678,8 @@
       tNodeData * pFirstNode = pNode ;
       
       
  +    if (pNode -> nRepeatLevel)
  +        nRepeatLevel = pNode -> nRepeatLevel ;
       
       if (pNode -> nType == ntypDocumentFraq)
   	{
  @@ -2555,8 +2696,11 @@
   
       pNode = Node_selfFirstChild (pDomTree, pNode, nRepeatLevel) ;
   
  +
       while (pNode)
   	{
  +        if (pNode -> nRepeatLevel)
  +            nRepeatLevel = pNode -> nRepeatLevel ;
   #if 0
           if (pNode -> bFlags & nflgCheckpoint)
   	    { /* see how the control flow contiounes */
  @@ -2666,7 +2810,7 @@
   #endif
   
   	if (pCurrReq -> bDebug & dbgParse)
  -	    lprintf (r, "[%d]toString: Node=%d type=%d flags=%x text=>%s<= (#%d) SVs=%d\n", r -> nPid, pNode -> xNdx, pNode -> nType,  pNode -> bFlags, Ndx2String (pNode -> nText), pNode -> nText, sv_count) ; 
  +	    lprintf (r, "[%d]toString: Node=%d RepeatLevel=%d type=%d flags=%x text=>%s<= (#%d) SVs=%d\n", r -> nPid, pNode -> xNdx, nRepeatLevel, pNode -> nType,  pNode -> bFlags, Ndx2String (pNode -> nText), pNode -> nText, sv_count) ; 
   
   	if (pNode -> bFlags & nflgIgnore)
               ;
  
  
  
  1.4.2.33  +10 -4     embperl/Attic/epdom.h
  
  Index: epdom.h
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epdom.h,v
  retrieving revision 1.4.2.32
  retrieving revision 1.4.2.33
  diff -u -r1.4.2.32 -r1.4.2.33
  --- epdom.h	2001/10/23 19:35:13	1.4.2.32
  +++ epdom.h	2001/10/24 14:13:15	1.4.2.33
  @@ -9,7 +9,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epdom.h,v 1.4.2.32 2001/10/23 19:35:13 richter Exp $
  +#   $Id: epdom.h,v 1.4.2.33 2001/10/24 14:13:15 richter Exp $
   #
   ###################################################################################*/
   
  @@ -177,9 +177,10 @@
   
   struct tRepeatLevelLookup
       {
  -    tRepeatLevel	    numItems ;	/* size of table (must be 2^n) */
  -    tRepeatLevel	    nMask ;	/* mask (usualy numItems - 1) */
  -    tRepeatLevelLookupItem  items[1] ;	/* array with numItems items */
  +    tNode                   xNullNode ; /**< node index of node with RepeatLevel == 0 */
  +    tRepeatLevel	    numItems ;	/**< size of table (must be 2^n) */
  +    tRepeatLevel	    nMask ;	/**< mask (usualy numItems - 1) */
  +    tRepeatLevelLookupItem  items[1] ;	/**< array with numItems items */
       } ;
   
   typedef struct tRepeatLevelLookup tRepeatLevelLookup ;
  @@ -351,6 +352,7 @@
   
   #define Node_self(pDomTree,xNode)	    ((struct tNodeData *)(pDomTree -> pLookup[xNode].pLookup))
   #define Node_selfLevel(pDomTree,xNode,nLevel)  (pDomTree -> pLookup[xNode].pLookup?((((struct tNodeData *)(pDomTree -> pLookup[xNode].pLookup)) -> nRepeatLevel == nLevel || pDomTree -> pLookup[xNode].pLookupLevel == NULL)?((struct tNodeData *)(pDomTree -> pLookup[xNode].pLookup)):Node_selfLevelItem(pDomTree,xNode,nLevel)):NULL)
  +#define Node_selfNotNullLevel(pDomTree,xNode,nLevel)  (pDomTree -> pLookup[xNode].pLookup?((((struct tNodeData *)(pDomTree -> pLookup[xNode].pLookup)) -> nRepeatLevel == nLevel || ((struct tNodeData *)(pDomTree -> pLookup[xNode].pLookup)) -> nRepeatLevel !=  0 || pDomTree -> pLookup[xNode].pLookupLevel == NULL)?((struct tNodeData *)(pDomTree -> pLookup[xNode].pLookup)):Node_selfLevelItem(pDomTree,xNode,nLevel)):NULL)
   
   #define Node_parentNode(pDomTree,xNode,nLevel)	    (Node_selfLevel(pDomTree,xNode,nLevel)->xParent)
   #define Node_selfParentNode(pDomTree,pNode,nLevel) (Node_selfLevel(pDomTree,(pNode)->xParent,nLevel))
  @@ -373,6 +375,10 @@
   tNodeData * Node_selfCondCloneNode (/*in*/ tDomTree *      pDomTree,
   				    /*in*/ tNodeData *     pNode,
                                       /*in*/ tRepeatLevel    nRepeatLevel) ;
  +
  +tNodeData * Node_selfForceLevel(/*in*/ tDomTree *      pDomTree,
  +				/*in*/ tNode           xNode,
  +                                /*in*/ tRepeatLevel    nRepeatLevel) ;
   
   tNode Node_cloneNode (/*in*/ tDomTree *      pDomTree,
   		      /*in*/ tNode 	     xNode,
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: embperl-cvs-unsubscribe@perl.apache.org
For additional commands, e-mail: embperl-cvs-help@perl.apache.org