#!/usr/bin/perl -w
# read list of c protos and write pp_defs to stdout.
# write a file of possible tests to file $subtests.
# John Lapeyre Sat Mar 21 18:17:54 MST 1998


$sublist = 'sublist';  #input file containing  prototypes
$subtests = 'subtests'; # output file of crappy tests

math_ppdefs();

sub deb {
    print STDERR "$_[0]\n";
}

# parse a c prototype line
sub parse_proto {
    my(@n,@t,@nn, $i);
    my $line = shift;
    my($rt,$name,$pairs) = $line =~ /^(\S+)\s+([^\(]+)\(([^\)]*)/;
    my (@pairs) = split /\,/,$pairs;
    $i =0;
    foreach (@pairs) {
	my($t,$n) = split;
	$t[$i] = $t;
	$n[$i] = $n;
	$nn[$i] = chr(97+$i);
	$i++;
    }
#  $rt=return type, $name=func name, @t=arg types, @n=arg names, @nn=new names (a,b,c,..)
    return ($rt,$name,\@t,\@n,\@nn);
}


# Writes most ppdefs for src/math .
sub math_ppdefs {
    open TH, ">$subtests";

    my @lines = `cat $sublist`;
    my @bad = ('cube', 'builtin_rint','square');
LOOP: foreach (@lines) {
    chomp;
    my($i);
    next if /^\#/;
    my $line = $_;
    my($rt,$name,$t,$n,$nn)= parse_proto($line);
    foreach ( @bad ) {
	next LOOP if $name eq $_;
    }
#    deb join " | ",@$t;
#    deb join " | ",@$n;
    my $cs = "\$ppret() = $name(";
    my $pars = '';
    my $testargs = '';
    for ($i=0;$i<@$t;$i++) {
	if ( $$t[$i] ne 'void' ) {
	    if ($$t[$i] eq 'double') {
		if ( $$n[$i] =~ /^(n|N)/ ) {
		    $testargs .= '2.0' ;
		}
		else {
		    $testargs .= '0.5';
		}
	    }
	    else {
		$testargs .= '2';
	    }
	    $testargs .= ',' unless $i==@$t-1;
	    $cs .= "($$t[$i])\$$$nn[$i]()";
	    $cs .= "," unless $i==@$t-1;
	    $pars .= "$$nn[$i](); ";
	}
    }
    print TH "# $line\n";
#    print TH join " | ",@$t,"\n";
#    print TH join " | ",@$n,"\n";
    print TH "'$name($testargs)',\n";
    $cs  .= ");";
    $pars .= " [o]ppret()";
    
    
    print <<"EOD";
    
pp_def("$name",
       Pars => '$pars',
       Code => '
            extern $line;
	    $cs
');
    
EOD
	
}
}





