Author: richter Date: Tue Jan 22 05:47:20 2013 New Revision: 1436750 URL: http://svn.apache.org/viewvc?rev=1436750&view=rev Log: - Added optChdirToSource = 0x10000000 which will cause Embperl to change to the directory of the source file prior to execution.
Added: perl/embperl/trunk/test/cmp/chdir2src.htm perl/embperl/trunk/test/html/chdir/ perl/embperl/trunk/test/html/chdir/chdir2src.htm (with props) Modified: perl/embperl/trunk/Changes.pod perl/embperl/trunk/MANIFEST perl/embperl/trunk/embperl.h perl/embperl/trunk/epapfilter.c perl/embperl/trunk/epcomp.c perl/embperl/trunk/epdat.h perl/embperl/trunk/epdat2.h perl/embperl/trunk/epdom.c perl/embperl/trunk/eputil.c perl/embperl/trunk/podsrc/Config.spod perl/embperl/trunk/test.pl perl/embperl/trunk/test/cmp/epform.htm perl/embperl/trunk/test/conf/httpd.conf.src Modified: perl/embperl/trunk/Changes.pod URL: http://svn.apache.org/viewvc/perl/embperl/trunk/Changes.pod?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/Changes.pod (original) +++ perl/embperl/trunk/Changes.pod Tue Jan 22 05:47:20 2013 @@ -41,7 +41,12 @@ - Fix compile problem on non intel plattforms due to missing -m32 flag. - Added support for utf8 sourcefiles. By setting - input_charset => 'utf8' + input_charset => 'utf8' sponsored by Perlover. + - Added optChdirToSource = 0x10000000 which will cause + Embperl to change to the directory of the source file + prior to execution. + + Adaptions to Perl 5.14/16 were sponsored by NUREG GmbH =head 2.4.0 4. Oct 2010 Modified: perl/embperl/trunk/MANIFEST URL: http://svn.apache.org/viewvc/perl/embperl/trunk/MANIFEST?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/MANIFEST (original) +++ perl/embperl/trunk/MANIFEST Tue Jan 22 05:47:20 2013 @@ -250,6 +250,7 @@ test/cmp/sub2.htm test/cmp/subouttab.htm test/cmp/changeattr.htm test/cmp/chdir.htm +test/cmp/chdir2src.htm test/cmp/clearsess.htm test/cmp/cookieexpire.htm test/cmp/crypto.htm @@ -480,6 +481,7 @@ test/html/sub2.htm test/html/subouttab.htm test/html/changeattr.htm test/html/chdir.htm +test/html/chdir/chdir2src.htm test/html/clearsess.htm test/html/cookieexpire.htm test/html/delrdsess.htm Modified: perl/embperl/trunk/embperl.h URL: http://svn.apache.org/viewvc/perl/embperl/trunk/embperl.h?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/embperl.h (original) +++ perl/embperl/trunk/embperl.h Tue Jan 22 05:47:20 2013 @@ -179,7 +179,8 @@ enum opt optDisableSelectScan = 0x800000, optEnableChdir = 0x1000000, optFormDataNoUtf8 = 0x2000000, - optShowBacktrace = 0x8000000 + optShowBacktrace = 0x8000000, + optChdirToSource = 0x10000000 } ; /* --- output escaping --- */ Modified: perl/embperl/trunk/epapfilter.c URL: http://svn.apache.org/viewvc/perl/embperl/trunk/epapfilter.c?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/epapfilter.c (original) +++ perl/embperl/trunk/epapfilter.c Tue Jan 22 05:47:20 2013 @@ -203,7 +203,6 @@ static apr_status_t ProviderApOutFilter_ const char *data; apr_status_t rv; char buf[4096]; - apr_bucket *eos = NULL; epTHX_ @@ -216,7 +215,6 @@ static apr_status_t ProviderApOutFilter_ /* if (APR_BUCKET_IS_EOS(b)) */ if (strcmp (b -> type -> name, "EOS") == 0) { - eos = b; break; } Modified: perl/embperl/trunk/epcomp.c URL: http://svn.apache.org/viewvc/perl/embperl/trunk/epcomp.c?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/epcomp.c (original) +++ perl/embperl/trunk/epcomp.c Tue Jan 22 05:47:20 2013 @@ -1645,7 +1645,8 @@ int embperl_Compile (/*i if (r -> Component.Config.bDebug & dbgCompile) lprintf (r -> pApp, "[%d]EPCOMP: Start compiling %s DomTree = %d\n", r -> pThread -> nPid, sSourcefile, xDomTree) ; - /* ChdirToSource (r, sSourcefile) ; */ + if (r -> Component.Config.bOptions & optChdirToSource) + ChdirToSource (r, sSourcefile) ; r -> Component.nPhase = phCompile ; @@ -1706,7 +1707,7 @@ int embperl_Compile (/*i if (l > 1) { - pSV = newSVpvf("package %s ; %s\n%*.*s", r -> Component.sEvalPackage, use_utf8, l,l, r -> Component.pProgDef) ; + pSV = newSVpvf("package %s ; %s\n%*.*s", r -> Component.sEvalPackage, use_utf8, (int)l,(int)l, r -> Component.pProgDef) ; newSVpvf2(pSV) ; args[0] = r -> _perlsv ; args[1] = pDomTree -> pDomTreeSV ; @@ -1912,7 +1913,7 @@ int embperl_Execute (/*in*/ { epTHX_ int rc = ok ; - /* char * sSourcefile = r -> Component.sSourcefile ; */ + char * sSourcefile = r -> Component.sSourcefile ; tainted = 0 ; @@ -1927,7 +1928,8 @@ int embperl_Execute (/*in*/ SetHashValueInt (r, r -> pCleanupPackagesHV, r -> Component.sCurrPackage, 1) ; /* --- change working directory --- */ - /* ChdirToSource (r, sSourcefile) ; */ + if (r -> Component.Config.bOptions & optChdirToSource) + ChdirToSource (r, sSourcefile) ; if (c -> Param.pParam) @@ -1984,7 +1986,6 @@ int embperl_Execute (/*in*/ /* --- restore working directory --- */ - /* if (r -> Component.sResetDir[0]) { #ifdef WIN32 @@ -1994,7 +1995,6 @@ int embperl_Execute (/*in*/ strcpy (r -> Component.sCWD,r -> Component.sResetDir) ; r -> Component.sResetDir[0] = '\0' ; } - */ } else *pResultDomTree = 0 ; Modified: perl/embperl/trunk/epdat.h URL: http://svn.apache.org/viewvc/perl/embperl/trunk/epdat.h?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/epdat.h (original) +++ perl/embperl/trunk/epdat.h Tue Jan 22 05:47:20 2013 @@ -417,11 +417,6 @@ struct tReq int nInsideSub ; /* Are we inside of a sub? */ int bExit ; /* We should exit the page */ int nPathNdx ; /* gives the index in the path where the current file is found */ - char sCWD[PATH_MAX] ; /**< Current working directory */ - char sResetDir[PATH_MAX] ; /**< Reset directory to */ -#ifdef WIN32 - char nResetDrive ; /**< Reset drive to */ -#endif int nRequestCount ; /**< increments by one on each request */ time_t nRequestTime ; /**< time when request starts */ Modified: perl/embperl/trunk/epdat2.h URL: http://svn.apache.org/viewvc/perl/embperl/trunk/epdat2.h?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/epdat2.h (original) +++ perl/embperl/trunk/epdat2.h Tue Jan 22 05:47:20 2013 @@ -287,6 +287,10 @@ struct tComponent int bExit ; /* We should exit the page */ int nPathNdx ; /* gives the index in the path where the current file is found */ char * sCWD ; /**< Current working directory */ + char sResetDir[PATH_MAX] ; /**< Reset directory to */ +#ifdef WIN32 + char nResetDrive ; /**< Reset drive to */ +#endif bool bEP1Compat ; /* run in Embperl 1.x compatible mode */ int nPhase ; /* which phase of the request we are in */ Modified: perl/embperl/trunk/epdom.c URL: http://svn.apache.org/viewvc/perl/embperl/trunk/epdom.c?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/epdom.c (original) +++ perl/embperl/trunk/epdom.c Tue Jan 22 05:47:20 2013 @@ -137,7 +137,7 @@ tNodeData * dom_malloc (/*in*/ tApp * a, if (pMemLast == NULL) { char buf[256] ; - sprintf (buf, "dom_malloc: Out of memory (%u bytes)", sizeof (tPad)) ; + sprintf (buf, "dom_malloc: Out of memory (%u bytes)", (unsigned int)sizeof (tPad)) ; mydie (a, buf) ; } @@ -247,7 +247,7 @@ void * str_malloc (/*in*/ tApp * a, sprintf (buf, "%zu bytes", n) ; LogErrorParam (a, rcOutOfMemory, "str_malloc failed", buf) ; */ - sprintf (buf, "str_malloc: Out of memory (%u bytes)", n + sizeof (size_t)) ; + sprintf (buf, "str_malloc: Out of memory (%u bytes)", (unsigned int)(n + sizeof (size_t))) ; mydie (a, buf) ; } @@ -310,7 +310,7 @@ void * str_realloc (/*in*/ tApp * a, sprintf (buf, "%zu bytes", n) ; LogErrorParam (a, rcOutOfMemory, "str_realloc failed", buf) ; */ - sprintf (buf, "str_realloc: Out of memory (%u bytes)", n + sizeof (size_t)) ; + sprintf (buf, "str_realloc: Out of memory (%u bytes)", (unsigned int)(n + sizeof (size_t))) ; mydie (a, buf) ; } @@ -3213,7 +3213,6 @@ tNode Node_insertAfter (/*in*/ tNodeData * pNewNode = Node_selfLevel (a, pNewNodeDomTree, xNewNode, nNewRepeatLevel) ; tNodeData * pRefNode = Node_selfLevel (a, pRefNodeDomTree, xRefNode, nRefRepeatLevel) ; tNodeData * pNxtNode = Node_selfNextSibling (a, pRefNodeDomTree, pRefNode, nRefRepeatLevel) ; - tNode xOrgNode ; if (pNewNodeDomTree != pRefNodeDomTree) @@ -3244,7 +3243,6 @@ tNode Node_insertAfter (/*in*/ pNxtNode = NULL ; } - xOrgNode = pNewNode -> xNdx ; if (pNxtNode) { pNxtNode -> xPrev = pNewNode -> xNdx ; Modified: perl/embperl/trunk/eputil.c URL: http://svn.apache.org/viewvc/perl/embperl/trunk/eputil.c?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/eputil.c (original) +++ perl/embperl/trunk/eputil.c Tue Jan 22 05:47:20 2013 @@ -1563,6 +1563,108 @@ void embperl_SetCWDToFile (/*i/o*/ regi *p = '\0' ; } +/* ------------------------------------------------------------------------- */ +/* */ +/* Dirname */ +/* */ +/* returns dir name of file */ +/* */ +/* ------------------------------------------------------------------------- */ + + + +void Dirname (/*in*/ const char * filename, + /*out*/ char * dirname, + /*in*/ int size) + + { + char * p = strrchr (filename, '/') ; + + if (p == NULL) + { + strncpy (dirname, ".", size) ; + return ; + } + + if (size - 1 > p - filename) + size = p - filename ; + + strncpy (dirname, filename, size) ; + dirname[size] = '\0' ; + + return ; + } + +/* ---------------------------------------------------------------------------- */ +/* */ +/* Change Dir to sourcefile dir */ +/* */ +/* ---------------------------------------------------------------------------- */ + +void ChdirToSource (/*i/o*/ register req * r, + /*in*/ char * sInputfile) + + { + if ((r -> Component.Config.bOptions & optDisableChdir) == 0 && + sInputfile != NULL && *sInputfile != '\0' && + !r -> Component.Param.pInput && !r -> Component.sResetDir[0]) + { + 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++ ; + } + + r -> nResetDrive = _getdrive () ; + getcwd (r -> Component.sResetDir, sizeof (r -> Component.sResetDir) - 1) ; + + _splitpath(sInputfile, drive, dir, fname, ext ); + _chdrive (drive[0] - 'A' + 1) ; +#else + Dirname (sInputfile, dir, sizeof (dir) - 1) ; + getcwd (r -> Component.sResetDir, sizeof (r -> Component.sResetDir) - 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->Component.sCWD,r -> Component.sResetDir) ; + strcat (r->Component.sCWD,"/") ; + strcat (r->Component.sCWD,dir) ; + } + else + strcpy (r->Component.sCWD,dir) ; + } + } + else + r -> Component.Config.bOptions |= optDisableChdir ; + } + else + r -> Component.Config.bOptions |= optDisableChdir ; + } + /* ---------------------------------------------------------------------------- */ /* */ /* Path serach */ Modified: perl/embperl/trunk/podsrc/Config.spod URL: http://svn.apache.org/viewvc/perl/embperl/trunk/podsrc/Config.spod?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/podsrc/Config.spod (original) +++ perl/embperl/trunk/podsrc/Config.spod Tue Jan 22 05:47:20 2013 @@ -1036,6 +1036,10 @@ value is a blank string. Disable the removal of spaces and empty lines from the output. This is useful for sources other than HTML. +=item optChdirToSource = 0x10000000 (only 2.5 and above) + +Change current working directory to the directory of the sourcefile, +before executing the source. =back @@ -1134,10 +1138,9 @@ Set EMBPERL_INPUT_ESCMODE to 0 to get th =head2 *CFG $component / Embperl_INPUT_CHARSET / input_charset -NOT YET IMPLEMENTED! - - - +If set to the value "utf8" the source is interpreted as utf8 encoded so +you can use utf8 literals. It has the same effect as adding "use utf8" +to a normal Perl script. =head2 *CFG $component / Embperl_Top_Include / top_include / 2.0b10 / no Modified: perl/embperl/trunk/test.pl URL: http://svn.apache.org/viewvc/perl/embperl/trunk/test.pl?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/test.pl (original) +++ perl/embperl/trunk/test.pl Tue Jan 22 05:47:20 2013 @@ -567,6 +567,11 @@ 'chdir.htm' => { 'query_info' => 'a=1&b=2&c=&d=&f=5&g&h=7&=8&=', }, + 'chdir/chdir2src.htm' => { + 'query_info' => 'a=1&b=2&c=&d=&f=5&g&h=7&=8&=', + 'option' => 0x10000000, + 'cgi' => 0, + }, 'allform/allform.htm' => { 'query_info' => 'a=1&b=2&c=&d=&f=5&g&h=7&=8&=', 'option' => '8192', @@ -1196,6 +1201,7 @@ use vars qw ($httpconfsrc $httpconf $EPP } use File::Spec ; +use FindBin ; BEGIN { @@ -2501,9 +2507,9 @@ do ############# delete $ENV{EMBPERL_ALLOW} ; - $frommem = 1 ; if ($err == 0) { + $frommem = 1 ; print "\nTesting Ouput Caching...\n\n" ; #Embperl::Init ($logfile, $defaultdebug) ; Added: perl/embperl/trunk/test/cmp/chdir2src.htm URL: http://svn.apache.org/viewvc/perl/embperl/trunk/test/cmp/chdir2src.htm?rev=1436750&view=auto ============================================================================== --- perl/embperl/trunk/test/cmp/chdir2src.htm (added) +++ perl/embperl/trunk/test/cmp/chdir2src.htm Tue Jan 22 05:47:20 2013 @@ -0,0 +1,38 @@ +<html> +<head> +<title>Some tests for Embperl</title> +</head> + + +<body> + +^Script CWD: +^Embperl CWD: +^\$0: +^\$0 \(absolut\): +Equal: No<BR> +Diff CWD: >/test/html/chdir<<BR> +^Diff \$0: > +Test/html: yes +<table> + <tr> + <td>a</td><td>1</td> + </tr> + + <tr> + <td>b</td><td>2</td> + </tr> + + <tr> + <td>f</td><td>5</td> + </tr> + + <tr> + <td>h</td><td>7</td> + </tr> + </table> + + + +</body> +</html> Modified: perl/embperl/trunk/test/cmp/epform.htm URL: http://svn.apache.org/viewvc/perl/embperl/trunk/test/cmp/epform.htm?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/test/cmp/epform.htm (original) +++ perl/embperl/trunk/test/cmp/epform.htm Tue Jan 22 05:47:20 2013 @@ -24,20 +24,20 @@ function epform_validate_foo(return_msgs do { do { -obj = document.foo['datum'] ; if (obj && !(obj.value)) { ids[i] = 'datum' ; msgs[i++]='Bitte Datum eintragen'; break;} +obj = document.foo['datum'] ; if (obj && !(obj instanceof NodeList?obj[0].value:obj.value)) { ids[i] = 'datum' ; msgs[i++]='Bitte Datum eintragen'; break;} obj = document.foo['datum'] ; if (obj && !(obj.value.search(/\d+\.\d+\.\d+/) >= 0)) { ids[i] = 'datum' ; msgs[i++]='Datum überprüfen'; break;} } while (0) ; if (fail) break ; do { -obj = document.foo['stunden'] ; if (obj && !(obj.value)) { ids[i] = 'stunden' ; msgs[i++]='Bitte Stunden eintragen'; break;} +obj = document.foo['stunden'] ; if (obj && !(obj instanceof NodeList?obj[0].value:obj.value)) { ids[i] = 'stunden' ; msgs[i++]='Bitte Stunden eintragen'; break;} obj = document.foo['stunden'] ; if (obj && !(obj.value.search(/^\s*[0-9+-.,][0-9.,eE]*\s*$/) >= 0)) { ids[i] = 'stunden' ; msgs[i++]='Stundenzahl nicht numerisch'; break;} obj = document.foo['stunden'] ; if (obj && !(obj.value > 0)) { ids[i] = 'stunden' ; msgs[i++]='Stundenzahl muß >0 sein'; break;} } while (0) ; if (fail) break ; do { -obj = document.foo['kommentar'] ; if (obj && !(obj.value)) { ids[i] = 'kommentar' ; msgs[i++]='Bitte (sinnvollen) Kommentar eingeben'; break;} +obj = document.foo['kommentar'] ; if (obj && !(obj instanceof NodeList?obj[0].value:obj.value)) { ids[i] = 'kommentar' ; msgs[i++]='Bitte (sinnvollen) Kommentar eingeben'; break;} } while (0) ; if (fail) break ; @@ -54,11 +54,15 @@ obj = document.foo['kommentar'] ; if (ob var elems = document.foo[ids[key]] ; if (elems) { - if (elems.constructor.name != 'NodeList') + if (!(elems instanceof NodeList)) elems = [elems] ; + if (elems[0] instanceof NodeList) + elems = elems[0] ; for (i = 0; i < elems.length ;i++) { var elem = elems[i] ; + if (elem.getAttribute('type') == 'radio') + elem = elem.parentElement ; var eclass = elem.getAttribute('class') ; elem.setAttribute ('class', eclass + ' ' + failed_class) ; elem.setAttribute ('title', msgs[key]) ; @@ -68,7 +72,10 @@ obj = document.foo['kommentar'] ; if (ob } if (return_msgs) - return msgs ; + { + var ret = [msgs, ids] ; + return ret ; + } if (i) alert (msgs.join('\n')) ; Modified: perl/embperl/trunk/test/conf/httpd.conf.src URL: http://svn.apache.org/viewvc/perl/embperl/trunk/test/conf/httpd.conf.src?rev=1436750&r1=1436749&r2=1436750&view=diff ============================================================================== --- perl/embperl/trunk/test/conf/httpd.conf.src (original) +++ perl/embperl/trunk/test/conf/httpd.conf.src Tue Jan 22 05:47:20 2013 @@ -241,6 +241,13 @@ EMBPERL_OPTIONS 16 EMBPERL_INPUT_ESCMODE 0 </Location> +<Location /embperl/chdir> +SetHandler perl-script +PerlHandler Embperl +Options ExecCGI +EMBPERL_OPTIONS 0x10000000 +</Location> + <Location /embperl/nochdir> SetHandler perl-script PerlHandler Embperl Added: perl/embperl/trunk/test/html/chdir/chdir2src.htm URL: http://svn.apache.org/viewvc/perl/embperl/trunk/test/html/chdir/chdir2src.htm?rev=1436750&view=auto ============================================================================== --- perl/embperl/trunk/test/html/chdir/chdir2src.htm (added) +++ perl/embperl/trunk/test/html/chdir/chdir2src.htm Tue Jan 22 05:47:20 2013 @@ -0,0 +1,36 @@ +<html> +<head> +<title>Some tests for Embperl</title> +</head> + + +<body> + +[- use Cwd ; + +$r = shift -] + +Script CWD: [+ $script = getcwd +] <BR> +Embperl CWD: [+ $ep = $FindBin::Bin || $ENV{EMBPERL_SRC} +] <BR> +$0: [+ $abs = $0 +] + +[- $abs = $ep . '/' . $0 if (!($0 =~ /^\//)) ; -] +$0 (absolut): [+ $abs +] + +Equal: [+ $script eq $ep?'Yes':'No' +]<BR> +Diff CWD: [+ do { $script =~ /$ep/ ; ">$'<" } +]<BR> +Diff $0: [+ do { $abs =~ /$ep/ ; ">$'<" } +]<BR> +Test/html: [+ $script =~ /test(?:\/|\\)html(?:\/|\\)chdir$/?'yes':'no' +] + +[- @ks = sort keys %fdat -] + + <table> + <tr> + <td>[+ $ks[$row] +]</td><td>[+ $fdat{$ks[$row] || ''} +]</td> + </tr> + </table> + + + +</body> +</html> Propchange: perl/embperl/trunk/test/html/chdir/chdir2src.htm ------------------------------------------------------------------------------ svn:executable = * --------------------------------------------------------------------- To unsubscribe, e-mail: embperl-cvs-unsubscr...@perl.apache.org For additional commands, e-mail: embperl-cvs-h...@perl.apache.org