#!/usr/bin/perl pp_addpm({At=>Top},<<'EOD'); $PDL::onlinedoc->scan(__FILE__) if $PDL::onlinedoc; =head1 NAME PDL::GSL::CDF - PDL interface to GSL Cumulative Distribution Functions =head1 DESCRIPTION This is an interface to the Cumulative Distribution Function package present in the GNU Scientific Library. =head1 SYNOPSIS use PDL; use PDL::GSL::CDF; my $p = gsl_cdf_tdist_P( $t, $df ); my $t = gsl_cdf_tdist_Pinv( $p, $df ); =cut EOD pp_addhdr(' #include '); my ($header) = `gsl-config --cflags` =~ m/-I(.+)$/; $header .= '/gsl/gsl_cdf.h'; # for win32. Thanks Sisyphus! $header =~ s/"//g; open my $fh, "< $header" or die "$!"; local $/ = undef; my $h = <$fh>; my @functions = $h =~ m/\n(double .+? ;)\n/xmsg; my %p_type = ( 'double' => 'double', 'unsigned int' => 'ushort', ); for (@functions) { s/\n\s+/ /xmsg; s/const //g; if (m/^(\w+)\ (\w+)\ \( (.+) \)\;$/xs) { my ($out_type, $function, $pars) = ($1, $2, $3); my @pars = split /,/, $pars; for (@pars) { if (m/^(.+)( \w+)$/) { my ($type, $par) = ($1, $2); s/^ | $//g for ($type, $par); $par = lc $par; # numbers interfere with $ISGOOD in BadCode $par =~ s/1/a/g; $par =~ s/2/b/g; $_ = [$p_type{$type}, $par]; } } my ($p, $code, $badcode) = print_ppdef( $out_type, $function, @pars ); pp_def($function, HandleBad => 1, GenericTypes => [D], Pars => $p, Code => $code, BadCode => $badcode, Doc => '', ); } } sub print_ppdef { my ($out_type, $function, @pars) = @_; my ($pars, $code, $badcode); for (@pars) { my ($type, $par) = @$_; $pars .= "$type $par(); "; } $pars .= "$out [o]out()"; $code = "\$out() = $function( "; $code .= "\$" . $_->[1] . "(), " for (@pars); $code .= ");"; $code =~ s/, \);/ );/; $badcode = "if ( " . join(' && ', map { "\$ISGOOD($_->[1]())" } @pars ) . " ) {\n"; $badcode .= ' ' . $code . "\n}\n"; $badcode .= "else {\n \$SETBAD(out());\n}"; # print "pp_def('$function',\n"; # print " HandleBad => 1,\n"; # print " GenericTypes => [D],\n"; # print " Pars => '$pars',\n"; # print " Code => '\n$code\n',\n"; # print " BadCode => '\n$badcode\n',\n"; # print " Doc => '',\n"; # print ");\n\n"; return ($pars, $code, $badcode); } pp_addpm({At=>Bot},<<'EOD'); =head1 AUTHOR Copyright (C) 2009 Maggie J. Xiong The GSL CDF module was written by J. Stover. All rights reserved. There is no warranty. You are allowed to redistribute this software / documentation as described in the file COPYING in the PDL distribution. =cut EOD pp_done();