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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to