dougm       01/03/14 10:32:13

  Modified:    lib/ModPerl Code.pm
  Log:
  generate modperl_handler_lookup() function for mapping Perl*Handler strings to 
integer value
  
  Revision  Changes    Path
  1.44      +56 -2     modperl-2.0/lib/ModPerl/Code.pm
  
  Index: Code.pm
  ===================================================================
  RCS file: /home/cvs/modperl-2.0/lib/ModPerl/Code.pm,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- Code.pm   2001/03/14 17:38:29     1.43
  +++ Code.pm   2001/03/14 18:32:11     1.44
  @@ -141,18 +141,19 @@
       while (my($class, $handlers) = each %{ $self->{handlers} }) {
           my $i = 0;
           my $n = @$handlers;
  +        my $handler_type = canon_define('HANDLER_TYPE', $class);
   
           print $h_fh "\n#define ",
             canon_define($class, 'num_handlers'), " $n\n\n";
   
  -        print $h_fh "#define ",
  -          canon_define('HANDLER_TYPE', $class), " $type\n\n";
  +        print $h_fh "#define $handler_type $type\n\n";
   
           $type++;
   
           for my $name (@$handlers) {
               my $define = canon_define($name, 'handler');
               $self->{handler_index}->{$class}->[$i] = $define;
  +            $self->{handler_index_type}->{$class}->[$i] = $handler_type;
               $self->{handler_index_desc}->{$class}->[$i] = "Perl${name}Handler";
               print $h_fh "#define $define $i\n";
               $i++;
  @@ -205,6 +206,55 @@
       return ($h_add, $c_add);
   }
   
  +sub generate_handler_find {
  +    my($self, $h_fh, $c_fh) = @_;
  +
  +    my $proto = 'int modperl_handler_lookup(const char *name, int *type)';
  +    my(%ix, %switch);
  +
  +    print $h_fh "$proto;\n";
  +
  +    print $c_fh <<EOF;
  +$proto
  +{
  +    if (*name == 'P' && strnEQ(name, "Perl", 4)) {
  +        name += 4;
  +    }
  +
  +    switch (*name) {
  +EOF
  +
  +    while (my($class, $handlers) = each %{ $self->{handlers} }) {
  +        my $i = 0;
  +
  +        for my $name (@$handlers) {
  +            $name =~ /^([A-Z])/;
  +            push @{ $switch{$1} }, $name;
  +            $ix{$name}->{name} = $self->{handler_index}->{$class}->[$i];
  +            $ix{$name}->{type} = $self->{handler_index_type}->{$class}->[$i++];
  +        }
  +    }
  +
  +    for my $key (sort keys %switch) {
  +        my $names = $switch{$key};
  +        print $c_fh "      case '$key':\n";
  +
  +        for my $name (@$names) {
  +            my $n = length($name);
  +            print $c_fh <<EOF;
  +          if (strnEQ(name, "$name", $n)) {
  +              *type = $ix{$name}->{type};
  +              return $ix{$name}->{name};
  +          }
  +EOF
  +        }
  +    }
  +
  +    print $c_fh "    };\n    return -1;\n}\n";
  +
  +    return ("", "");
  +}
  +
   sub generate_handler_directives {
       my($self, $h_fh, $c_fh) = @_;
   
  @@ -454,6 +504,8 @@
                                      c => 'modperl_hooks.c'},
      generate_handler_directives => {h => 'modperl_directives.h',
                                      c => 'modperl_directives.c'},
  +   generate_handler_find       => {h => 'modperl_hooks.h',
  +                                   c => 'modperl_hooks.c'},
      generate_flags              => {h => 'modperl_flags.h',
                                      c => 'modperl_flags.c'},
      generate_trace              => {h => 'modperl_trace.h'},
  @@ -560,6 +612,7 @@
       }
   
       for my $method (reverse sort keys %sources) {
  +        print "$method...";
           my($h_fh, $c_fh) = map {
               $self->fh($sources{$method}->{$_});
           } qw(h c);
  @@ -570,6 +623,7 @@
           if ($c_add) {
               print $c_fh $c_add;
           }
  +        print "done\n";
       }
   
       $self->postamble;
  
  
  

Reply via email to