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/11/16 09:08:09 UTC

cvs commit: embperl/driver eplibxslt.c epxalan.cpp

richter     01/11/16 00:08:09

  Modified:    .        Tag: Embperl2c embperl.h epcache.c epcomp.c epdat.h
                        epmain.c epprovider.c
               Embperl  Tag: Embperl2c Recipe.pm
               Embperl/Recipe Tag: Embperl2c Embperl.pm EmbperlLibXSLT.pm
                        EmbperlXSLT.pm EmbperlXalanXSLT.pm
               driver   Tag: Embperl2c eplibxslt.c epxalan.cpp
  Log:
  Embperl 2 - chdir handling & recipes
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.19.4.15 +5 -2      embperl/embperl.h
  
  Index: embperl.h
  ===================================================================
  RCS file: /home/cvs/embperl/embperl.h,v
  retrieving revision 1.19.4.14
  retrieving revision 1.19.4.15
  diff -u -r1.19.4.14 -r1.19.4.15
  --- embperl.h	2001/11/15 12:09:02	1.19.4.14
  +++ embperl.h	2001/11/16 08:08:07	1.19.4.15
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: embperl.h,v 1.19.4.14 2001/11/15 12:09:02 richter Exp $
  +#   $Id: embperl.h,v 1.19.4.15 2001/11/16 08:08:07 richter Exp $
   #
   ###################################################################################*/
   
  @@ -80,9 +80,12 @@
       rcCryptoErr,
       rcUnknownProvider,
       rcXalanError,
  +    rcLibXSLTError,
       rcMissingParam,
       rcNotCodeRef,
  -    rcUnknownRecipe
  +    rcUnknownRecipe,
  +    rcTypeMismatch,
  +    rcChdirError
       } ;
   
   
  
  
  
  1.1.2.14  +15 -4     embperl/Attic/epcache.c
  
  Index: epcache.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epcache.c,v
  retrieving revision 1.1.2.13
  retrieving revision 1.1.2.14
  diff -u -r1.1.2.13 -r1.1.2.14
  --- epcache.c	2001/11/14 15:01:40	1.1.2.13
  +++ epcache.c	2001/11/16 08:08:07	1.1.2.14
  @@ -9,7 +9,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epcache.c,v 1.1.2.13 2001/11/14 15:01:40 richter Exp $
  +#   $Id: epcache.c,v 1.1.2.14 2001/11/16 08:08:07 richter Exp $
   #
   ###################################################################################*/
   
  @@ -197,7 +197,11 @@
           pProviderClass = (tProviderClass *)GetHashValuePtr (pProviders, sProvider, NULL) ;
           if (!pProviderClass)
               {
  -            strncpy (r -> errdat1, sProvider, sizeof(r -> errdat1) - 1) ;
  +            if (*sProvider)
  +		strncpy (r -> errdat1, sProvider, sizeof(r -> errdat1) - 1) ;
  +	    else
  +		strncpy (r -> errdat1, "<provider missing>", sizeof(r -> errdat1) - 1) ;
  +
               return rcUnknownProvider ;
               }
           pKey = newSVpv ("", 0) ;
  @@ -350,13 +354,20 @@
           pProviderClass = (tProviderClass *)GetHashValuePtr (pProviders, sProvider, NULL) ;
           if (!pProviderClass)
               {
  -            strncpy (r -> errdat1, sProvider, sizeof(r -> errdat1) - 1) ;
  +            if (*sProvider)
  +		strncpy (r -> errdat1, sProvider, sizeof(r -> errdat1) - 1) ;
  +	    else
  +		strncpy (r -> errdat1, "<provider missing>", sizeof(r -> errdat1) - 1) ;
               return rcUnknownProvider ;
               }
           if (pProviderClass -> fAppendKey)
               if ((rc = (*pProviderClass -> fAppendKey)(r, pProviderClass, pProviderParam, pKey)) != ok)
  +		{
  +		if (r -> bDebug & dbgCache)
  +		    lprintf (r, "[%d]CACHE: Error in Update CacheItem provider=%s\n",
  +		    r -> nPid,  sProvider) ;
                   return rc ;
  -
  +		}
           if (pItem = Cache_GetByKey (r, SvPV(pKey, len)))
               {
               int bCache = pItem -> bCache ;
  
  
  
  1.4.2.79  +172 -74   embperl/Attic/epcomp.c
  
  Index: epcomp.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epcomp.c,v
  retrieving revision 1.4.2.78
  retrieving revision 1.4.2.79
  diff -u -r1.4.2.78 -r1.4.2.79
  --- epcomp.c	2001/11/14 15:01:40	1.4.2.78
  +++ epcomp.c	2001/11/16 08:08:07	1.4.2.79
  @@ -9,7 +9,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epcomp.c,v 1.4.2.78 2001/11/14 15:01:40 richter Exp $
  +#   $Id: epcomp.c,v 1.4.2.79 2001/11/16 08:08:07 richter Exp $
   #
   ###################################################################################*/
   
  @@ -1693,13 +1693,9 @@
   /*                                                                          */
   /* embperl_Executer                                                         */
   /*                                                                          */
  -/* Parse the whole document                                                 */
  -/*                                                                          */
  -/* in   pProcessor  Processor data                                          */
  -/*                                                                          */
   /* ------------------------------------------------------------------------ */
   
  -int embperl_Execute	            (/*in*/  tReq *	  r,
  +static int embperl_Execute2         (/*in*/  tReq *	  r,
   				     /*in*/  tIndex       xSrcDomTree,
                                        /*in*/  CV *         pCV,
   				     /*in*/  tIndex  *    pResultDomTree)
  @@ -1711,97 +1707,199 @@
       clock_t	cl1 = clock () ;
       clock_t	cl2 ;
       SV *        pSV ;
  -    
  +    char * sSubName  ;
  +
       tainted         = 0 ;
       r -> xCurrDomTree = xSrcDomTree ;
   
  -    if (!r -> bError)
  +    sSubName = r -> sSubName ;
  +
  +    if (sSubName && !*sSubName)
  +	sSubName = NULL ;
  +    rc = ok ;
  +    cl1 = clock () ;
  +    
  +
  +    r -> nPhase  = phRun ;
  +
  +	
  +    r -> nCurrCheckpoint = 1 ;
  +    r -> nCurrRepeatLevel = 0 ;
  +    r -> xSourceDomTree = r -> xCurrDomTree ;
  +    if (!(r -> xCurrDomTree  = DomTree_clone (DomTree_self (xSrcDomTree), &pCurrDomTree, sSubName?1:0)))
  +	return 1 ;
  +
  +    *pResultDomTree = r -> xCurrDomTree ;
  +    /* -> is done by cache management -> av_push (r -> pDomTreeAV, pCurrDomTree -> pDomTreeSV) ; */
  +    pCurrDomTree = DomTree_self (r -> xCurrDomTree) ; 
  +    ArrayNewZero (&pCurrDomTree -> pCheckpointStatus, ArrayGetSize (pCurrDomTree -> pCheckpoints), sizeof(tDomTreeCheckpointStatus)) ;
  +
  +    if (pCV)
   	{
  -	char * sSubName = r -> sSubName ;
  +	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 ;
  +	newSVpvf2(sDomTreeSV) ;
  +	
  +	if (SvIOK (pDomTreeSV))
  +	    xOldDomTree = SvIVX (pDomTreeSV) ;
  +
  +	SvREFCNT_dec (sDomTreeSV) ;
  +	sv_setiv (pDomTreeSV, r -> xCurrDomTree) ;
   
  -	if (sSubName && !*sSubName)
  -	    sSubName = NULL ;
  -	rc = ok ;
  -	cl1 = clock () ;
  +    	av_push (r -> pCleanupAV, newRV_inc (pDomTreeSV)) ;
   	
  +	args[0] = r -> pReqSV ;
  +	if (sSubName)
  +	    {
  +	    SV * pSVName = newSVpvf ("%s::_ep_sub_%s", r -> Buf.sEvalPackage, sSubName) ;
  +	    newSVpvf2(pSVName) ;
  +            pCurrDomTree -> xDocument = 0 ; /* set by first checkpoint */
  +	    rc = CallStoredCV (r, r -> pProgRun, (CV *)pSVName, 1, args, 0, &pSV) ;
  +	    if (pSVName)
  +		SvREFCNT_dec (pSVName) ;
  +	    if (pSV)
  +		SvREFCNT_dec (pSV) ;
  +	    }
  +	else
  +	    {
  +	    rc = CallStoredCV (r, r -> pProgRun, (CV *)pCV, 1, args, 0, &pSV) ;
  +	    if (pSV)
  +		SvREFCNT_dec (pSV) ;
  +	    }
   
  -    	r -> nPhase  = phRun ;
  +	pCurrDomTree = DomTree_self (r -> xCurrDomTree) ; /* relookup DomTree in case it has moved */
  +	cl2 = clock () ;
  +#ifdef CLOCKS_PER_SEC
  +	if (r -> bDebug)
  +	    {
  +	    lprintf (r, "[%d]PERF: Run Start Time: %d ms \n", r -> nPid, ((cl1 - r -> startclock) * 1000 / CLOCKS_PER_SEC)) ;
  +	    lprintf (r, "[%d]PERF: Run End Time:   %d ms \n", r -> nPid, ((cl2 - r -> startclock) * 1000 / CLOCKS_PER_SEC)) ;
  +	    lprintf (r, "[%d]PERF: Run Time:       %d ms \n", r -> nPid, ((cl2 - cl1) * 1000 / CLOCKS_PER_SEC)) ;
  +	    DomStats () ;
  +	    }
  +#endif    
   
  -	    
  -        r -> nCurrCheckpoint = 1 ;
  -        r -> nCurrRepeatLevel = 0 ;
  -	r -> xSourceDomTree = r -> xCurrDomTree ;
  -	if (!(r -> xCurrDomTree  = DomTree_clone (DomTree_self (xSrcDomTree), &pCurrDomTree, sSubName?1:0)))
  -	    return 1 ;
  -
  -	*pResultDomTree = r -> xCurrDomTree ;
  -        /* -> is done by cache management -> av_push (r -> pDomTreeAV, pCurrDomTree -> pDomTreeSV) ; */
  -	pCurrDomTree = DomTree_self (r -> xCurrDomTree) ; 
  -	ArrayNewZero (&pCurrDomTree -> pCheckpointStatus, ArrayGetSize (pCurrDomTree -> pCheckpoints), sizeof(tDomTreeCheckpointStatus)) ;
  -
  -	if (pCV)
  -	    {
  -	    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 ;
  -	    newSVpvf2(sDomTreeSV) ;
  -	    
  -	    if (SvIOK (pDomTreeSV))
  -		xOldDomTree = SvIVX (pDomTreeSV) ;
  +	sv_setiv (pDomTreeSV, xOldDomTree) ;
  +	}
   
  -	    SvREFCNT_dec (sDomTreeSV) ;
  -	    sv_setiv (pDomTreeSV, r -> xCurrDomTree) ;
  +    ArrayFree (&pCurrDomTree -> pCheckpointStatus) ;
   
  -    	    av_push (r -> pCleanupAV, newRV_inc (pDomTreeSV)) ;
  -	    
  -	    args[0] = r -> pReqSV ;
  -	    if (sSubName)
  -		{
  -		SV * pSVName = newSVpvf ("%s::_ep_sub_%s", r -> Buf.sEvalPackage, sSubName) ;
  -		newSVpvf2(pSVName) ;
  -                pCurrDomTree -> xDocument = 0 ; /* set by first checkpoint */
  -		rc = CallStoredCV (r, r -> pProgRun, (CV *)pSVName, 1, args, 0, &pSV) ;
  -		if (pSVName)
  -		    SvREFCNT_dec (pSVName) ;
  -		if (pSV)
  -		    SvREFCNT_dec (pSV) ;
  -		}
  -	    else
  -		{
  -		rc = CallStoredCV (r, r -> pProgRun, (CV *)pCV, 1, args, 0, &pSV) ;
  -		if (pSV)
  -		    SvREFCNT_dec (pSV) ;
  -		}
  +    if (rc != ok && rc != rcEvalErr)
  +        return rc ;
   
  -	    pCurrDomTree = DomTree_self (r -> xCurrDomTree) ; /* relookup DomTree in case it has moved */
  -	    cl2 = clock () ;
  -    #ifdef CLOCKS_PER_SEC
  -	    if (r -> bDebug)
  -	        {
  -	        lprintf (r, "[%d]PERF: Run Start Time: %d ms \n", r -> nPid, ((cl1 - r -> startclock) * 1000 / CLOCKS_PER_SEC)) ;
  -	        lprintf (r, "[%d]PERF: Run End Time:   %d ms \n", r -> nPid, ((cl2 - r -> startclock) * 1000 / CLOCKS_PER_SEC)) ;
  -	        lprintf (r, "[%d]PERF: Run Time:       %d ms \n", r -> nPid, ((cl2 - cl1) * 1000 / CLOCKS_PER_SEC)) ;
  -	        DomStats () ;
  +    r -> nPhase  = phTerm ;
  +    
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* embperl_Executer                                                         */
  +/*                                                                          */
  +/* ------------------------------------------------------------------------ */
  +
  +int embperl_Execute	            (/*in*/  tReq *	  r,
  +				     /*in*/  tIndex       xSrcDomTree,
  +                                     /*in*/  CV *         pCV,
  +				     /*in*/  tIndex  *    pResultDomTree)
  +
  +
  +    {
  +    int	    rc  = ok ;
  +    char    olddir[PATH_MAX];
  +    char *  sInputfile = r -> Buf.pFile -> sSourcefile ;
  +#ifdef WIN32
  +    int		olddrive ;
  +#endif
  +    
  +    tainted         = 0 ;
  +
  +    if (!r -> bError)
  +	{
  +	/* --- change working directory --- */
  +    
  +	if ((r -> bOptions & optDisableChdir) == 0 && sInputfile != NULL && sInputfile != '\0' && 
  +	    !SvROK(r -> pInData))
  +	    {
  +	    char dir[PATH_MAX];
  +#ifdef WIN32
  +	    char drive[_MAX_DRIVE];
  +	    char fname[_MAX_FNAME];
  +	    char ext[_MAX_EXT];
  +	    char * c = sInputfile ;
  +
  +	    while (*c)
  +		{ /* convert / to \ */
  + 		if (*c == '/')
  +		    *c = '\\' ;
  +		c++ ;
   		}
  -    #endif    
  +
  +	    olddrive = _getdrive () ;
  +	    getcwd (olddir, sizeof (olddir) - 1) ;
   
  -	    sv_setiv (pDomTreeSV, xOldDomTree) ;
  +	    _splitpath(sInputfile, drive, dir, fname, ext );
  +   	    _chdrive (drive[0] - 'A' + 1) ;
  +#else
  +	    Dirname (sInputfile, dir, sizeof (dir) - 1) ;
  +	    getcwd (olddir, sizeof (olddir) - 1) ;
  +#endif
  +	    if (dir[0])
  +		{
  +		if (chdir (dir) < 0)
  +		    {
  +		    strncpy (r -> errdat1, dir, sizeof(r -> errdat1) - 1) ;
  +		    LogError (r, rcChdirError) ;
  +		    }
  +		else
  +		    {
  +		    if (!(dir[0] == '/'  
  +		#ifdef WIN32
  +			||
  +			dir[0] == '\\' || 
  +			    (isalpha(dir[0]) && dir[1] == ':' && 
  +			      (dir[2] == '\\' || dir[2] == '/')) 
  +		#endif                  
  +			))            
  +			{
  +			strcpy (r->sCWD,olddir) ;
  +			strcat (r->sCWD,"/") ;
  +			strcat (r->sCWD,dir) ;
  +			}
  +		    else
  +			strcpy (r->sCWD,dir) ;
  +		    }
  +		}
  +	    else
  +		r -> bOptions |= optDisableChdir ;
   	    }
  +	else
  +	    r -> bOptions |= optDisableChdir ;
  +        
   
  -	ArrayFree (&pCurrDomTree -> pCheckpointStatus) ;
  +	rc = embperl_Execute2 (r, xSrcDomTree, pCV, pResultDomTree) ;
   
  -        if (rc != ok && rc != rcEvalErr)
  -            return rc ;
   
  +	/* --- restore working directory --- */
  +	if ((r -> bOptions & optDisableChdir) == 0)
  +	    {
  +#ifdef WIN32
  +   	    _chdrive (olddrive) ;
  +#endif
  +	    chdir (olddir) ;
  +	    strcpy (r->sCWD,olddir) ;
  +	    }
  +
           }
       else
           *pResultDomTree = 0 ;
   
       r -> nPhase  = phTerm ;
       
  -    return ok ;
  +    return rc ;
       }
   
   /* ------------------------------------------------------------------------ */
  
  
  
  1.20.4.33 +2 -1      embperl/epdat.h
  
  Index: epdat.h
  ===================================================================
  RCS file: /home/cvs/embperl/epdat.h,v
  retrieving revision 1.20.4.32
  retrieving revision 1.20.4.33
  diff -u -r1.20.4.32 -r1.20.4.33
  --- epdat.h	2001/11/12 07:32:22	1.20.4.32
  +++ epdat.h	2001/11/16 08:08:07	1.20.4.33
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epdat.h,v 1.20.4.32 2001/11/12 07:32:22 richter Exp $
  +#   $Id: epdat.h,v 1.20.4.33 2001/11/16 08:08:07 richter Exp $
   #
   ###################################################################################*/
   
  @@ -430,6 +430,7 @@
       tIndex	xSourceDomTree ;/* DomTree which contains the source */
   
       struct tCacheItem * pOutputCache ;  /* Cache which hold the final output */
  +    SV *       pOutputSV ;	/* set if output is text and not a tree */
   #endif
       struct tTokenTable *  pTokenTable ; /* holds the current syntax */
   
  
  
  
  1.75.4.70 +80 -26    embperl/epmain.c
  
  Index: epmain.c
  ===================================================================
  RCS file: /home/cvs/embperl/epmain.c,v
  retrieving revision 1.75.4.69
  retrieving revision 1.75.4.70
  diff -u -r1.75.4.69 -r1.75.4.70
  --- epmain.c	2001/11/15 12:09:02	1.75.4.69
  +++ epmain.c	2001/11/16 08:08:07	1.75.4.70
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epmain.c,v 1.75.4.69 2001/11/15 12:09:02 richter Exp $
  +#   $Id: epmain.c,v 1.75.4.70 2001/11/16 08:08:07 richter Exp $
   #
   ###################################################################################*/
   
  @@ -153,10 +153,13 @@
   	case rcCryptoErr:		msg ="[%d]ERR:  %d: %s Decrypt-error: OpenSSL error (%s)%s" ; break ; 
   	case rcUnknownProvider:	        msg ="[%d]ERR:  %d: %s Unknown Provider %s %s" ; break ; 
   	case rcXalanError:	        msg ="[%d]ERR:  %d: %s Xalan Error: %s: %s" ; break ; 
  +	case rcLibXSLTError:	        msg ="[%d]ERR:  %d: %s LibXSLT Error: %s: %s" ; break ; 
           case rcMissingParam:		msg ="[%d]ERR:  %d: %s Missing Parameter %s %s" ; break ; 
           case rcNotCodeRef:		msg ="[%d]ERR:  %d: %s %s need coderef in '%s'" ; break ; 
           case rcUnknownRecipe:		msg ="[%d]ERR:  %d: %s Unknown recipe '%s'" ; break ; 
  -
  +        case rcTypeMismatch:		msg ="[%d]ERR:  %d: %s Unsupported Outputformat %s of %s" ; break ; 
  +        case rcChdirError:		msg ="[%d]ERR:  %d: %s Cannot change to directory %s %s" ; break ; 
  +	
   	default:                        msg ="[%d]ERR:  %d: %s Error %s%s" ; break ; 
           }
   
  @@ -1707,6 +1710,9 @@
   #ifdef XALAN
       embperl_Xalan_Init () ;
   #endif
  +#ifdef LIBXSLT
  +    embperl_LibXSLT_Init () ;
  +#endif
   
   #endif    
       
  @@ -2436,6 +2442,7 @@
       if (r -> bSubReq && sSourcefile[0] == '?' && sSubName && sSubName[0] != '\0')
   	{
   	pFile = r -> pLastReq -> Buf.pFile ;
  +	r -> bOptions |= optDisableChdir ;
   	}
       else
   	{
  @@ -2847,7 +2854,7 @@
       int  bError = 0 ;
       STRLEN ldummy ;
   
  -#ifdef EP2
  +#ifdef EP2OLDXSLT
       /* ### tmp ### */
       int bXSLT = 0 ;
   
  @@ -3136,7 +3143,7 @@
   	if (r -> pCurrEscape)
   #endif		
   	    oputs (r, "\r\n") ;
  -#ifdef EP2
  +#ifdef EP2OLDXSLT
   
           if (bXSLT && !bError && !r -> bEP1Compat)
               {
  @@ -3195,22 +3202,31 @@
               int    l ;
   #ifdef EP2
               		
  -	    if (!bError && !r -> bEP1Compat)
  +	    if (!bError && !r -> bEP1Compat && r -> pOutputSV)
   		{
  -		tDomTree * pDomTree = DomTree_self (r -> xCurrDomTree) ;
  -		Node_toString (r, pDomTree, pDomTree -> xDocument, 0) ;
  +		sv_setsv (pOut, r -> pOutputSV) ;
   		}
  +	    else
  +		{
  +		if (!bError && !r -> bEP1Compat)
  +		    {
  +		    tDomTree * pDomTree = DomTree_self (r -> xCurrDomTree) ;
  +		    Node_toString (r, pDomTree, pDomTree -> xDocument, 0) ;
  +		    }
   
  -	    if (!r -> bEP1Compat)
  -		oputs (r, "\r\n") ;
  +		if (!r -> bEP1Compat)
  +		    oputs (r, "\r\n") ;
   #endif		
  -            l = GetContentLength (r) + 1 ;
  +		l = GetContentLength (r) + 1 ;
               
  -            sv_setpv (pOut, "") ;
  -            SvGROW (pOut, l) ;
  -            pData = SvPVX (pOut) ;
  -            oCommitToMem (r, NULL, pData) ;
  -            SvCUR_set (pOut, l - 1) ;
  +		sv_setpv (pOut, "") ;
  +		SvGROW (pOut, l) ;
  +		pData = SvPVX (pOut) ;
  +		oCommitToMem (r, NULL, pData) ;
  +		SvCUR_set (pOut, l - 1) ;
  +#ifdef EP2
  +		}
  +#endif		
               }
           else
               {
  @@ -3235,6 +3251,7 @@
   		    if (!bError && !r -> pImportStash)
   			{
   			tDomTree * pDomTree = DomTree_self (r -> xCurrDomTree) ;
  +#ifdef EP2OLDXSLT
                           if (bXSLT)
                               {
                               int len = GetContentLength (r) + 1 ;
  @@ -3249,6 +3266,7 @@
                                                                       pData, len - 1, 0, 0, "XSLT Result") ;
                               }
                           else
  +#endif
                               l -> xCurrNode = Node_insertAfter (pDomTree, pDomTree -> xDocument, 0, DomTree_self (l -> xCurrDomTree), l -> xCurrNode, l -> nCurrRepeatLevel) ;
   			}
   		    }
  @@ -3258,11 +3276,24 @@
   		{
                   oCommit (r, NULL) ;
   #ifdef EP2
  -		if (!bError && !r -> bEP1Compat && !r -> pImportStash && !bXSLT)
  +		if (!bError && !r -> bEP1Compat && !r -> pImportStash 
  +#ifdef EP2OLDXSLT
  +		    && !bXSLT
  +#endif
  +		    )
   		    {
  -		    tDomTree * pDomTree = DomTree_self (r -> xCurrDomTree) ;
  -		    Node_toString (r, pDomTree, pDomTree -> xDocument, 0) ;
  -		    oputs (r, "\r\n") ;
  +		    if (r -> pOutputSV)
  +			{
  +			STRLEN l ;
  +			char * p = SvPV (r -> pOutputSV, l) ;
  +			owrite (r, p, l) ;
  +			}
  +		    else
  +			{
  +			tDomTree * pDomTree = DomTree_self (r -> xCurrDomTree) ;
  +			Node_toString (r, pDomTree, pDomTree -> xDocument, 0) ;
  +			oputs (r, "\r\n") ;
  +			}
   		    }
   #endif
   		}
  @@ -3527,10 +3558,22 @@
               return rc ;
   
       
  -        if ((rc = Cache_GetContentIndex (r, r -> pOutputCache, &r -> xCurrDomTree)) != ok)
  -            return rc ;
  -
  -
  +	if (strncmp (r -> pOutputCache -> pProvider -> sOutputType, "text/", 5) == 0)
  +	    {
  +	    if ((rc = Cache_GetContentSV (r, r -> pOutputCache, &r -> pOutputSV)) != ok)
  +		return rc ;
  +	    }
  +	else if (strcmp (r -> pOutputCache -> pProvider -> sOutputType, "X-Embperl/DomTree") == 0)
  +	    {
  +	    if ((rc = Cache_GetContentIndex (r, r -> pOutputCache, &r -> xCurrDomTree)) != ok)
  +		return rc ;
  +	    }
  +	else
  +	    {
  +	    sprintf (r -> errdat1, "'%s' (accpetable are 'text/*', 'X-Embperl/DomTree')", r -> pOutputCache -> pProvider -> sOutputType) ;
  +	    strncpy (r -> errdat2, r -> pOutputCache -> sKey, sizeof (r -> errdat2) - 1) ;
  +	    return rcTypeMismatch ;
  +	    }
   
   #endif
   
  @@ -3915,7 +3958,11 @@
   
       /* --- change working directory --- */
       
  -    if ((r -> bOptions & optDisableChdir) == 0 && sInputfile != NULL && sInputfile != '\0' && !SvROK(r -> pInData))
  +    if (
  +#ifdef EP2
  +	 r -> bEP1Compat && 
  +#endif	
  +	((r -> bOptions & optDisableChdir) == 0 && sInputfile != NULL && sInputfile != '\0' && !SvROK(r -> pInData)))
   	{
   	char dir[PATH_MAX];
   #ifdef WIN32
  @@ -3967,7 +4014,10 @@
   	    r -> bOptions |= optDisableChdir ;
           }
       else
  -	r -> bOptions |= optDisableChdir ;
  +#ifdef EP2
  +	if (r -> bEP1Compat) 
  +#endif	
  +	    r -> bOptions |= optDisableChdir ;
           
   
       r -> bReqRunning     = 1 ;
  @@ -3994,7 +4044,11 @@
   #endif    
       
       /* --- restore working directory --- */
  -    if ((r -> bOptions & optDisableChdir) == 0)
  +    if (
  +#ifdef EP2
  +	 r -> bEP1Compat && 
  +#endif	
  +	(r -> bOptions & optDisableChdir) == 0)
   	{
   #ifdef WIN32
      	_chdrive (olddrive) ;
  
  
  
  1.1.2.12  +10 -25    embperl/Attic/epprovider.c
  
  Index: epprovider.c
  ===================================================================
  RCS file: /home/cvs/embperl/Attic/epprovider.c,v
  retrieving revision 1.1.2.11
  retrieving revision 1.1.2.12
  diff -u -r1.1.2.11 -r1.1.2.12
  --- epprovider.c	2001/11/15 12:09:02	1.1.2.11
  +++ epprovider.c	2001/11/16 08:08:08	1.1.2.12
  @@ -9,7 +9,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epprovider.c,v 1.1.2.11 2001/11/15 12:09:02 richter Exp $
  +#   $Id: epprovider.c,v 1.1.2.12 2001/11/16 08:08:08 richter Exp $
   #
   ###################################################################################*/
   
  @@ -295,7 +295,6 @@
       int          rc ;
       tProviderFile * pNew  ;
       const char * sFilename  ;
  -    const char * sFn = NULL ;
       
       if ((rc = Provider_New (r, sizeof(tProviderFile), pItem, pProviderClass, pParam)) != ok)
           return rc ;
  @@ -303,20 +302,7 @@
       pNew = (tProviderFile *)pItem -> pProvider ;
   
       sFilename = GetHashValueStr  (pParam, "filename", "") ;
  -    if ((r -> bOptions & optDisableChdir) == 0)
  -        {
  -        sFn = strrchr (sFilename, '/') ;
  -#ifdef WIN32
  -        if (!sFn)
  -            sFn = strrchr (sFilename, '\\') ;
  -#endif
  -        }
  -    if (sFn)
  -        sFn++ ;
  -    else
  -        sFn = sFilename ;
  -
  -    pNew -> sFilename                   = strdup (sFn) ;
  +    pNew -> sFilename                   = strdup (sFilename) ;
       pItem -> sExpiresFilename           = strdup (pNew -> sFilename) ;
   
       return ok ;
  @@ -376,14 +362,6 @@
   #endif                  
           ))            
           {
  -       if ((r -> bOptions & optDisableChdir) == 0)
  -            {
  -            sFn = strrchr (sFilename, '/') ;
  -#ifdef WIN32
  -            if (!sFn)
  -                sFn = strrchr (sFilename, '\\') ;
  -#endif
  -            }
           sDir = r -> sCWD ;
           }
       
  @@ -1690,12 +1668,18 @@
       tCacheItem * pSrcCache ;
       SV * pOut ;
       char * pBuf ;
  +    tDomTree * pDomTree ;
   
   
       pSrcCache = Cache_GetDependency(r, pProvider -> pCache, 0) ;
       if ((rc = Cache_GetContentIndex (r, pSrcCache, &xSrcDomTree)) != ok)
           return rc ;
           
  +    oRollbackOutput (r, NULL) ;
  +    oBegin (r) ;
  +    pDomTree = DomTree_self (xSrcDomTree) ;
  +    Node_toString (r, pDomTree, pDomTree -> xDocument, 0) ;
  +
       pOut = newSV (1) ;
       len = GetContentLength (r) + 1 ;
       
  @@ -1704,6 +1688,7 @@
       oCommitToMem (r, NULL, pBuf) ;
       oRollbackOutput (r, NULL) ;
       SvCUR_set (pOut, len - 1) ;
  +    SvPOK_on (pOut) ;
   
       *pData = pOut ;
   
  @@ -1753,7 +1738,7 @@
   
   tProviderClass ProviderClassEpToString = 
       {   
  -    "X-Embperl/DomTree", 
  +    "text/*", 
       &ProviderEpToString_New, 
       &ProviderEpToString_AppendKey, 
       NULL,
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.5   +7 -5      embperl/Embperl/Attic/Recipe.pm
  
  Index: Recipe.pm
  ===================================================================
  RCS file: /home/cvs/embperl/Embperl/Attic/Recipe.pm,v
  retrieving revision 1.1.2.4
  retrieving revision 1.1.2.5
  diff -u -r1.1.2.4 -r1.1.2.5
  --- Recipe.pm	2001/11/15 12:09:03	1.1.2.4
  +++ Recipe.pm	2001/11/16 08:08:08	1.1.2.5
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: Recipe.pm,v 1.1.2.4 2001/11/15 12:09:03 richter Exp $
  +#   $Id: Recipe.pm,v 1.1.2.5 2001/11/16 08:08:08 richter Exp $
   #
   ###################################################################################
    
  @@ -40,9 +40,11 @@
       foreach my $recipe (@names)
           {
           my $mod ;
  +        $recipe =~ /([a-zA-Z0-9_:]*)/ ;
  +        $recipe = $1 ;
           if (!($mod = $Recipes{$recipe})) 
               {
  -            my $mod = ($name =~ /::/)?$recipe:'HTML::Embperl::Recipe::'. $recipe ;
  +            $mod = ($name =~ /::/)?$recipe:'HTML::Embperl::Recipe::'. $recipe ;
               if (!defined (&{$mod . '::new'}))
                   {
                   eval "require $mod" ;
  @@ -52,10 +54,10 @@
                       return undef ;
                       }
                   }
  -
  -            my $obj = $mod -> new ($r, $recipe, $param) ;
  -            return $obj if ($obj) ;
  +            $Recipes{$recipe} = $mod ;
               }
  +        my $obj = $mod -> new ($r, $recipe, $param) ;
  +        return $obj if ($obj) ;
           }
           
       return undef ;                
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.3   +2 -1      embperl/Embperl/Recipe/Attic/Embperl.pm
  
  Index: Embperl.pm
  ===================================================================
  RCS file: /home/cvs/embperl/Embperl/Recipe/Attic/Embperl.pm,v
  retrieving revision 1.1.2.2
  retrieving revision 1.1.2.3
  diff -u -r1.1.2.2 -r1.1.2.3
  --- Embperl.pm	2001/11/15 12:09:03	1.1.2.2
  +++ Embperl.pm	2001/11/16 08:08:08	1.1.2.3
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: Embperl.pm,v 1.1.2.2 2001/11/15 12:09:03 richter Exp $
  +#   $Id: Embperl.pm,v 1.1.2.3 2001/11/16 08:08:08 richter Exp $
   #
   ###################################################################################
    
  @@ -38,6 +38,7 @@
       my $self ;
       my $src ;
       my $file = $param -> {inputfile} ;
  +    ($file) = $r -> Sourcefile =~ /.*\/(.*?)$/ if (!$file && $param->{sub}) ;
       $file = $r -> Sourcefile if (!$file || $file eq '*') ;
   
       if (ref $param -> {input})
  
  
  
  1.1.2.2   +5 -3      embperl/Embperl/Recipe/Attic/EmbperlLibXSLT.pm
  
  Index: EmbperlLibXSLT.pm
  ===================================================================
  RCS file: /home/cvs/embperl/Embperl/Recipe/Attic/EmbperlLibXSLT.pm,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- EmbperlLibXSLT.pm	2001/11/15 13:23:17	1.1.2.1
  +++ EmbperlLibXSLT.pm	2001/11/16 08:08:08	1.1.2.2
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: EmbperlLibXSLT.pm,v 1.1.2.1 2001/11/15 13:23:17 richter Exp $
  +#   $Id: EmbperlLibXSLT.pm,v 1.1.2.2 2001/11/16 08:08:08 richter Exp $
   #
   ###################################################################################
    
  @@ -21,6 +21,8 @@
   use strict ;
   use vars qw{@ISA} ;
   
  +use HTML::Embperl::Recipe::EmbperlXSLT ;
  +
   @ISA = ('HTML::Embperl::Recipe::EmbperlXSLT') ;
   
   # ---------------------------------------------------------------------------------
  @@ -33,10 +35,10 @@
   sub new
   
       {
  -    my ($class, $recipe, $param) = @_ ;
  +    my ($class, $r, $recipe, $param) = @_ ;
   
       $param -> {xsltproc} = 'libxslt' ;
  -    return  HTML::Embperl::Recipe::EmbperlXSLT -> new ($recipe, $param) ;
  +    return  HTML::Embperl::Recipe::EmbperlXSLT -> new ($r, $recipe, $param) ;
       }
   
   
  
  
  
  1.1.2.2   +25 -16    embperl/Embperl/Recipe/Attic/EmbperlXSLT.pm
  
  Index: EmbperlXSLT.pm
  ===================================================================
  RCS file: /home/cvs/embperl/Embperl/Recipe/Attic/EmbperlXSLT.pm,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- EmbperlXSLT.pm	2001/11/15 13:23:17	1.1.2.1
  +++ EmbperlXSLT.pm	2001/11/16 08:08:08	1.1.2.2
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: EmbperlXSLT.pm,v 1.1.2.1 2001/11/15 13:23:17 richter Exp $
  +#   $Id: EmbperlXSLT.pm,v 1.1.2.2 2001/11/16 08:08:08 richter Exp $
   #
   ###################################################################################
    
  @@ -21,6 +21,8 @@
   use strict ;
   use vars qw{@ISA} ;
   
  +use HTML::Embperl::Recipe::Embperl ;
  +
   @ISA = ('HTML::Embperl::Recipe::Embperl') ;
   
   # ---------------------------------------------------------------------------------
  @@ -33,9 +35,9 @@
   sub new
   
       {
  -    my ($class, $recipe, $param) = @_ ;
  +    my ($class, $r, $recipe, $param) = @_ ;
   
  -    my $ep = HTML::Embperl::Recipe::Embperl -> new ($recipe, $param) ;
  +    my $ep = HTML::Embperl::Recipe::Embperl -> new ($r, $recipe, $param) ;
       my $xsltproc = $param -> {xsltproc} ;
   
       my $self =
  @@ -45,35 +47,41 @@
               'type' => $xsltproc,
               'source' => 
                   {
  -                provider => 
  +                'cache'    => 0,
  +                provider =>
                       {
  -                    type => 'eptostring',
  -                    source =>
  +                    'type'      =>  $xsltproc . '-parse-xml',
  +                    'source' =>
                           {
  -                        provider =>
  +                       'cache' => 0,
  +                        provider => 
                               {
  -                            %$ep,
  -                            'cache', => 0,
  +                            type => 'eptostring',
  +                            source =>
  +                                {
  +                                %$ep,
  +                                'cache' => 0,
  +                                },
                               }
  -                        }
  -                    }
  -                }
  +                        },
  +                    },
  +                },
               'stylesheet' => 
                   {
  +                'cache'    => 1,
                   provider =>
                       {
                       'type'      =>  $xsltproc . '-compile-xsl',
                       'stylesheet' =>
                           {
  +                        'cache'    => 0,
                           provider =>
                               {
                               'type'      =>  'file',
                               'filename'  => $param -> {xsltstylesheet},
  -                            'cache',    => 0,
                               }
  -                        }
  -                    }
  -                'cache', => 0,
  +                        },
  +                    },
                   }
               }
           } ;
  @@ -83,6 +91,7 @@
           $self -> {$_} = $param -> {$_} if (exists $param -> {$_}) ;
           }
       $self -> {'cache'} = $self -> {expires_in} || $self -> {expires_func} || $self -> {expires_filename}?1:0 ;
  +
   
       return $self ;
       }
  
  
  
  1.1.2.2   +5 -3      embperl/Embperl/Recipe/Attic/EmbperlXalanXSLT.pm
  
  Index: EmbperlXalanXSLT.pm
  ===================================================================
  RCS file: /home/cvs/embperl/Embperl/Recipe/Attic/EmbperlXalanXSLT.pm,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- EmbperlXalanXSLT.pm	2001/11/15 13:23:17	1.1.2.1
  +++ EmbperlXalanXSLT.pm	2001/11/16 08:08:08	1.1.2.2
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: EmbperlXalanXSLT.pm,v 1.1.2.1 2001/11/15 13:23:17 richter Exp $
  +#   $Id: EmbperlXalanXSLT.pm,v 1.1.2.2 2001/11/16 08:08:08 richter Exp $
   #
   ###################################################################################
    
  @@ -21,6 +21,8 @@
   use strict ;
   use vars qw{@ISA} ;
   
  +use HTML::Embperl::Recipe::EmbperlXSLT ;
  +
   @ISA = ('HTML::Embperl::Recipe::EmbperlXSLT') ;
   
   # ---------------------------------------------------------------------------------
  @@ -33,10 +35,10 @@
   sub new
   
       {
  -    my ($class, $recipe, $param) = @_ ;
  +    my ($class, $r, $recipe, $param) = @_ ;
   
       $param -> {xsltproc} = 'xalan' ;
  -    return  HTML::Embperl::Recipe::EmbperlXSLT -> new ($recipe, $param) ;
  +    return  HTML::Embperl::Recipe::EmbperlXSLT -> new ($r, $recipe, $param) ;
       }
   
   
  
  
  
  No                   revision
  
  
  No                   revision
  
  
  1.1.2.5   +733 -1    embperl/driver/Attic/eplibxslt.c
  
  Index: eplibxslt.c
  ===================================================================
  RCS file: /home/cvs/embperl/driver/Attic/eplibxslt.c,v
  retrieving revision 1.1.2.4
  retrieving revision 1.1.2.5
  diff -u -r1.1.2.4 -r1.1.2.5
  --- eplibxslt.c	2001/10/16 11:51:24	1.1.2.4
  +++ eplibxslt.c	2001/11/16 08:08:08	1.1.2.5
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: eplibxslt.c,v 1.1.2.4 2001/10/16 11:51:24 richter Exp $
  +#   $Id: eplibxslt.c,v 1.1.2.5 2001/11/16 08:08:08 richter Exp $
   #
   ###################################################################################*/
   
  @@ -154,3 +154,735 @@
   
       return(0);
       }
  +
  +
  +
  +
  +/*! Provider that reads compiles LibXSLT stylesheet */
  +
  +typedef struct tProviderLibXSLTXSL
  +    {
  +    tProvider           Provider ;
  +    xmlDocPtr		pXMLDoc ;
  +    } tProviderLibXSLTXSL ;
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderLibXSLTXSL_New      					            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Creates a new LibXSLT stylesheet provider and fills it with data from the hash pParam
  +*   The resulting provider is put into the cache structure
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem which holds the output of the provider
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               stylesheet  filename or provider for the
  +*                                           stylesheet 
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Erzeugt einen neue Provider f�r LibXSLT Stylesheets. Der ein Zeiger
  +*   auf den resultierenden Provider wird in die Cachestrutr eingef�gt
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem welches die Ausgabe des Providers 
  +*                           speichert
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               stylesheet  dateiname oder provider f�r das
  +*                                           stylesheet 
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +static int ProviderLibXSLTXSL_New (/*in*/ req *              r,
  +                          /*in*/ tCacheItem *       pItem,
  +                          /*in*/ tProviderClass *   pProviderClass,
  +                          /*in*/ HV *               pParam)
  +
  +
  +    {
  +    int                 rc ;
  +    
  +    if ((rc = Provider_NewDependOne (r, sizeof(tProviderLibXSLTXSL), "stylesheet", pItem, pProviderClass, pParam)) != ok)
  +        return rc ;
  +
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderFile_AppendKey    					            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Append it's key to the keystring. If it depends on anything it must 
  +*   call Cache_AppendKey for any dependency.
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               filename        name of file
  +*   @param  pKey            Key to which string should be appended
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   H�ngt ein eigenen Schl�ssel an den Schl�sselstring an. Wenn irgednwelche
  +*   Abh�nigkeiten bestehen, mu� Cache_AppendKey f�r alle Abh�nigkeiten aufgerufen 
  +*   werden.
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               filename        Dateiname
  +*   @param  pKey            Schl�ssel zu welchem hinzugef�gt wird
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +static int ProviderLibXSLTXSL_AppendKey (/*in*/ req *              r,
  +                                   /*in*/ tProviderClass *   pProviderClass,
  +                                   /*in*/ HV *               pParam,
  +                                   /*i/o*/ SV *              pKey)
  +    {
  +    int          rc ;
  +
  +    if ((rc = Cache_AppendKey (r, pParam, "stylesheet", pKey)) != ok)
  +        return rc;
  +
  +    sv_catpv (pKey, "*libxslt-compile-xsl") ;
  +    return ok ;
  +    }
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderLibXSLTXSL_GetContentPtr  				            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Get the whole content from the provider. 
  +*   This gets the stylesheet and compiles it
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @param  pData           Returns the content
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Holt den gesamt Inhalt vom Provider.
  +*   Die Funktion holt sich das Stylesheet und kompiliert es
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @param  pData           Liefert den Inhalt
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +static int ProviderLibXSLTXSL_GetContentPtr     (/*in*/ req *            r,
  +                                        /*in*/ tProvider *      pProvider,
  +                                        /*in*/ void * *         pData)
  +
  +    {
  +    int    rc ;
  +    char * p ;
  +    STRLEN len ;
  +    SV *   pSource ;
  +    xsltStylesheetPtr cur ;
  +    xmlDocPtr	    doc ;
  +
  +    tCacheItem * pFileCache = Cache_GetDependency(r, pProvider -> pCache, 0) ;
  +    if ((rc = Cache_GetContentSV (r, pFileCache, &pSource)) != ok)
  +        return rc ;
  +        
  +    p   = SvPV (pSource, len) ;
  +
  +    if (p == NULL || len == 0)
  +	{
  +	strncpy (r -> errdat1, "LibXSLT XML stylesheet", sizeof (r -> errdat1)) ;
  +	return rcMissingInput ;
  +	}
  +
  +    if ((doc = xmlParseMemory(p, len)) == NULL)
  +      	{
  +	Cache_ReleaseContent (r, pFileCache) ;
  +        strncpy (r -> errdat1, "XSL parse", sizeof (r -> errdat1)) ;
  +	return rcLibXSLTError ;
  +	}
  +    ;
  +	
  +    if ((cur = xsltParseStylesheetDoc(doc)) == NULL)
  +      	{
  +	xmlFreeDoc(doc) ;
  +	Cache_ReleaseContent (r, pFileCache) ;
  +        strncpy (r -> errdat1, "XSL compile", sizeof (r -> errdat1)) ;
  +	return rcLibXSLTError ;
  +	}
  +    
  +    ((tProviderLibXSLTXSL *)pProvider) -> pXMLDoc = doc ;
  +    *pData = (void *)cur ;
  +
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderLibXSLTXSL_FreeContent 		                            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Free the cached data
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Gibt die gecachten Daten frei
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +static int ProviderLibXSLTXSL_FreeContent(/*in*/ req *             r,
  +                                 /*in*/ tCacheItem * pItem)
  +
  +    {
  +    xsltStylesheetPtr  pCompiledStylesheet = (xsltStylesheetPtr)pItem -> pData ;
  +    if (pCompiledStylesheet)
  +        xsltFreeStylesheet(pCompiledStylesheet) ;
  +
  +    if (((tProviderLibXSLTXSL *)pItem -> pProvider) -> pXMLDoc)
  +        xmlFreeDoc (((tProviderLibXSLTXSL *)pItem -> pProvider) -> pXMLDoc) ;
  +
  +    ((tProviderLibXSLTXSL *)pItem -> pProvider) -> pXMLDoc = NULL ;
  +    
  +
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +
  +static tProviderClass ProviderClassLibXSLTXSL = 
  +    {   
  +    "text/*", 
  +    &ProviderLibXSLTXSL_New, 
  +    &ProviderLibXSLTXSL_AppendKey, 
  +    NULL,
  +    NULL,
  +    &ProviderLibXSLTXSL_GetContentPtr,
  +    NULL,
  +    &ProviderLibXSLTXSL_FreeContent,
  +    NULL,
  +    } ;
  +
  +
  +
  +/*! Provider that reads compiles LibXSLT xml source */
  +
  +typedef struct tProviderLibXSLTXML
  +    {
  +    tProvider           Provider ;
  +    } tProviderLibXSLTXML ;
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderLibXSLTXML_New      					            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Creates a new LibXSLT xml source provider and fills it with data from the hash pParam
  +*   The resulting provider is put into the cache structure
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem which holds the output of the provider
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               stylesheet  filename or provider for the
  +*                                           stylesheet 
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Erzeugt einen neue Provider f�r LibXSLT XML Quellen. Der ein Zeiger
  +*   auf den resultierenden Provider wird in die Cachestrutr eingef�gt
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem welches die Ausgabe des Providers 
  +*                           speichert
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               stylesheet  dateiname oder provider f�r das
  +*                                           stylesheet 
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +static int ProviderLibXSLTXML_New (/*in*/ req *              r,
  +                          /*in*/ tCacheItem *       pItem,
  +                          /*in*/ tProviderClass *   pProviderClass,
  +                          /*in*/ HV *               pParam)
  +
  +
  +    {
  +    int                 rc ;
  +    
  +    if ((rc = Provider_NewDependOne (r, sizeof(tProviderLibXSLTXML), "source", pItem, pProviderClass, pParam)) != ok)
  +        return rc ;
  +
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderFile_AppendKey    					            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Append it's key to the keystring. If it depends on anything it must 
  +*   call Cache_AppendKey for any dependency.
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               filename        name of file
  +*   @param  pKey            Key to which string should be appended
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   H�ngt ein eigenen Schl�ssel an den Schl�sselstring an. Wenn irgednwelche
  +*   Abh�nigkeiten bestehen, mu� Cache_AppendKey f�r alle Abh�nigkeiten aufgerufen 
  +*   werden.
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               filename        Dateiname
  +*   @param  pKey            Schl�ssel zu welchem hinzugef�gt wird
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +static int ProviderLibXSLTXML_AppendKey (/*in*/ req *              r,
  +                                   /*in*/ tProviderClass *   pProviderClass,
  +                                   /*in*/ HV *               pParam,
  +                                   /*i/o*/ SV *              pKey)
  +    {
  +    int          rc ;
  +
  +    if ((rc = Cache_AppendKey (r, pParam, "source", pKey)) != ok)
  +        return rc;
  +
  +    sv_catpv (pKey, "*libxslt-parse-xml") ;
  +    return ok ;
  +    }
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderLibXSLTXML_GetContentPtr  				            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Get the whole content from the provider. 
  +*   This gets the stylesheet and compiles it
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @param  pData           Returns the content
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Holt den gesamt Inhalt vom Provider.
  +*   Die Funktion holt sich das Stylesheet und kompiliert es
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @param  pData           Liefert den Inhalt
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +static int ProviderLibXSLTXML_GetContentPtr     (/*in*/ req *            r,
  +                                        /*in*/ tProvider *      pProvider,
  +                                        /*in*/ void * *         pData)
  +
  +    {
  +    int    rc ;
  +    char * p ;
  +    STRLEN len ;
  +    SV *   pSource ;
  +    xmlDocPtr	    doc ;
  +
  +    tCacheItem * pFileCache = Cache_GetDependency(r, pProvider -> pCache, 0) ;
  +    if ((rc = Cache_GetContentSV (r, pFileCache, &pSource)) != ok)
  +        return rc ;
  +        
  +    p   = SvPV (pSource, len) ;
  +
  +    if (p == NULL || len == 0)
  +	{
  +	strncpy (r -> errdat1, "LibXSLT XML source", sizeof (r -> errdat1)) ;
  +	return rcMissingInput ;
  +	}
  +
  +    if ((doc = xmlParseMemory(p, len)) == NULL)
  +      	{
  +	Cache_ReleaseContent (r, pFileCache) ;
  +        strncpy (r -> errdat1, "XML parse", sizeof (r -> errdat1)) ;
  +	return rcLibXSLTError ;
  +	}
  +
  +    *pData = (void *)doc ;
  +
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderLibXSLTXML_FreeContent 		                            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Free the cached data
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Gibt die gecachten Daten frei
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +static int ProviderLibXSLTXML_FreeContent(/*in*/ req *             r,
  +                                 /*in*/ tCacheItem * pItem)
  +
  +    {
  +    if (pItem -> pData)
  +	xmlFreeDoc((xmlDocPtr)pItem -> pData) ;
  +
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +
  +static tProviderClass ProviderClassLibXSLTXML = 
  +    {   
  +    "text/*", 
  +    &ProviderLibXSLTXML_New, 
  +    &ProviderLibXSLTXML_AppendKey, 
  +    NULL,
  +    NULL,
  +    &ProviderLibXSLTXML_GetContentPtr,
  +    NULL,
  +    &ProviderLibXSLTXML_FreeContent,
  +    NULL,
  +    } ;
  +
  +
  +
  +
  +/*! Provider that reads compiles LibXSLT stylesheet */
  +
  +typedef struct tProviderLibXSLT
  +    {
  +    tProvider           Provider ;
  +    SV *                pOutputSV ;
  +    } tProviderLibXSLT ;
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderLibXSLT_iowrite                                                  */
  +/*                                                                          */
  +/* output callback                                                          */
  +/*                                                                          */
  +/* ------------------------------------------------------------------------ */
  +
  +static  int  ProviderLibXSLT_iowrite   (void *context,
  +						     const char *buffer,
  +						     long unsigned int len)
  +
  +    {
  +    sv_catpvn (((tProviderLibXSLT *)context) -> pOutputSV, (char *)buffer, len) ;
  +    return len ;
  +    }
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderLibXSLT_New      					            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Creates a new LibXSLT provider and fills it with data from the hash pParam
  +*   The resulting provider is put into the cache structure
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem which holds the output of the provider
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               stylesheet  filename or provider for the
  +*                                           stylesheet 
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Erzeugt einen neue Provider f�r LibXSLT.  Der ein Zeiger
  +*   auf den resultierenden Provider wird in die Cachestrutr eingef�gt
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem welches die Ausgabe des Providers 
  +*                           speichert
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               stylesheet  dateiname oder provider f�r das
  +*                                           stylesheet 
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +int ProviderLibXSLT_New (/*in*/ req *              r,
  +                          /*in*/ tCacheItem *       pItem,
  +                          /*in*/ tProviderClass *   pProviderClass,
  +                          /*in*/ HV *               pParam)
  +
  +
  +    {
  +    int                 rc ;
  +    
  +    if ((rc = Provider_NewDependOne (r, sizeof(tProviderLibXSLT), "source", pItem, pProviderClass, pParam)) != ok)
  +        return rc ;
  +
  +    if ((rc = Provider_AddDependOne (r, pItem -> pProvider, "stylesheet", pItem, pProviderClass, pParam)) != ok)
  +        return rc ;
  +
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderFile_AppendKey    					            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Append it's key to the keystring. If it depends on anything it must 
  +*   call Cache_AppendKey for any dependency.
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               filename        name of file
  +*   @param  pKey            Key to which string should be appended
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   H�ngt ein eigenen Schl�ssel an den Schl�sselstring an. Wenn irgednwelche
  +*   Abh�nigkeiten bestehen, mu� Cache_AppendKey f�r alle Abh�nigkeiten aufgerufen 
  +*   werden.
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               filename        Dateiname
  +*   @param  pKey            Schl�ssel zu welchem hinzugef�gt wird
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +static int ProviderLibXSLT_AppendKey (/*in*/ req *              r,
  +                                   /*in*/ tProviderClass *   pProviderClass,
  +                                   /*in*/ HV *               pParam,
  +                                   /*i/o*/ SV *              pKey)
  +    {
  +    int          rc ;
  +
  +    if ((rc = Cache_AppendKey (r, pParam, "source", pKey)) != ok)
  +        return rc;
  +
  +    if ((rc = Cache_AppendKey (r, pParam, "stylesheet", pKey)) != ok)
  +        return rc;
  +
  +    sv_catpv (pKey, "*libxslt") ;
  +    return ok ;
  +    }
  +
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderLibXSLT_GetContentSV	  				            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Get the whole content from the provider. 
  +*   This gets the stylesheet and compiles it
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @param  pData           Returns the content
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Holt den gesamt Inhalt vom Provider.
  +*   Die Funktion holt sich das Stylesheet und kompiliert es
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @param  pData           Liefert den Inhalt
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +static int ProviderLibXSLT_GetContentSV         (/*in*/ req *            r,
  +                                        /*in*/ tProvider *      pProvider,
  +                                        /*in*/ SV * *           pData)
  +
  +    {
  +    int    rc ;
  +    xsltStylesheetPtr cur ;
  +    xmlDocPtr	    doc ;
  +    xmlDocPtr	    res;
  +    xmlOutputBufferPtr obuf ;
  +    
  +    
  +    tCacheItem * pSrcCache = Cache_GetDependency(r, pProvider -> pCache, 0) ;
  +    tCacheItem * pXSLCache = Cache_GetDependency(r, pProvider -> pCache, 1) ;
  +
  +    if ((rc = Cache_GetContentPtr  (r, pSrcCache, (void * *)&doc)) != ok)
  +        return rc ;
  +
  +    if ((rc = Cache_GetContentPtr (r, pXSLCache, (void * *)&cur)) != ok)
  +        return rc ;
  +
  +    if (((tProviderLibXSLT *)pProvider) -> pOutputSV)
  +        SvREFCNT_dec (((tProviderLibXSLT *)pProvider) -> pOutputSV) ;
  +
  +    ((tProviderLibXSLT *)pProvider) -> pOutputSV = newSV(1024) ;
  +
  +    res = xsltApplyStylesheet(cur, doc, NULL) ; /*pParamArray);*/
  +    if(res == NULL)
  +	{
  +	strncpy (r -> errdat1, "XSLT", sizeof (r -> errdat1)) ;
  +	return rcLibXSLTError ;
  +	}
  +    
  +    obuf = xmlOutputBufferCreateIO (ProviderLibXSLT_iowrite, NULL, pProvider, NULL) ;
  +    
  +    xsltSaveResultTo(obuf, res, cur);
  +
  +    xmlFreeDoc(res);
  +
  +    *pData = ((tProviderLibXSLT *)pProvider) -> pOutputSV ;
  +
  +
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderLibXSLT_FreeContent 		                            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Free the cached data
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Gibt die gecachten Daten frei
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +static int ProviderLibXSLT_FreeContent(/*in*/ req *             r,
  +                                 /*in*/ tCacheItem * pItem)
  +
  +    {
  +    if (((tProviderLibXSLT *)pItem -> pProvider) -> pOutputSV)
  +        SvREFCNT_dec (((tProviderLibXSLT *)pItem -> pProvider) -> pOutputSV) ;
  +
  +    ((tProviderLibXSLT *)pItem -> pProvider) -> pOutputSV = NULL ;
  +    
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +
  +static tProviderClass ProviderClassLibXSLT = 
  +    {   
  +    "text/*", 
  +    &ProviderLibXSLT_New, 
  +    &ProviderLibXSLT_AppendKey, 
  +    NULL,
  +    &ProviderLibXSLT_GetContentSV,
  +    NULL,
  +    NULL,
  +    &ProviderLibXSLT_FreeContent,
  +    NULL,
  +    } ;
  +
  +
  +
  +/* ------------------------------------------------------------------------ */
  +
  +int embperl_LibXSLT_Init ()
  +    {
  +    Cache_AddProviderClass ("libxslt-compile-xsl", &ProviderClassLibXSLTXSL) ;
  +    Cache_AddProviderClass ("libxslt-parse-xml", &ProviderClassLibXSLTXML) ;
  +    Cache_AddProviderClass ("libxslt", &ProviderClassLibXSLT) ;
  +    }
  +
  +
  +
  
  
  
  1.1.2.11  +248 -20   embperl/driver/Attic/epxalan.cpp
  
  Index: epxalan.cpp
  ===================================================================
  RCS file: /home/cvs/embperl/driver/Attic/epxalan.cpp,v
  retrieving revision 1.1.2.10
  retrieving revision 1.1.2.11
  diff -u -r1.1.2.10 -r1.1.2.11
  --- epxalan.cpp	2001/11/15 12:09:03	1.1.2.10
  +++ epxalan.cpp	2001/11/16 08:08:08	1.1.2.11
  @@ -10,7 +10,7 @@
   #   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
   #   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
   #
  -#   $Id: epxalan.cpp,v 1.1.2.10 2001/11/15 12:09:03 richter Exp $
  +#   $Id: epxalan.cpp,v 1.1.2.11 2001/11/16 08:08:08 richter Exp $
   #
   ###################################################################################*/
   
  @@ -200,6 +200,15 @@
           
       // Our input streams...
       p   = SvPV (pSource, len) ;
  +
  +    if (p == NULL || len == 0)
  +	{
  +	strncpy (r -> errdat1, "Xalan XML stylesheet", sizeof (r -> errdat1)) ;
  +	return rcMissingInput ;
  +	}
  +    
  +
  +    
       istrstream	theXMLStream(p, len);
   
       if (theXalanTransformer -> compileStylesheet(&theXMLStream, pCompiledStylesheet))
  @@ -210,7 +219,6 @@
   	return rcXalanError ;
   	}
   
  -    Cache_ReleaseContent (r, pFileCache) ;
   
       *pData = (void *)pCompiledStylesheet ;
   
  @@ -268,10 +276,237 @@
       NULL,
       } ;
   
  +/*! Provider that reads compiles xalan stylesheet */
  +
  +typedef struct tProviderXalanXML
  +    {
  +    tProvider           Provider ;
  +    } tProviderXalanXML ;
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderXalanXML_New      					            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Creates a new xalan xml source provider and fills it with data from the hash pParam
  +*   The resulting provider is put into the cache structure
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem which holds the output of the provider
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               stylesheet  filename or provider for the
  +*                                           stylesheet 
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Erzeugt einen neue Provider f�r Xalan XML Quellen. Der ein Zeiger
  +*   auf den resultierenden Provider wird in die Cachestrutr eingef�gt
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pItem           CacheItem welches die Ausgabe des Providers 
  +*                           speichert
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               stylesheet  dateiname oder provider f�r das
  +*                                           stylesheet 
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +static int ProviderXalanXML_New (/*in*/ req *              r,
  +                          /*in*/ tCacheItem *       pItem,
  +                          /*in*/ tProviderClass *   pProviderClass,
  +                          /*in*/ HV *               pParam)
  +
  +
  +    {
  +    int                 rc ;
  +    
  +    if ((rc = Provider_NewDependOne (r, sizeof(tProviderXalanXML), "source", pItem, pProviderClass, pParam)) != ok)
  +        return rc ;
   
  +    return ok ;
  +    }
   
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
  +/* ProviderFile_AppendKey    					            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Append it's key to the keystring. If it depends on anything it must 
  +*   call Cache_AppendKey for any dependency.
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               filename        name of file
  +*   @param  pKey            Key to which string should be appended
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   H�ngt ein eigenen Schl�ssel an den Schl�sselstring an. Wenn irgednwelche
  +*   Abh�nigkeiten bestehen, mu� Cache_AppendKey f�r alle Abh�nigkeiten aufgerufen 
  +*   werden.
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProviderClass  Provider class record
  +*   @param  pParam          Parameter Hash
  +*                               filename        Dateiname
  +*   @param  pKey            Schl�ssel zu welchem hinzugef�gt wird
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +static int ProviderXalanXML_AppendKey (/*in*/ req *              r,
  +                                   /*in*/ tProviderClass *   pProviderClass,
  +                                   /*in*/ HV *               pParam,
  +                                   /*i/o*/ SV *              pKey)
  +    {
  +    int          rc ;
  +
  +    if ((rc = Cache_AppendKey (r, pParam, "source", pKey)) != ok)
  +        return rc;
  +
  +    sv_catpv (pKey, "*xalan-parse-xml") ;
  +    return ok ;
  +    }
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderXalanXML_GetContentPtr  				            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Get the whole content from the provider. 
  +*   This gets the stylesheet and compiles it
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @param  pData           Returns the content
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Holt den gesamt Inhalt vom Provider.
  +*   Die Funktion holt sich das Stylesheet und kompiliert es
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @param  pData           Liefert den Inhalt
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +static int ProviderXalanXML_GetContentPtr     (/*in*/ req *            r,
  +                                        /*in*/ tProvider *      pProvider,
  +                                        /*in*/ void * *         pData)
  +
  +    {
  +    int    rc ;
  +    char * p ;
  +    STRLEN len ;
  +    SV *   pSource ;
  +    const XalanParsedSource * parsedXML = NULL ;
  +
  +    tCacheItem * pFileCache = Cache_GetDependency(r, pProvider -> pCache, 0) ;
  +    if ((rc = Cache_GetContentSV (r, pFileCache, &pSource)) != ok)
  +        return rc ;
  +        
  +    // Our input streams...
  +    p   = SvPV (pSource, len) ;
  +
  +    if (p == NULL || len == 0)
  +	{
  +	strncpy (r -> errdat1, "Xalan XML source", sizeof (r -> errdat1)) ;
  +	return rcMissingInput ;
  +	}
  +    
  +
  +    
  +    istrstream	theXMLStream(p, len);
  +
  +
  +    if (theXalanTransformer -> parseSource(&theXMLStream, parsedXML))
  +      	{
  +	Cache_ReleaseContent (r, pFileCache) ;
  +        strncpy (r -> errdat1, "XSL compile", sizeof (r -> errdat1)) ;
  +	strncpy (r -> errdat2, theXalanTransformer -> getLastError(), sizeof (r -> errdat2) - 2) ;
  +	return rcXalanError ;
  +	}
  +
  +
  +    *pData = (void *)parsedXML ;
  +
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
  +/* ProviderXalanXML_FreeContent 		                            */
  +/*                                                                          */
  +/*! 
  +*   \_en
  +*   Free the cached data
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @return                 error code
  +*   \endif                                                                       
  +*
  +*   \_de									   
  +*   Gibt die gecachten Daten frei
  +*   
  +*   @param  r               Embperl request record
  +*   @param  pProvider       The provider record
  +*   @return                 Fehlercode
  +*   \endif                                                                       
  +*                                                                          
  +* ------------------------------------------------------------------------ */
  +
  +
  +
  +static int ProviderXalanXML_FreeContent(/*in*/ req *             r,
  +                                 /*in*/ tCacheItem * pItem)
  +
  +    {
  +    const XalanParsedSource * parsedXML  = (XalanParsedSource *)pItem -> pData ;
  +    if (parsedXML)
  +	theXalanTransformer -> destroyParsedSource (parsedXML);
  +
  +    return ok ;
  +    }
  +
  +/* ------------------------------------------------------------------------ */
  +
  +static tProviderClass ProviderClassXalanXML = 
  +    {   
  +    "text/*", 
  +    &ProviderXalanXML_New, 
  +    &ProviderXalanXML_AppendKey, 
  +    NULL,
  +    NULL,
  +    &ProviderXalanXML_GetContentPtr,
  +    NULL,
  +    &ProviderXalanXML_FreeContent,
  +    NULL,
  +    } ;
  +
  +
  +
  +/* ------------------------------------------------------------------------ */
  +/*                                                                          */
   /* iowrite                                                                  */
   /*                                                                          */
   /* output callback                                                          */
  @@ -562,14 +797,14 @@
   			void *context)
   
       {
  -    sv_catpvn (((tProviderXalan *)context) -> pOutputSV, buffer, len) ;
  +    sv_catpvn (((tProviderXalan *)context) -> pOutputSV, (char *)buffer, len) ;
       return len ;
       }
   
   
   /* ------------------------------------------------------------------------ */
   /*                                                                          */
  -/* ProviderXalan_GetContentPtr  				            */
  +/* ProviderXalan_GetContentSV	  				            */
   /*                                                                          */
   /*! 
   *   \_en
  @@ -602,15 +837,14 @@
   
       {
       int    rc ;
  -    char * p ;
  -    STRLEN len ;
  -    SV *   pSource ;
  +    XalanParsedSource *       parsedXML ;
  +    XalanCompiledStylesheet * pCompiledXSL ;
       
       
       tCacheItem * pSrcCache = Cache_GetDependency(r, pProvider -> pCache, 0) ;
  -    tCacheItem * pXSLCache = Cache_GetDependency(r, pProvider -> pCache, 0) ;
  +    tCacheItem * pXSLCache = Cache_GetDependency(r, pProvider -> pCache, 1) ;
   
  -    if ((rc = Cache_GetContentSV  (r, pSrcCache, &pSource)) != ok)
  +    if ((rc = Cache_GetContentPtr  (r, pSrcCache, (void * *)&parsedXML)) != ok)
           return rc ;
   
       if ((rc = Cache_GetContentPtr (r, pXSLCache, (void * *)&pCompiledXSL)) != ok)
  @@ -621,17 +855,10 @@
   
       ((tProviderXalan *)pProvider) -> pOutputSV = newSV(1024) ;
   
  -    // Our input streams...
  -    p   = SvPV (pSource, len) ;
  -    istrstream	theXMLStream(p, len);
  -
  +   
       // Do the transform.
  +    int theResult = theXalanTransformer -> transform(*parsedXML, pCompiledXSL, pProvider, ProviderXalan_iowrite, NULL);
   
  -    const XalanParsedSource * parsedXML = 0;
  -    theXalanTransformer -> parseSource(&theXMLStream, parsedXML);
  -    
  -    int theResult = theXalanTransformer -> transform(*parsedXML, pCompiledXSL, r, iowrite, NULL);
  -
       if(theResult != 0)
   	{
   	strncpy (r -> errdat1, "XSLT", sizeof (r -> errdat1)) ;
  @@ -674,7 +901,7 @@
                                    /*in*/ tCacheItem * pItem)
   
       {
  -    if (((tProviderXalan *)pProvider) -> pOutputSV)
  +    if (((tProviderXalan *)pItem -> pProvider) -> pOutputSV)
           SvREFCNT_dec (((tProviderXalan *)pItem -> pProvider) -> pOutputSV) ;
   
       ((tProviderXalan *)pItem -> pProvider) -> pOutputSV = NULL ;
  @@ -684,7 +911,7 @@
   
   /* ------------------------------------------------------------------------ */
   
  -static tProviderClass ProviderClassXalanXSL = 
  +static tProviderClass ProviderClassXalan = 
       {   
       "text/*", 
       &ProviderXalan_New, 
  @@ -704,6 +931,7 @@
   int embperl_Xalan_Init ()
       {
       Cache_AddProviderClass ("xalan-compile-xsl", &ProviderClassXalanXSL) ;
  +    Cache_AddProviderClass ("xalan-parse-xml", &ProviderClassXalanXML) ;
       Cache_AddProviderClass ("xalan", &ProviderClassXalan) ;
   
       // Call the static initializer for Xerces.
  
  
  

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