OpenPKG CVS Repository
  http://cvs.openpkg.org/
  ____________________________________________________________________________

  Server: cvs.openpkg.org                  Name:   Michael van Elst
  Root:   /e/openpkg/cvs                   Email:  [EMAIL PROTECTED]
  Module: openpkg-re                       Date:   13-Nov-2002 10:24:29
  Branch: HEAD                             Handle: 2002111309242900

  Modified files:
    openpkg-re              openpkg-index

  Log:
    look for external parameters in description

  Summary:
    Revision    Changes     Path
    1.6         +29 -15     openpkg-re/openpkg-index
  ____________________________________________________________________________

  Index: openpkg-re/openpkg-index
  ============================================================
  $ cvs diff -u -r1.5 -r1.6 openpkg-index
  --- openpkg-re/openpkg-index  12 Nov 2002 14:23:18 -0000      1.5
  +++ openpkg-re/openpkg-index  13 Nov 2002 09:24:29 -0000      1.6
  @@ -98,6 +98,20 @@
   }
   
   #
  +# deduce external variables from description
  +#
  +sub find_options ($) {
  +    my($descr) = @_;
  +    my(%evar);
  +
  +    %evar = map {
  +        $1 => '%{'.$1.'}'
  +    } $descr =~ /--define\s*'(\S+)\s*\%\{\1\}'/;
  +
  +    return \%evar;
  +}
  +
  +#
   # translate default section from spec-file
   # into a hash
   # %if/%ifdef/%define... are translated to #if/#ifdef/#define
  @@ -110,11 +124,11 @@
   # all attributes are of the form key: value
   # repeated attributes are coalesced into a list
   #
  -sub package2data ($) {
  -    my($s) = @_;
  +sub package2data ($$) {
  +    my($s,$evar) = @_;
       my(%var);
       my(@term, $term);
  -    my(%attr, %evar);
  +    my(%attr);
       my($l, $v, $cond, $d, $p);
       my($re,@defs);
   
  @@ -128,14 +142,13 @@
       $s =~ s/^#\{\!\?([^:]*):\s*(.*?)\s*\}\s*$/#ifndef $1\n$2\n#endif/mg;
   
       #
  -    # guess what parameters are external conditions by scanning
  -    # for "default" sections.
  +    # guess more external parameters by scanning for "default" sections.
       #
       $re = '^\#ifndef\s+[\w\_]+\s*\n((?:\#define\s+[\w\_]+\s.*\n)+)\#endif\n';
       @defs = $s =~ /$re/gm;
       foreach (@defs) {
           while (/^\#define\s+([\w\_]+)\s(.*?)\s*$/mg) {
  -            $evar{$1} = '%{'.$1.'}';
  +            $evar->{$1} = '%{'.$1.'}';
           }
       }
       $s =~ s/$re//gm;
  @@ -161,10 +174,10 @@
               while ($p =~ 
/(?:(\!|\|\||\&\&|\(|\))|"\%\{([^}]+)\}"\s*==\s*"(yes|no)")/g) {
                   if (defined $1) {
                       $term .= " $1 ";
  -                } elsif (exists $evar{$2}) {
  -                    $term .= ($3 eq 'no' ? '! ' : '').vsub(\%evar,'%{'.$2.'}');
  +                } elsif (exists $evar->{$2}) {
  +                    $term .= ($3 eq 'no' ? '! ' : '').vsub($evar,'%{'.$2.'}');
                   } else {
  -                    die "ERROR: unknown conditional: $l\n== $v\n";
  +                    warn "WARNING: unknown conditional '$2':\n< $l\n> $v\n";
                   }
               }
   
  @@ -191,13 +204,13 @@
               # define internal variables
               # -> store for subsequent substitution
               #
  -            if (exists $evar{$1}) {
  +            if (exists $evar->{$1}) {
                   if ($2 eq 'yes') {
  -                    $evar{$1} = "( \%\{$1\} || ( $cond ) )";
  +                    $evar->{$1} = "( \%\{$1\} || ( $cond ) )";
                   } elsif ($2 eq 'no') {
  -                    $evar{$1} = "( %\{$1\} && ! ( $cond ) )";
  +                    $evar->{$1} = "( %\{$1\} && ! ( $cond ) )";
                   } else {
  -                    die "ERROR: logic too complex: $l\n== $v\n";
  +                    warn "WARNING: logic too complex for '$1':\n< $l\n> $v\n";
                   }
               } else {
                   $var{$1} = $2;
  @@ -227,7 +240,7 @@
   sub spec2data ($) {
       my($s) = @_;
       my(%map);
  -    my($a);
  +    my($a,$o);
   
       # remove comments
       $s =~ s/^\s*#.*?\n//mg;
  @@ -244,7 +257,8 @@
           }
       }
   
  -    $a = package2data($map{'*'});
  +    $o = find_options($map{'description'});
  +    $a = package2data($map{'*'}, $o);
       if (exists $map{'description'}) {
           $a->{'Description'} = $map{'description'};
       }
______________________________________________________________________
The OpenPKG Project                                    www.openpkg.org
CVS Repository Commit List                     [EMAIL PROTECTED]

Reply via email to