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