You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl-cvs@perl.apache.org by to...@apache.org on 2010/05/02 20:32:14 UTC

svn commit: r940293 - in /perl/modperl/branches/threading: ./ Changes lib/ModPerl/MapUtil.pm

Author: torsten
Date: Sun May  2 18:32:14 2010
New Revision: 940293

URL: http://svn.apache.org/viewvc?rev=940293&view=rev
Log:
Merged revisions 940287 via svnmerge from 
https://svn.eu.apache.org/repos/asf/perl/modperl/trunk

........
  r940287 | torsten | 2010-05-02 20:25:41 +0200 (Sun, 02 May 2010) | 23 lines
  
  Implement a mini-preprocess language for map-files in xs/maps.
  Syntax is
  
   #_if_ perl-code
   #_elsif perl-code
   #_else_
   #_end_
  
  and
  
   #_eval_ perl-code
  
  The main reason for this change is to make structures and functions
  available if a certain condition is met only. For example:
  
   #_if_ do {use Apache2::Build; Apache2::Build::PERL_HAS_ITHREADS}
   ...
   #_end_
  
  The _eval_ variant is thought mainly as a debugging tool:
  
   #_eval_ warn "here I am"
........

Modified:
    perl/modperl/branches/threading/   (props changed)
    perl/modperl/branches/threading/Changes
    perl/modperl/branches/threading/lib/ModPerl/MapUtil.pm

Propchange: perl/modperl/branches/threading/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun May  2 18:32:14 2010
@@ -1 +1 @@
-/perl/modperl/trunk:594682-672484,672819-681118,693357,700369,732889-736218,751909-752425,757553-774171,807116,807332-807649,907778-932879,933373-933563,935519,936643
+/perl/modperl/trunk:594682-672484,672819-681118,693357,700369,732889-736218,751909-752425,757553-774171,807116,807332-807649,907778-932879,933373-933563,935519,936643,940287

Propchange: perl/modperl/branches/threading/
------------------------------------------------------------------------------
--- svnmerge-integrated (original)
+++ svnmerge-integrated Sun May  2 18:32:14 2010
@@ -1 +1 @@
-/perl/modperl/trunk:1-712967,712969-936647
+/perl/modperl/trunk:1-712967,712969-940291

Modified: perl/modperl/branches/threading/Changes
URL: http://svn.apache.org/viewvc/perl/modperl/branches/threading/Changes?rev=940293&r1=940292&r2=940293&view=diff
==============================================================================
--- perl/modperl/branches/threading/Changes (original)
+++ perl/modperl/branches/threading/Changes Sun May  2 18:32:14 2010
@@ -31,6 +31,9 @@ Expose modperl_interp_t via ModPerl::Int
 
 =item 2.0.5-dev
 
+Implement a mini-preprocess language for map-files in xs/maps.
+[Torsten Foertsch]
+
 Implement APR::Socket::fileno [Torsten Foertsch]
 
 Export PROXYREQ_RESPONSE, a missing PROXYREQ_* constant [Gozer]

Modified: perl/modperl/branches/threading/lib/ModPerl/MapUtil.pm
URL: http://svn.apache.org/viewvc/perl/modperl/branches/threading/lib/ModPerl/MapUtil.pm?rev=940293&r1=940292&r2=940293&view=diff
==============================================================================
--- perl/modperl/branches/threading/lib/ModPerl/MapUtil.pm (original)
+++ perl/modperl/branches/threading/lib/ModPerl/MapUtil.pm Sun May  2 18:32:14 2010
@@ -87,13 +87,59 @@ package ModPerl::MapBase;
 *function_table = \&ModPerl::MapUtil::function_table;
 *structure_table = \&ModPerl::MapUtil::structure_table;
 
+my @condition;
+
 sub readline {
     my $fh = shift;
 
     while (<$fh>) {
         chomp;
         s/^\s+//; s/\s+$//;
-        s/^\#.*//;
+
+        # this implements
+        # #_if_ cmd
+        # ...
+        # #_else_
+        # #_end_
+        if (/^\s*#\s*_(if|unless|els(?:e|if)|end)_(?:\s(.+))?/) {
+            my ($cmd, $param) = ($1, $2);
+            if ($cmd eq 'if') {
+                unshift @condition, 0+!!eval $param;
+            }
+            elsif ($cmd eq 'elsif') {
+                die "parse error ($ModPerl::MapUtil::MapFile line $.)".
+                    " #_elsif_ without #_if_"
+                    unless @condition;
+                if ($condition[0] == 0) {
+                    $condition[0]+=!!eval $param;
+                } else {
+                    $condition[0]++;
+                }
+            }
+            elsif ($cmd eq 'else') {
+                die "parse error ($ModPerl::MapUtil::MapFile line $.)".
+                    " #_elsif_ without #_if_"
+                    unless @condition;
+                $condition[0]+=1;
+            }
+            elsif ($cmd eq 'unless') {
+                unshift @condition, 0+!eval $param;
+            }
+            elsif ($cmd eq 'end') {
+                shift @condition;
+            }
+        }
+        next if @condition and $condition[0] != 1;
+
+        if (/^\s*#\s*_(eval)_(?:\s(.+))?/) {
+            my ($cmd, $param) = ($1, $2);
+            if ($cmd eq 'eval') {
+                eval "#line $. $ModPerl::MapUtil::MapFile\n".$param;
+                die $@ if $@;
+            }
+            next;
+        }
+
         s/\s*\#.*//;
 
         next unless $_;
@@ -170,6 +216,7 @@ sub parse_map_files {
         open my $fh, $file or die "open $file: $!";
         local $ModPerl::MapUtil::MapFile = $file;
         bless $fh, __PACKAGE__;
+        @condition=();          # see readline() above
         $self->parse($fh, $map);
         close $fh;
     }