richter     00/07/07 03:07:59

  Modified:    .        Tag: Embperl2 epcomp.c epdom.c epparse.c
  Log:
  Embperl 2 - Memory Management
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.41  +53 -31    embperl/Attic/epcomp.c
  
  Index: epcomp.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epcomp.c,v
  retrieving revision 1.1.2.40
  retrieving revision 1.1.2.41
  diff -u -r1.1.2.40 -r1.1.2.41
  --- epcomp.c  2000/07/05 11:50:40     1.1.2.40
  +++ epcomp.c  2000/07/07 10:07:57     1.1.2.41
  @@ -691,6 +691,50 @@
   
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
  +/* embperl_CompileCleanupSpaces                                             */
  +/*                                                                          */
  +/* remove any following spaces                                              */
  +/*                                                                          */
  +/* ------------------------------------------------------------------------ */
  +
  +
  +static int embperl_CompileCleanupSpaces  (/*in*/  tReq *     r,
  +                                       /*in*/  tDomTree *    pDomTree,
  +                                       /*in*/  tNodeData *   pNode,
  +                                       /*i/o*/ tEmbperlCmd * pCmd)
  +
  +
  +    {
  +    if ((pCmd -> bRemoveNode & 6) && (r -> bOptions & optKeepSpaces) == 0)
  +     {
  +     tNodeData *  pNextNode   = Node_selfFirstChild (pDomTree, pNode) ;
  +     if ((pCmd -> bRemoveNode & 1) || !pCmd -> bCompileChilds || pNextNode == NULL 
|| (pNextNode -> nType != ntypText && pNextNode -> nType != ntypCDATA))
  +         pNextNode    = Node_selfNextSibling (pDomTree, pNode) ;
  +     if (pNextNode)
  +         {
  +         const char * sText        = Node_selfNodeName (pNextNode) ;
  +         const char * p            = sText ;
  +
  +         while (*p && isspace (*p))
  +             p++;
  +         if (p > sText && (pCmd -> bRemoveNode & 4))
  +             p-- ;
  +
  +         if (p > sText)
  +             { /* remove spaces */
  +             if (*p)
  +                 Node_replaceChildWithCDATA(pDomTree, -1, pNextNode -> xNdx, p, 
strlen (p), -1, 0) ;
  +             else
  +                 Node_selfRemoveChild(pDomTree, -1, pNextNode) ;
  +             }
  +
  +         }
  +     }
  +    }
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
   /* embperl_CompileNode                                                      */
   /*                                                                          */
   /* Compile one node and his childs                                          */
  @@ -698,9 +742,10 @@
   /* ------------------------------------------------------------------------ */
   
   
  -int embperl_CompileNode (/*in*/  tDomTree *   pDomTree,
  -                  /*in*/ tNode         xNode,
  -                  /*i/o*/ int *        bCheckpointPending)
  +int embperl_CompileNode (/*in*/  tReq *         r,
  +                      /*in*/  tDomTree *     pDomTree,
  +                      /*in*/  tNode          xNode,
  +                      /*i/o*/ int *          bCheckpointPending)
   
   
       {
  @@ -768,7 +813,7 @@
   
                   while (pChild)
                       {
  -                    embperl_CompileNode (pDomTree, pChild -> xNdx, 
bCheckpointPending) ;
  +                    embperl_CompileNode (r, pDomTree, pChild -> xNdx, 
bCheckpointPending) ;
                       pChild = Node_selfNextSibling (pDomTree, pChild) ;
                       }
                   }                
  @@ -835,31 +880,8 @@
                   }
               }
   
  -        if (pCmd -> bRemoveNode & 6)
  -         {
  -         tNodeData *  pNextNode    = Node_selfFirstChild (pDomTree, pNode) ;
  -         if (pNextNode == NULL || (pNextNode -> nType != ntypText && pNextNode -> 
nType != ntypCDATA))
  -             pNextNode    = Node_selfNextSibling (pDomTree, pNode) ;
  -         if (pNextNode)
  -             {
  -             const char * sText        = Node_selfNodeName (pNextNode) ;
  -             const char * p            = sText ;
  -
  -             while (*p && isspace (*p))
  -                 p++;
  -             if (p > sText && (pCmd -> bRemoveNode & 4))
  -                 p-- ;
  -
  -             if (p > sText)
  -                 { /* remove spaces */
  -                 if (*p)
  -                     Node_replaceChildWithCDATA(pDomTree, -1, pNextNode -> xNdx, p, 
strlen (p), -1, 0) ;
  -                 else
  -                     Node_selfRemoveChild(pDomTree, -1, pNextNode) ;
  -                 }
  -
  -             }
  -         }
  +     embperl_CompileCleanupSpaces (r, pDomTree, pNode, pCmd) ;
  +        
           if (pCmd -> sMayJump)
               if (embperl_CompileToPerlCode (pDomTree, pNode, pCmd -> sMayJump, 
&sStackValue))
                {
  @@ -927,7 +949,7 @@
   
        while (xChildNode)
            {
  -         if ((rc = embperl_CompileNode (pDomTree, xChildNode, bCheckpointPending)) 
!= ok)
  +         if ((rc = embperl_CompileNode (r, pDomTree, xChildNode, 
bCheckpointPending)) != ok)
                return rc ;
   
            xChildNode  = Node_nextSibling (pDomTree, xChildNode) ;
  @@ -1090,7 +1112,7 @@
           pDomTree -> pSV = (SV *)newHV () ;
        nLabelCnt = 1 ;
        
  -     if ((rc = embperl_CompileNode (pDomTree, r -> xDocument, &bCheckpointPending)) 
!= ok)
  +     if ((rc = embperl_CompileNode (r, pDomTree, r -> xDocument, 
&bCheckpointPending)) != ok)
            {
            *ppSV = newSVpvf ("%s\t%s", r -> errdat1, r -> errdat2) ;
            SvUPGRADE (*ppSV, SVt_PVIV) ;
  
  
  
  1.1.2.49  +88 -31    embperl/Attic/epdom.c
  
  Index: epdom.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epdom.c,v
  retrieving revision 1.1.2.48
  retrieving revision 1.1.2.49
  diff -u -r1.1.2.48 -r1.1.2.49
  --- epdom.c   2000/07/06 06:17:37     1.1.2.48
  +++ epdom.c   2000/07/07 10:07:57     1.1.2.49
  @@ -17,6 +17,7 @@
   
   HV * pStringTableHash ;          /* Hash to translate strings to index number */
   HE * * pStringTableArray  ;   /* Array with pointers to strings */
  +tStringIndex  * pFreeStringsNdx  ;   /* List of freed string indexes */
   
   
   tDomTree * pDomTrees ;
  @@ -394,7 +395,11 @@
   
       /* new string */
        
  -    nNdx = ArrayAdd (&pStringTableArray, 1) ;
  +    nNdx = ArraySub (&pFreeStringsNdx, 1) ;
  +    if (nNdx != (tIndex)(-1))
  +     nNdx = pFreeStringsNdx[nNdx] ;
  +    else
  +     nNdx = ArrayAdd (&pStringTableArray, 1) ;
       
       pSVNdx = newSViv (nNdx) ;
       SvTAINTED_off (pSVNdx) ;
  @@ -429,12 +434,21 @@
       
       SvREFCNT_dec (pSVNdx) ;
   
  +    /*
  +    if (nNdx == 3)
  +     lprintf (pCurrReq, "free string %s (#%d) refcnt=%d\n", Ndx2String (nNdx), 
nNdx, SvREFCNT(pSVNdx)) ;
  +    */
  +    
       if (SvREFCNT(pSVNdx) == 1)
        {
  +     int n ;
  +     
        lprintf (pCurrReq, "delete string %s (#%d)\n", Ndx2String (nNdx), nNdx) ;
        hv_delete (pStringTableHash, HeKEY (pHE), HeKLEN(pHE), 0) ;
        pStringTableArray[nNdx] = NULL ;
  -     
  +     n = ArrayAdd (&pFreeStringsNdx, 1) ;
  +     pFreeStringsNdx[n] = nNdx ;
  +
        numStr-- ;
        }
       }
  @@ -458,7 +472,8 @@
       
       pStringTableHash = newHV () ;
   
  -    ArrayNew (&pStringTableArray, 128, sizeof (HE *)) ; 
  +    ArrayNew (&pStringTableArray, 256, sizeof (HE *)) ; 
  +    ArrayNew (&pFreeStringsNdx, 256, sizeof (tStringIndex *)) ; 
   
       ArrayAdd (&pStringTableArray, 2) ;
       /* NULL */
  @@ -606,10 +621,13 @@
                while (n--)
                    {
                    pDomTree -> pLookup[pAttr -> xNdx] = NULL ;
  -                 if (pAttr -> xName)
  -                     NdxStringFree (pAttr -> xName) ;
  -                 if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
  -                     NdxStringFree (pAttr -> xValue) ;
  +                 if (pAttr -> bFlags)
  +                     {
  +                     if (pAttr -> xName)
  +                         NdxStringFree (pAttr -> xName) ;
  +                     if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
  +                         NdxStringFree (pAttr -> xValue) ;
  +                     }
                    pAttr++ ;
                    }
                lprintf (pCurrReq, "delete typ=%d  Node xNdx=%d\n", pNode -> nType, 
pNode -> xNdx) ; 
  @@ -1508,6 +1526,8 @@
        int     len  = sizeof (tNodeData) + pNode -> numAttr * sizeof (tAttrData) ; 
        int     numAttr = pOldChild -> numAttr ;
        int             nOffset ;
  +     tAttrData * pAttr  ;
  +     int         n      ;
   
        if (pNode -> numAttr > pOldChild -> numAttr)
            {
  @@ -1530,29 +1550,59 @@
        
        nOffset = pOldChild -> nPadOffset ;
        xOldChild = pOldChild -> xNdx ;
  +     
  +     if (pOldChild -> nText)
  +         NdxStringFree (pOldChild -> nText) ;
  +
  +     pAttr = ((struct tAttrData * )(pOldChild + 1))  ;
  +     n     = pOldChild -> numAttr ;
  +
  +     while (n > 0)
  +         {
  +         if (pAttr -> xName)
  +             NdxStringFree (pAttr -> xName) ;
  +         if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
  +             NdxStringFree  (pAttr -> xValue) ;
  +         n-- ;
  +         pAttr++ ;
  +         }
  +
        memcpy (pOldChild, pNode, len) ;
  +
  +     if (pOldChild -> nText)
  +         NdxStringRefcntInc (pOldChild -> nText) ;
        
   
        pOldChild -> nPadOffset = nOffset ;
        pOldChild -> xNdx       = xOldChild ;
        pOldChild -> bFlags |= bFlags ;
   
  -     if (numAttr > pNode -> numAttr)
  +     pAttr = ((struct tAttrData * )(pOldChild + 1))  ;
  +     n     = pNode -> numAttr ;
  +
  +     while (n > 0)
            {
  -         tAttrData * pAttr = ((struct tAttrData * )(pOldChild + 1)) + pOldChild -> 
numAttr ;
  -         int         n     = numAttr - pNode -> numAttr ;
  +         if (pAttr -> xName)
  +             NdxStringRefcntInc (pAttr -> xName) ;
  +         if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
  +             NdxStringRefcntInc  (pAttr -> xValue) ;
  +         n-- ;
  +         pAttr++ ;
  +         }
  +     
  +     pAttr = ((struct tAttrData * )(pOldChild + 1)) + pOldChild -> numAttr ;
  +     n     = numAttr - pNode -> numAttr ;
   
  -         while (n > 0)
  -             {
  -             pAttr -> bFlags = nflgDeleted ;
  -             if (pAttr -> xName)
  -                 NdxStringFree (pAttr -> xName) ;
  -             if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
  -                 NdxStringFree (pAttr -> xValue) ;
  -             n-- ;
  -             pAttr++ ;
  -             }
  -         }       
  +     while (n > 0)
  +         {
  +         pAttr -> bFlags = nflgDeleted ;
  +         if (pAttr -> xName)
  +             NdxStringFree (pAttr -> xName) ;
  +         if (pAttr -> xValue && (pAttr -> bFlags & aflgAttrValue))
  +             NdxStringFree (pAttr -> xValue) ;
  +         n-- ;
  +         pAttr++ ;
  +         }
        }
   
       if (pOldChild -> nType == ntypDocumentFraq)
  @@ -1962,18 +2012,25 @@
            while (pOrder[i].xFromNode != pNode -> xNdx && i < n)  
                i++ ;
            
  -         if ((xNextNode = pOrder[i].xToNode) != pNode -> xNdx && xNextNode)  
  -             {
  -             if (pCurrReq -> bDebug & dbgParse)
  -                 lprintf (r, "[%d]toString: Replace Node=%d with Node=%d\n", r -> 
nPid, pNode -> xNdx, xNextNode) ; 
  -             pSavedNode = pNode ;    
  -             pNode  = Node_self (pDomTree, xNextNode) ;
  -             pSavedNodeFrom = pNode ;    
  +         if (i < n)
  +             {                   
  +             if ((xNextNode = pOrder[i].xToNode) != pNode -> xNdx && xNextNode)     
 
  +                 {
  +                 if (pCurrReq -> bDebug & dbgParse)
  +                     lprintf (r, "[%d]toString: Replace Node=%d with Node=%d\n", r 
-> nPid, pNode -> xNdx, xNextNode) ; 
  +                 pSavedNode = pNode ;    
  +                 pNode  = Node_self (pDomTree, xNextNode) ;
  +                 pSavedNodeFrom = pNode ;    
  +                 }
  +             if (i == nOrderNdx)
  +                 nOrderNdx++, nOrderIndexNode = -1 ;
  +             else
  +                 nOrderIndexNode = i ;
                }
  -         if (i == nOrderNdx)
  -             nOrderNdx++, nOrderIndexNode = -1 ;
            else
  -             nOrderIndexNode = i ;
  +             {
  +             mydie ("Internal Error: Orderindex out of range") ;
  +             }
            }
   
   
  
  
  
  1.1.2.30  +1 -1      embperl/Attic/epparse.c
  
  Index: epparse.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epparse.c,v
  retrieving revision 1.1.2.29
  retrieving revision 1.1.2.30
  diff -u -r1.1.2.29 -r1.1.2.30
  --- epparse.c 2000/07/06 06:17:41     1.1.2.29
  +++ epparse.c 2000/07/07 10:07:58     1.1.2.30
  @@ -612,7 +612,7 @@
                        }
                    if (pInside = pToken -> pInside)
                        { /* parse for further tokens inside of this token */
  -                        ParseTokens (r, &pCurr, pEnd, pInside, pToken -> sEndText, 
pToken -> pContains, pToken -> nCDataType == -1?ntypAttrValue:pToken -> nCDataType, 0, 
pToken -> bUnescape, pNodeName, xNewNode, level+1) ;
  +                        ParseTokens (r, &pCurr, pEnd, pInside, pToken -> sEndText, 
pToken -> pContains, pToken -> nCDataType == ntypCDATA?ntypAttrValue:pToken -> 
nCDataType, 0, pToken -> bUnescape, pNodeName, xNewNode, level+1) ;
                        }    
                    else
                        { /* nothing more inside of this token allowed, so search for 
the end of the token */
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to