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...@locus.apache.org on 2000/09/26 21:32:23 UTC

cvs commit: embperl/test/html callsub.htm importsub.htm

richter     00/09/26 12:32:22

  Modified:    .        Tag: Embperl2c DOM.xs Embperl.xs ep.h epcmd.c
                        epcomp.c epdom.c epdom.h epeval.c test.pl typemap
               Embperl  Tag: Embperl2c Syntax.pm
               test/cmp Tag: Embperl2c callsub.htm
               test/html Tag: Embperl2c callsub.htm importsub.htm
  Log:
  Embperl 2 - sub's
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.3   +151 -12   embperl/DOM.xs
  
  Index: DOM.xs
  ===================================================================
  RCS file: /home/cvs/embperl/DOM.xs,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- DOM.xs	2000/09/14 05:08:25	1.1.2.2
  +++ DOM.xs	2000/09/26 19:31:56	1.1.2.3
  @@ -21,14 +21,63 @@
   
   MODULE = XML::Embperl::DOM      PACKAGE = XML::Embperl::DOM::Node     PREFIX = embperl_Node_
   
  +void
  +embperl_Node_attach (pRV,xDomTree,xNode)
  +    SV * pRV ;
  +    int  xDomTree
  +    int  xNode
  +CODE:
  +    tDomNode * pDomNode ;
  +    MAGIC * mg ;
  +    SV *    pSV = SvRV(pRV) ;
  +    if (mg = mg_find (pSV, '~'))
  +        {
  +        pDomNode = (tDomNode *)(mg -> mg_len) ;
  +        if (xDomTree)
  +            pDomNode -> xDomTree = xDomTree ;
  +        if (xNode)    
  +            pDomNode -> xNode = xNode ;
  +        }    
  +    else
  +        {
  +        Newc (0, pDomNode, 1, sizeof (tDomNode), tDomNode) ;
  +        pDomNode -> xDomTree = xDomTree ;
  +        pDomNode -> xNode = xNode ;
  +        pDomNode -> pDomNodeSV = pRV ;
  +        /* sv_unmagic ((SV *)pSV, '~') ; */
  +        sv_magic ((SV *)pSV, NULL, '~', NULL, (STRLEN)pDomNode) ;
  +        /* sv_bless (pRV, gv_stashpv ("XML::Embperl::DOM::Node", 0)) ; */
  +        }
  +    
  +
  +
  +SV *
  +embperl_Node_replaceChildWithCDATA (pDomNode,sText)
  +    tDomNode * pDomNode
  +    SV *     sText
  +PREINIT:
  +    STRLEN l ;
  +    char * s  ;
  +PPCODE:
  +    s = SV2String (sText, l) ;
  +    Node_replaceChildWithCDATA (DomTree_self(pDomNode -> xDomTree), -1, pDomNode -> xNode, s, l, (pCurrReq -> nCurrEscMode & 3)== 3?1 + (pCurrReq -> nCurrEscMode & 4):pCurrReq -> nCurrEscMode, nflgModified | nflgReturn) ;
  +    pCurrReq -> nCurrEscMode = pCurrReq -> nEscMode ;
  +    pCurrReq -> bEscModeSet = -1 ;
  +    /*SvREFCNT_inc (sText) ;*/
  +    ST(0) = sText ;
  +    XSRETURN(1) ;
  +
  +
   SV *
  -embperl_Node_replaceChildWithCDATA (xDomTree, xOldChild,sText)
  +embperl_Node_iReplaceChildWithCDATA (xDomTree, xOldChild,sText)
       int xDomTree
       int xOldChild
       SV * sText
  -PPCODE:
  +PREINIT:
       STRLEN l ;
  -    char * s = SV2String (sText, l) ;
  +    char * s  ;
  +PPCODE:
  +    s = SV2String (sText, l) ;
       Node_replaceChildWithCDATA (DomTree_self(xDomTree), -1, xOldChild, s, l, (pCurrReq -> nCurrEscMode & 3)== 3?1 + (pCurrReq -> nCurrEscMode & 4):pCurrReq -> nCurrEscMode, nflgModified | nflgReturn) ;
       pCurrReq -> nCurrEscMode = pCurrReq -> nEscMode ;
       pCurrReq -> bEscModeSet = -1 ;
  @@ -36,8 +85,22 @@
       ST(0) = sText ;
       XSRETURN(1) ;
   
  +
  +
   SV *
  -embperl_Node_replaceChildWithUrlDATA (xDomTree, xOldChild,sText)
  +embperl_Node_replaceChildWithUrlDATA (pDomNode,sText)
  +    tDomNode * pDomNode
  +    SV * sText
  +PREINIT:
  +    SV * sRet  ;
  +PPCODE:
  +    sRet = Node_replaceChildWithUrlDATA (pDomNode -> xDomTree, pDomNode -> xNode,sText) ;
  +
  +    ST(0) = sRet ;
  +    XSRETURN(1) ;
  +
  +SV *
  +embperl_Node_iReplaceChildWithUrlDATA (xDomTree, xOldChild,sText)
       int xDomTree
       int xOldChild
       SV * sText
  @@ -49,7 +112,14 @@
   
   
   void
  -embperl_Node_removeChild (xDomTree, xChild)
  +embperl_Node_removeChild (pDomNode)
  +    tDomNode * pDomNode
  +CODE:
  +    Node_removeChild (DomTree_self (pDomNode -> xDomTree), -1, pDomNode -> xNode) ;
  +
  +
  +void
  +embperl_Node_iRemoveChild (xDomTree, xChild)
       int xDomTree
       int xChild
   CODE:
  @@ -57,7 +127,26 @@
   
   
   void
  -embperl_Node_appendChild (xDomTree, xParent, nType, sText)
  +embperl_Node_appendChild (pParentNode, nType, sText)
  +    tDomNode * pParentNode
  +    int nType
  +    SV * sText
  +PREINIT:
  +    int xNewParent ;
  +    STRLEN nText ;
  +    char * sT  ;
  +    tDomTree * pDomTree  ;
  +CODE:
  +    sT = SV2String (sText, nText) ;
  +    pDomTree = DomTree_self(pParentNode -> xDomTree) ;
  +    Node_self (pDomTree,pParentNode -> xNode) -> bFlags |= nflgModified | nflgReturn ;
  +    xNewParent = Node_cloneNode (pDomTree, pParentNode -> xNode, 1) ;
  +    DomTree_selfCheckpoint (pDomTree, pParentNode -> xNode, xNewParent) ;
  +    Node_appendChild (pDomTree, nType, 0, sT, nText, xNewParent, 0, 0) ;
  +
  +
  +void
  +embperl_Node_iAppendChild (xDomTree, xParent, nType, sText)
       int xDomTree
       int xParent
       int nType
  @@ -76,9 +165,8 @@
   
   MODULE = XML::Embperl::DOM      PACKAGE = XML::Embperl::DOM::Tree     PREFIX = embperl_DomTree_
   
  -
   void
  -embperl_DomTree_checkpoint (xDomTree, xChild)
  +embperl_DomTree_iCheckpoint (xDomTree, xChild)
       int xDomTree
       int xChild
   CODE:
  @@ -87,7 +175,7 @@
       DomTree_checkpoint (xDomTree, xChild) ;
   
   void
  -embperl_DomTree_discardAfterCheckpoint (xDomTree, xNode)
  +embperl_DomTree_iDiscardAfterCheckpoint (xDomTree, xNode)
       int xDomTree
       int xNode
   CODE:
  @@ -107,8 +195,28 @@
   MODULE = XML::Embperl::DOM      PACKAGE = XML::Embperl::DOM::Element     PREFIX = embperl_Element_
   
   
  +void
  +embperl_Element_setAttribut (pDomNode, sAttr, sText)
  +    tDomNode * pDomNode
  +    SV * sAttr
  +    SV * sText
  +PREINIT:
  +    STRLEN nAttr ;
  +    STRLEN nText ;
  +    char * sT  ;
  +    char * sA  ;
  +    tDomTree * pDomTree ;
  +CODE:
  +    sT = SV2String (sText, nText) ;
  +    sA = SV2String (sAttr, nAttr) ;
  +
  +    pDomTree = DomTree_self (pDomNode -> xDomTree) ;
  +
  +    Element_selfSetAttribut (pDomTree, Node_self (pDomTree, pDomNode -> xNode), sA, nAttr, sT, nText, 1) ;
  +
  +
   void
  -embperl_Element_setAttribut (xDomTree, xNode, sAttr, sText)
  +embperl_Element_iSetAttribut (xDomTree, xNode, sAttr, sText)
       int xDomTree
       int xNode
       SV * sAttr
  @@ -126,7 +234,22 @@
   
   
   void
  -embperl_Element_removeAttribut (xDomTree, xNode, sAttr)
  +embperl_Element_removeAttribut (pDomNode, xNode, sAttr)
  +    tDomNode * pDomNode
  +    SV * sAttr
  +PREINIT:
  +    STRLEN nAttr ;
  +    char * sA  ;
  +    tDomTree * pDomTree ;
  +CODE:
  +    sA = SV2String (sAttr, nAttr) ;
  +    pDomTree = DomTree_self (pDomNode -> xDomTree) ;
  +
  +    Element_selfRemoveAttribut (pDomTree, Node_self (pDomTree, pDomNode -> xNode), sA, nAttr, 1) ;
  +
  +
  +void
  +embperl_Element_iRemoveAttribut (xDomTree, xNode, sAttr)
       int xDomTree
       int xNode
       SV * sAttr
  @@ -144,8 +267,24 @@
   
   
   
  +SV *
  +embperl_Attr_value (pAttr)
  +    tDomNode * pAttr
  +PREINIT:
  +    tDomTree * pDomTree  ;
  +    char * sAttrText = NULL ;
  +CODE:
  +    pDomTree = DomTree_self (pAttr -> xDomTree) ;
  +
  +    Attr_selfValue (pDomTree, Attr_self(pDomTree, pAttr -> xNode), &sAttrText) ;
  +    RETVAL = newSVpv (sAttrText, ArrayGetSize (sAttrText)) ;
  +    StringFree (&sAttrText) ;
  +OUTPUT:
  +    RETVAL
  +
  +
   SV *
  -embperl_Attr_value (xDomTree, xAttr)
  +embperl_Attr_iValue (xDomTree, xAttr)
       int xDomTree
       int xAttr
   CODE:
  
  
  
  1.29.4.3  +1 -1      embperl/Embperl.xs
  
  Index: Embperl.xs
  ===================================================================
  RCS file: /home/cvs/embperl/Embperl.xs,v
  retrieving revision 1.29.4.2
  retrieving revision 1.29.4.3
  diff -u -r1.29.4.2 -r1.29.4.3
  --- Embperl.xs	2000/09/14 05:08:26	1.29.4.2
  +++ Embperl.xs	2000/09/26 19:31:57	1.29.4.3
  @@ -11,7 +11,7 @@
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
   ###################################################################################*/
  -
  + 
   
   #include "ep.h"
   
  
  
  
  1.27.4.3  +4 -2      embperl/ep.h
  
  Index: ep.h
  ===================================================================
  RCS file: /home/cvs/embperl/ep.h,v
  retrieving revision 1.27.4.2
  retrieving revision 1.27.4.3
  diff -u -r1.27.4.2 -r1.27.4.3
  --- ep.h	2000/09/14 05:08:26	1.27.4.2
  +++ ep.h	2000/09/26 19:31:57	1.27.4.3
  @@ -465,8 +465,10 @@
   /* ---- from epeval.c ----- */
   
   
  -int EvalDirect (/*i/o*/ register req * r,
  -			/*in*/  SV * pArg) ;
  +int EvalDirect (/*i/o*/ register req *	r,
  +		/*in*/  SV *		pArg,
  +                /*in*/  int		numArgs,
  +                /*in*/  SV **		pArgs) ;
   
   int EvalNum (/*i/o*/ register req * r,
   	     /*in*/  char *        sArg,
  
  
  
  1.37.4.1  +1 -1      embperl/epcmd.c
  
  Index: epcmd.c
  ===================================================================
  RCS file: /home/cvs/embperl/epcmd.c,v
  retrieving revision 1.37
  retrieving revision 1.37.4.1
  diff -u -r1.37 -r1.37.4.1
  --- epcmd.c	2000/09/12 12:49:48	1.37
  +++ epcmd.c	2000/09/26 19:31:58	1.37.4.1
  @@ -877,7 +877,7 @@
   	           r -> Buf.sEvalPackage, r -> Buf.nSourceline, r -> Buf.pFile -> sSourcefile, sArg,
   		   r -> Buf.sEvalPackage, sArg) ;
   
  -    rc = EvalDirect (r, pSV) ;
  +    rc = EvalDirect (r, pSV, 0, NULL) ;
       SvREFCNT_dec(pSV);
   
       return rc ;
  
  
  
  1.4.2.5   +59 -23    embperl/Attic/epcomp.c
  
  Index: epcomp.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epcomp.c,v
  retrieving revision 1.4.2.4
  retrieving revision 1.4.2.5
  diff -u -r1.4.2.4 -r1.4.2.5
  --- epcomp.c	2000/09/19 07:21:56	1.4.2.4
  +++ epcomp.c	2000/09/26 19:31:58	1.4.2.5
  @@ -23,9 +23,11 @@
       const char *    sPerlCodeEnd ;          /* perl code that should be inserted at the end tag  */
       const char *    sStackName ;
       const char *    sPushStack ;
  +    const char *    sPopStack ;
       const char *    sMatchStack ;
       const char *    sStackName2 ;
       const char *    sPushStack2 ;
  +    const char *    sPopStack2 ;
       int		    numPerlCode ;
       int		    numCompileTimePerlCode ;
       int		    bRemoveNode ;
  @@ -184,18 +186,20 @@
       
       
       
  -    pCmd -> sPerlCodeEnd = GetHashValueStrDup  (pHash, "perlcodeend", NULL) ;
  -    pCmd -> sStackName   = GetHashValueStrDup  (pHash, "stackname", NULL) ;
  -    pCmd -> sPushStack   = GetHashValueStrDup  (pHash, "push", NULL) ;
  -    pCmd -> sMatchStack   = GetHashValueStrDup  (pHash, "stackmatch", NULL) ;
  -    pCmd -> sStackName2   = GetHashValueStrDup (pHash, "stackname2", NULL) ;
  -    pCmd -> sPushStack2   = GetHashValueStrDup (pHash, "push2", NULL) ;
  -    pCmd -> bRemoveNode  = GetHashValueInt     (pHash, "removenode", 0) ;
  -    pCmd -> sMayJump     = GetHashValueStrDup  (pHash, "mayjump", NULL) ;
  -    pCmd -> bPerlCodeRemove  = GetHashValueInt (pHash, "perlcoderemove", 0) ;
  -    pCmd -> bCompileChilds  = GetHashValueInt  (pHash, "compilechilds", 1) ;
  -    pCmd -> nSwitchCodeType  = GetHashValueInt  (pHash, "switchcodetype", 0) ;
  -    pCmd -> nNodeType  = nNodeType ;
  +    pCmd -> sPerlCodeEnd    = GetHashValueStrDup (pHash, "perlcodeend", NULL) ;
  +    pCmd -> sStackName	    = GetHashValueStrDup (pHash, "stackname", NULL) ;
  +    pCmd -> sPushStack	    = GetHashValueStrDup (pHash, "push", NULL) ;
  +    pCmd -> sPopStack	    = GetHashValueStrDup (pHash, "pop", NULL) ;
  +    pCmd -> sMatchStack	    = GetHashValueStrDup (pHash, "stackmatch", NULL) ;
  +    pCmd -> sStackName2	    = GetHashValueStrDup (pHash, "stackname2", NULL) ;
  +    pCmd -> sPushStack2	    = GetHashValueStrDup (pHash, "push2", NULL) ;
  +    pCmd -> sPopStack2	    = GetHashValueStrDup (pHash, "pop2", NULL) ;
  +    pCmd -> bRemoveNode	    = GetHashValueInt    (pHash, "removenode", 0) ;
  +    pCmd -> sMayJump	    = GetHashValueStrDup (pHash, "mayjump", NULL) ;
  +    pCmd -> bPerlCodeRemove = GetHashValueInt	 (pHash, "perlcoderemove", 0) ;
  +    pCmd -> bCompileChilds  = GetHashValueInt	 (pHash, "compilechilds", 1) ;
  +    pCmd -> nSwitchCodeType = GetHashValueInt	 (pHash, "switchcodetype", 0) ;
  +    pCmd -> nNodeType	    = nNodeType ;
       pCmd -> pNext  = NULL ;
   
       pEmbperlCmds[nNodeName].bRemoveNode |= pCmd -> bRemoveNode ;
  @@ -265,8 +269,18 @@
       
       if (sText)
   	{
  -        if (op == '=' && eq)
  +	int l = strlen (sText) ;
  +	if (out == 3)
   	    {
  +	    out = 2 ;
  +	    while (isspace (*sText))
  +		sText++, l-- ;
  +	    while (l > 0 && isspace (sText[l-1]))
  +		l-- ;
  +	    }
  +
  +	if (op == '=' && eq)
  +	    {
   	    eq++ ;
   	    do
   		{
  @@ -305,7 +319,7 @@
   	    if (out == 2)
   		{
   		StringAdd (ppCode, "'", 1) ;
  -		StringAdd (ppCode, sText, 0) ;
  +		StringAdd (ppCode, sText, l) ;
   		StringAdd (ppCode, "'", 1) ;
   		}
   	    else if (out)            
  @@ -581,7 +595,7 @@
   	{
   	if (pChildNode -> bFlags & aflgAttrChilds)
   	    {
  -	    int l = sprintf (buf, "XML::Embperl::DOM::Attr::value ($_ep_DomTree,%d)", pChildNode -> xNdx) ;
  +	    int l = sprintf (buf, "XML::Embperl::DOM::Attr::iValue ($_ep_DomTree,%d)", pChildNode -> xNdx) ;
   	    sText = buf ;
   	    if (out == 2)
   		out = 1 ;
  @@ -645,6 +659,8 @@
   		    out = 0, p++ ;
   		else if (*p == '\'')
   		    out = 2, p++ ;
  +		else if (*p == '"')
  +		    out = 3, p++ ;
   
   		
   		if (type == '#')
  @@ -811,7 +827,7 @@
   
   		pSV = newSVpvf("package %s ; \n#line %d \"%s\"\n%*.*s",
   			pCurrReq -> Buf.sEvalPackage, pNode ->	nLinenumber, sSourcefile, l,l, pCode) ;
  -		if ((rc = EvalDirect (pCurrReq, pSV)) != ok)
  +		if ((rc = EvalDirect (pCurrReq, pSV, 0, NULL)) != ok)
   		    LogError (pCurrReq, rc) ;
   		SvREFCNT_dec(pSV);
   		}
  @@ -920,6 +936,11 @@
   
   	}
   
  +    if (pCmd -> sPopStack)
  +	embperl_CompilePopStack (pDomTree, pCmd -> sPopStack) ;
  +    if (pCmd -> sPopStack2)
  +	embperl_CompilePopStack (pDomTree, pCmd -> sPopStack2) ;
  +
       if (pCmd -> sStackName)
   	{
   	if (pCmd -> sMatchStack && pNode -> nType != ntypStartTag && pNode -> nType != ntypDocument && pNode -> nType != ntypDocumentFraq)
  @@ -1022,11 +1043,11 @@
   			return rc ;
   		    }
   		}
  -	    else if (pCmd -> sPushStack)
  +	    else if (pCmd -> sPushStack && pCmd -> sPerlCodeEnd)
   		embperl_CompilePopStack (pDomTree, pCmd -> sStackName) ;
   	    }
   
  -        if (pCmd -> sStackName2 && pCmd -> sPushStack2)
  +        if (pCmd -> sStackName2 && pCmd -> sPushStack2 && pCmd -> sPerlCodeEnd)
               embperl_CompilePopStack (pDomTree, pCmd -> sStackName2) ;
     
   	if (pCmd -> nSwitchCodeType == 1)
  @@ -1258,6 +1279,8 @@
           }
       else if (*ppSV == NULL || !SvIOKp (*ppSV) )
   	{
  +	SV * args[2] ;
  +	
   	r -> nPhase  = phParse ;
   
   	if (*ppSV)
  @@ -1324,8 +1347,10 @@
   	if (l && pCurrReq -> bDebug & dbgParse)
   	    lprintf (r, "[%d]EPCOMP: AfterCompileTimeCode:    %*.*s\n", r -> nPid, l, l, pProgDef) ; 
   
  -	pSV = newSVpvf("package %s ; \n%*.*s", r -> Buf.sEvalPackage, l,l, pProgDef) ;
  -	if ((rc = EvalDirect (r, pSV)) != ok)
  +	pSV = newSVpvf("package %s ; \nmy ($_ep_req, $ep_DomTree) = @_;\n%*.*s", r -> Buf.sEvalPackage, l,l, pProgDef) ;
  +	args[0] = r -> pReqSV ;
  +	args[1] = pDomTree -> pDomTreeSV ;
  +	if ((rc = EvalDirect (r, pSV, 2, args)) != ok)
   	    LogError (r, rc) ;
   	SvREFCNT_dec(pSV);
       
  @@ -1384,21 +1409,30 @@
   	if (pSV)
   	    {
   	    SV * args[2] ;
  +	    STRLEN l ;
  +	    SV * sDomTreeSV = newSVpvf ("%s::%s", r -> Buf.sEvalPackage, "_ep_DomTree") ;
  +	    SV * pDomTreeSV = perl_get_sv (SvPV (sDomTreeSV, l), TRUE) ;
  +	    IV xOldDomTree = 0 ;
  +	    
  +	    if (SvIOK (pDomTreeSV))
  +		xOldDomTree = SvIVX (pDomTreeSV) ;
  +
  +	    SvREFCNT_dec (sDomTreeSV) ;
  +	    sv_setiv (pDomTreeSV, r -> xCurrDomTree) ;
   
   	    nCheckpointCache = 0 ;
   	    xCheckpointCache[nCheckpointCache++] = 0 ;
   	    xCheckpointCache[nCheckpointCache++] = 0 ;
   	    
   	    args[0] = r -> pReqSV ;
  -	    args[1] = pCurrDomTree -> pDomTreeSV ;
   	    if (sSubName)
   		{
   		SV * pSVName = newSVpvf ("%s::%s", r -> Buf.sEvalPackage, sSubName) ;
  -		rc = CallStoredCV (r, pProgRun, (CV *)pSVName, 2, args, 0, &pSV) ;
  +		rc = CallStoredCV (r, pProgRun, (CV *)pSVName, 1, args, 0, &pSV) ;
   		}
   	    else
   		{
  -		rc = CallStoredCV (r, pProgRun, (CV *)pSV, 2, args, 0, &pSV) ;
  +		rc = CallStoredCV (r, pProgRun, (CV *)pSV, 1, args, 0, &pSV) ;
   		if (pSV)
   		    SvREFCNT_dec (pSV) ;
   		}
  @@ -1413,6 +1447,8 @@
   	        }
       #endif    
   
  +	    DomTree_checkpoint (r -> xCurrDomTree, -1) ;
  +	    sv_setiv (pDomTreeSV, xOldDomTree) ;
   	    }
   
           if (rc != ok && rc != rcEvalErr)
  
  
  
  1.4.2.3   +29 -11    embperl/Attic/epdom.c
  
  Index: epdom.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epdom.c,v
  retrieving revision 1.4.2.2
  retrieving revision 1.4.2.3
  diff -u -r1.4.2.2 -r1.4.2.3
  --- epdom.c	2000/09/19 07:21:59	1.4.2.2
  +++ epdom.c	2000/09/26 19:31:59	1.4.2.3
  @@ -391,8 +391,8 @@
   	    if (bInc)
   		SvREFCNT_inc (*ppSV) ;
   	    nNdx = SvIVX (*ppSV) ;
  -	    //if (nNdx < 5 || nNdx == 92)
  -	    //	lprintf (pCurrReq, "old string %s (#%d) refcnt=%d\n", Ndx2String (nNdx), nNdx, SvREFCNT(*ppSV)) ;
  +	    if (nNdx < 6 || nNdx == 92)
  +	    	lprintf (pCurrReq, "old string %s (#%d) refcnt=%d\n", Ndx2String (nNdx), nNdx, SvREFCNT(*ppSV)) ;
   	    return nNdx ;
   	    }
   	}
  @@ -419,8 +419,8 @@
   
       numStr++ ;
   
  -    //if (nNdx < 5 || nNdx == 92)
  -    //	lprintf (pCurrReq, "new string %s (#%d) refcnt=%d\n", Ndx2String (nNdx), nNdx, SvREFCNT(pSVNdx)) ;
  +    if (nNdx < 6 || nNdx == 92)
  +    	lprintf (pCurrReq, "new string %s (#%d) refcnt=%d\n", Ndx2String (nNdx), nNdx, SvREFCNT(pSVNdx)) ;
       
       return nNdx ;    
       }
  @@ -442,8 +442,8 @@
       
       SvREFCNT_dec (pSVNdx) ;
   
  -    //if (nNdx < 5 || nNdx == 92)
  -    //	lprintf (pCurrReq, "free string %s (#%d) refcnt=%d\n", Ndx2String (nNdx), nNdx, SvREFCNT(pSVNdx)) ;
  +    if (nNdx < 6 || nNdx == 92)
  +    	lprintf (pCurrReq, "free string %s (#%d) refcnt=%d\n", Ndx2String (nNdx), nNdx, SvREFCNT(pSVNdx)) ;
       
       if (SvREFCNT(pSVNdx) == 1)
   	{
  @@ -741,7 +741,12 @@
   	pAttr -> bFlags = aflgOK ; /* reset string value flag */
   	pDomTree -> xDocument = pDocument -> xNdx ;
   	pDocument -> nType = ntypDocumentFraq ;
  -	pDocument -> nText = xDocumentFraq ;
  +	if (pDocument -> nText != xDocumentFraq)
  +	    {
  +	    NdxStringFree (pDocument -> nText) ;
  +	    pDocument -> nText = xDocumentFraq ;
  +	    NdxStringRefcntInc (xDocumentFraq) ;
  +	    }
   	}
       
   
  @@ -1220,6 +1225,7 @@
       {
       tNodeData *	pParent;
       tNodePad *  pPad ;
  +    tIndex	xText ;
   
       pPad    = Node_condClonePad (pDomTree, xParent) ;
       pParent = Node_self (pDomTree, xParent) ;
  @@ -1361,7 +1367,15 @@
   	    pChilds = NodePad_self (pDomTree, pParent -> xChilds) ;
   	    }
   
  -        pNew = NodePad_appendChild (pDomTree, &pChilds, nType, sText?String2Ndx (sText, nTextLen):nTextLen, nLinenumber) ;
  +        
  +	if (sText)
  +	    xText = String2Ndx (sText, nTextLen) ;
  +	else
  +	    {
  +	    NdxStringRefcntInc(nTextLen) ;
  +	    xText = nTextLen ;
  +	    }
  +	pNew = NodePad_appendChild (pDomTree, &pChilds, nType, xText, nLinenumber) ;
   	
   	if (pCurrReq -> bDebug & dbgParse)
   	    lprintf (pCurrReq, "[%d]PARSE: AddNode: +%02d %*s Element parent=%d node=%d type=%d text=%*.*s (#%d)\n", pCurrReq -> nPid, nLevel, nLevel * 2, "", xParent, pNew -> xNdx, nType, nTextLen, nTextLen, sText, 
  @@ -1541,9 +1555,9 @@
   	}
       else
   	{
  -	int	len  = sizeof (tNodeData) + pNode -> numAttr * sizeof (tAttrData) ; 
  -	int     numAttr = pOldChild -> numAttr ;
  -	int		nOffset ;
  +	int	    len  = sizeof (tNodeData) + pNode -> numAttr * sizeof (tAttrData) ; 
  +	int	    numAttr = pOldChild -> numAttr ;
  +	int	    nOffset ;
   	tAttrData * pAttr  ;
   	int         n      ;
   
  @@ -1995,6 +2009,10 @@
                   
                   if (pCurrReq -> bDebug & dbgParse)
   		    lprintf (r, "[%d]toString: Skip Node=%d to Node=%d\n", r -> nPid, pNode -> xNdx, xNextNode) ; 
  +		
  +		if (xNextNode == -1)
  +		    return NULL ; /* end of flow */
  +		
   		bCheckpointFound = 1 ;
                   pSavedNode = NULL ;
   		pNewNode      = Node_self (pDomTree, xNextNode) ;
  
  
  
  1.4.2.3   +11 -1     embperl/Attic/epdom.h
  
  Index: epdom.h
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epdom.h,v
  retrieving revision 1.4.2.2
  retrieving revision 1.4.2.3
  diff -u -r1.4.2.2 -r1.4.2.3
  --- epdom.h	2000/09/19 07:22:00	1.4.2.2
  +++ epdom.h	2000/09/26 19:31:59	1.4.2.3
  @@ -30,7 +30,7 @@
   typedef unsigned long	tUInt32 ;
   typedef signed long	tSInt32 ;
   
  -typedef tUInt32		tIndex ;
  +typedef tSInt32		tIndex ;
   typedef tIndex		tStringIndex ;
   
   typedef tUInt8          tNodeType ;
  @@ -80,6 +80,16 @@
       } ;
   
   typedef struct tAttrData tAttrData ;
  +
  +
  +struct tDomNode
  +    {
  +    tIndex		xDomTree ;
  +    tNode		xNode ;
  +    SV *		pDomNodeSV ;
  +    } ;
  +
  +typedef struct tDomNode tDomNode ;
   
   
   /*
  
  
  
  1.23.4.1  +9 -2      embperl/epeval.c
  
  Index: epeval.c
  ===================================================================
  RCS file: /home/cvs/embperl/epeval.c,v
  retrieving revision 1.23
  retrieving revision 1.23.4.1
  diff -u -r1.23 -r1.23.4.1
  --- epeval.c	2000/09/12 12:49:48	1.23
  +++ epeval.c	2000/09/26 19:32:00	1.23.4.1
  @@ -26,12 +26,15 @@
   *
   ------------------------------------------------------------------------------- */
   
  -int EvalDirect (/*i/o*/ register req * r,
  -			/*in*/    SV * pArg) 
  +int EvalDirect (/*i/o*/ register req *  r,
  +		/*in*/  SV *            pArg, 
  +                /*in*/  int		numArgs,
  +                /*in*/  SV **		pArgs)
       {
       dTHXsem 
       dSP;
       SV *  pSVErr  ;
  +    int   num ;         
   
       EPENTRY (EvalDirect) ;
   
  @@ -39,6 +42,10 @@
       pCurrReq = r ;
   
       PUSHMARK(sp);
  +    for (num = 0; num < numArgs; num++)
  +	XPUSHs(pArgs [num]) ;            /* push pointer to argument */
  +    PUTBACK;
  +
       perl_eval_sv(pArg, G_SCALAR | G_KEEPERR);
   
   
  
  
  
  1.70.4.9  +1 -3      embperl/test.pl
  
  Index: test.pl
  ===================================================================
  RCS file: /home/cvs/embperl/test.pl,v
  retrieving revision 1.70.4.8
  retrieving revision 1.70.4.9
  diff -u -r1.70.4.8 -r1.70.4.9
  --- test.pl	2000/09/14 12:02:20	1.70.4.8
  +++ test.pl	2000/09/26 19:32:00	1.70.4.9
  @@ -190,9 +190,7 @@
           },
       'importsub.htm' => { 
           'version'    => 1,
  -        },
  -    'importsub.htm' => { 
  -        'version'    => 1,
  +        'repeat'     => 2,
           },
       'importsub2.htm' => { 
           'version'    => 1,
  
  
  
  1.3.4.1   +21 -0     embperl/typemap
  
  Index: typemap
  ===================================================================
  RCS file: /home/cvs/embperl/typemap,v
  retrieving revision 1.3
  retrieving revision 1.3.4.1
  diff -u -r1.3 -r1.3.4.1
  --- typemap	2000/07/17 05:16:09	1.3
  +++ typemap	2000/09/26 19:32:00	1.3.4.1
  @@ -2,6 +2,7 @@
   tConf * T_PTROBJ_CONF
   tReq *  T_PTROBJ_REQ
   tFile * T_PTROBJ_FILE
  +tDomNode * T_PTROBJ_DOMNODE
   
   INPUT
   T_PTROBJ_CONF
  @@ -26,6 +27,17 @@
       else
           croak (\"$var is not of type HTML::Embperl::File\") ;
   
  +T_PTROBJ_DOMNODE
  +    {
  +    MAGIC * mg ;
  +    if (mg = mg_find (SvRV($arg), '~'))
  +        $var = (tDomNode *)(mg -> mg_len) ;
  +    else
  +        croak (\"$var is not of type XML::Embperl::DOM::Node\") ;
  +    }
  +
  +
  +
   OUTPUT
   T_PTROBJ_CONF
       sv_setref_pv ($arg, \"HTML::Embperl::Conf\", (void *)$var) ;
  @@ -41,3 +53,12 @@
    
   T_PTROBJ_FILE
       sv_setref_pv ($arg, \"HTML::Embperl::File\", (void *)$var) ;
  +
  +T_PTROBJ_DOMNODE
  +    {
  +    SV * pSV = $var -> pDomNodeSV ;
  +    if (pSV == NULL)
  +       $arg = &sv_undef ;
  +    else
  +        $arg = pSV ;
  +    }
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.4.4   +19 -16    embperl/Embperl/Attic/Syntax.pm
  
  Index: Syntax.pm
  ===================================================================
  RCS file: /home/cvs/embperl/Embperl/Attic/Syntax.pm,v
  retrieving revision 1.1.4.3
  retrieving revision 1.1.4.4
  diff -u -r1.1.4.3 -r1.1.4.4
  --- Syntax.pm	2000/09/19 07:22:12	1.1.4.3
  +++ Syntax.pm	2000/09/26 19:32:09	1.1.4.4
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: Syntax.pm,v 1.1.4.3 2000/09/19 07:22:12 richter Exp $
  +#   $Id: Syntax.pm,v 1.1.4.4 2000/09/26 19:32:09 richter Exp $
   #
   ###################################################################################
    
  @@ -693,6 +693,8 @@
                   mayjump     => 1,
                   stackname   => 'metacmd',
                   'push'      => 'sub',
  +                stackname2   => 'subname',
  +                push2        => '%&<noname>%',
                   switchcodetype => 2,
                   }
               },
  @@ -704,11 +706,12 @@
           'cdatatype'  => 0,
           'procinfo' => {
               embperl => { 
  -                perlcode => '};', 
  +                perlcode => '}; $_ep_req -> ExportHash -> {%^"subname%} = \&%^subname% ;', 
                   removenode => 10,
                   mayjump     => 1,
                   stackname   => 'metacmd',
                   stackmatch  => 'sub',
  +                pop2        => 'subname',
                   switchcodetype => 1,
                   }
               },
  @@ -777,17 +780,17 @@
                   perlcode    => q{ 
   #my
   use vars ('$_ep_DomTree') ;
  -$_ep_DomTree = $_[1];
  +#$_ep_DomTree = $_[1];
   },
                   compiletimeperlcode => q{
  -*_ep_rp=\\&XML::Embperl::DOM::Node::replaceChildWithCDATA;
  -*_ep_rpurl=\\&XML::Embperl::DOM::Node::replaceChildWithUrlDATA;
  -*_ep_cp=\\&XML::Embperl::DOM::Tree::checkpoint;
  -*_ep_dcp=\\&XML::Embperl::DOM::Tree::discardAfterCheckpoint;
  +*_ep_rp=\\&XML::Embperl::DOM::Node::iReplaceChildWithCDATA;
  +*_ep_rpurl=\\&XML::Embperl::DOM::Node::iReplaceChildWithUrlDATA;
  +*_ep_cp=\\&XML::Embperl::DOM::Tree::iCheckpoint;
  +*_ep_dcp=\\&XML::Embperl::DOM::Tree::iDiscardAfterCheckpoint;
   *_ep_opt=\\&HTML::Embperl::Cmd::Option;
   *_ep_hid=\\&HTML::Embperl::Cmd::Hidden;
  -*_ep_ac=\\&XML::Embperl::DOM::Node::appendChild;
  -*_ep_sa=\\&XML::Embperl::DOM::Element::setAttribut; 
  +*_ep_ac=\\&XML::Embperl::DOM::Node::iAppendChild;
  +*_ep_sa=\\&XML::Embperl::DOM::Element::iSetAttribut; 
   },
                   perlcodeend => '# Include here any cleanup code', 
                   stackname   => 'metacmd',
  @@ -804,17 +807,17 @@
           'procinfo'  => {
               embperl => { 
                   perlcode    => q{ 
  -my $_ep_DomTree = $_[1];
  +#my $_ep_DomTree = $_[1];
   },
                   compiletimeperlcode => q{
  -*_ep_rp=\\&XML::Embperl::DOM::Node::replaceChildWithCDATA;
  -*_ep_rpurl=\\&XML::Embperl::DOM::Node::replaceChildWithUrlDATA;
  -*_ep_cp=\\&XML::Embperl::DOM::Tree::checkpoint;
  -*_ep_dcp=\\&XML::Embperl::DOM::Tree::discardAfterCheckpoint;
  +*_ep_rp=\\&XML::Embperl::DOM::Node::iReplaceChildWithCDATA;
  +*_ep_rpurl=\\&XML::Embperl::DOM::Node::iReplaceChildWithUrlDATA;
  +*_ep_cp=\\&XML::Embperl::DOM::Tree::iCheckpoint;
  +*_ep_dcp=\\&XML::Embperl::DOM::Tree::iDiscardAfterCheckpoint;
   *_ep_opt=\\&HTML::Embperl::Cmd::Option;
   *_ep_hid=\\&HTML::Embperl::Cmd::Hidden;
  -*_ep_ac=\\&XML::Embperl::DOM::Node::appendChild;
  -*_ep_sa=\\&XML::Embperl::DOM::Element::setAttribut; 
  +*_ep_ac=\\&XML::Embperl::DOM::Node::iAppendChild;
  +*_ep_sa=\\&XML::Embperl::DOM::Element::iSetAttribut; 
   },
                   perlcodeend => '# Include here any cleanup code', 
                   stackname   => 'metacmd',
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.3.6.1   +47 -17    embperl/test/cmp/callsub.htm
  
  Index: callsub.htm
  ===================================================================
  RCS file: /home/cvs/embperl/test/cmp/callsub.htm,v
  retrieving revision 1.3
  retrieving revision 1.3.6.1
  diff -u -r1.3 -r1.3.6.1
  --- callsub.htm	1999/10/05 06:02:02	1.3
  +++ callsub.htm	2000/09/26 19:32:13	1.3.6.1
  @@ -6,39 +6,69 @@
   
   <body>
   
  -<h1>Tests for Embperl - Embperl sub Metacommand</h1>
  -
   Now we call the first sub via Execute:
  -
  -
  -
  -<h2>Here goes some normal html text <h2>
   
  +*txt* 
  +*txt* <h2>Here goes some normal html text <h2>
  +*txt* 
   
   And now the second via Execute:
   
  +*perl_code* 
  +*perl_code* Here comes some perl:
  +*perl_code* 
  +*perl_code* *perl_code* 
  +*perl_code* foo = Hello world<br>
  +*perl_code* testdata = abcd<br>
  +*perl_code* 
   
  +Now we call the first sub via Perl:
   
  -Here comes some perl:
  +*txt* 
  +*txt* <h2>Here goes some normal html text <h2>
  +*txt* 
  +And now the second via Perl:
   
  -foo = Hello world<br>
  -testdata = abcd<br>
  +*perl_code* 
  +*perl_code* Here comes some perl:
  +*perl_code* 
  +*perl_code* *perl_code* 
  +*perl_code* foo = Hello world<br>
  +*perl_code* testdata = abcd<br>
  +*perl_code* 
  +-> Second time, other order:
   
  +And now the second via Perl:
   
  +*perl_code* 
  +*perl_code* Here comes some perl:
  +*perl_code* 
  +*perl_code* *perl_code* 
  +*perl_code* foo = Hello world<br>
  +*perl_code* testdata = abcd<br>
  +*perl_code* 
   Now we call the first sub via Perl:
   
  +*txt* 
  +*txt* <h2>Here goes some normal html text <h2>
  +*txt* 
  +-> And Execute again, but other order
   
  -
  -<h2>Here goes some normal html text <h2>
  -
  -And now the second via Perl:
  -
  +And now the second via Execute:
   
  +*perl_code* 
  +*perl_code* Here comes some perl:
  +*perl_code* 
  +*perl_code* *perl_code* 
  +*perl_code* foo = Hello world<br>
  +*perl_code* testdata = abcd<br>
  +*perl_code* 
   
  -Here comes some perl:
  +Now we call the first sub via Execute:
   
  -foo = Hello world<br>
  -testdata = abcd<br>
  +*txt* 
  +*txt* <h2>Here goes some normal html text <h2>
  +*txt* 
   
   And done!
   
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.3.6.3   +13 -1     embperl/test/html/callsub.htm
  
  Index: callsub.htm
  ===================================================================
  RCS file: /home/cvs/embperl/test/html/callsub.htm,v
  retrieving revision 1.3.6.2
  retrieving revision 1.3.6.3
  diff -u -r1.3.6.2 -r1.3.6.3
  --- callsub.htm	2000/09/19 07:22:15	1.3.6.2
  +++ callsub.htm	2000/09/26 19:32:17	1.3.6.3
  @@ -49,7 +49,7 @@
   
   [- perl_code -]
   
  -Second time, other oder:
  +-> Second time, other order:
   
   And now the second via Perl:
   
  @@ -58,6 +58,18 @@
   Now we call the first sub via Perl:
   
   [- txt -]
  +
  +-> And Execute again, but other order
  +
  +And now the second via Execute:
  +
  +[- Execute ('#perl_code') -]
  +
  +Now we call the first sub via Execute:
  +
  +[- Execute ('#txt') -]
  +
  +
   
   And done!
   
  
  
  
  1.4.6.1   +1 -1      embperl/test/html/importsub.htm
  
  Index: importsub.htm
  ===================================================================
  RCS file: /home/cvs/embperl/test/html/importsub.htm,v
  retrieving revision 1.4
  retrieving revision 1.4.6.1
  diff -u -r1.4 -r1.4.6.1
  --- importsub.htm	2000/01/05 05:41:39	1.4
  +++ importsub.htm	2000/09/26 19:32:18	1.4.6.1
  @@ -8,7 +8,7 @@
   
   <h1>Tests for Embperl - Importing subs</h1>
   
  -[- Execute({inputfile => 'subimp.htm', import => 1}) -]
  +[! Execute({inputfile => 'subimp.htm', import => 1}) !]
   
   First sub:
   [- tfirst -]