Testing latest pari + WASM + node.js... and it works?! Wow.
License: GPL3
ubuntu2004
#!/usr/bin/perl
BEGIN { @INC=(".",@INC); }
use warnings FATAL => 'all';
use strict;
use PARI::822;
my (%funcs, %Fun_by_sec, %sec_header, @SECTIONS);
PARI::822::read(\%funcs, "pari.desc");
@SECTIONS = qw(
programming/control
programming/specific
programming/parallel
default
operators
conversions
combinatorics
number_theoretical
polynomials
linear_algebra
transcendental
sums
number_fields
algebras
elliptic_curves
l_functions
modular_forms
modular_symbols
graphic
);
for (keys %funcs)
{
my ($s) = $funcs{$_}->{Section};
next if (!$s);
my ($c) = $funcs{$_}->{Class};
if ($c eq 'header')
{ $sec_header{$s} = $funcs{$_}->{Doc} }
else
{ push(@{$Fun_by_sec{$s}}, $_); }
}
for (@SECTIONS)
{
my ($sec) = $_;
my ($head) = $sec_header{$sec};
print "$head\n" if defined($head);
next if (!$Fun_by_sec{$sec});
for ( sort @{$Fun_by_sec{$sec}} ) {
my ($fun) = $funcs{$_};
my ($doc) = $fun->{Doc};
next if (!defined($doc));
my ($args) = $fun->{Help};
my ($v);
$doc =~ s/^[\n\t ]*(.)/uc($1)/e;
$args =~ s/ *:.*//s;
# sanity checks
if ($args =~ /([_a-zA-Z0-9]*)\(/ && $fun->{Function} ne $1)
{ die "fix $fun->{Function} Help" }
if ($fun->{Help} =~ /\$/) { die "\$ in $fun->{Function}"; }
die "double parenthesis in $fun->{Function} proto" if ($args =~ /\)\)/);
# ok
if (!$args || $args =~ /^\w+=\w+\(\)/) { $args = $v = ''; }
else
{
$args =~ s/^[^(]*\((.*)\)/$1/; # args proper
$v = $args;
$v =~ s/([{}&])/\\$1/g;
$v =~ s/\^(\d+)/^{$1}/g;
$v =~ s/\[\]/[\\,]/g;
$v =~ s/([a-zA-Z]\w+)/\\var{$1}/g;
$v =~ s/\^([a-z])/\\hbox{\\kbd{\\pow}}$1/g;
$v =~ s/\\var\{flag\}/\\fl/g;
$v =~ s/\\var\{(\d+)\}/{$1}/g;
$v =~ s/_/\\_/g; # don't merge with first subst: \var{} rule kills it
$v = "\$($v)\$";
}
if ($doc !~ /\\syn\w*\{/ && $sec !~ /programming\/control/) {
$doc .= library_syntax($fun, $args);
}
s/_def_//;
my ($secname) = $_;
my ($l) = ($fun->{Section} =~ 'default')? "def,$_": $_;
my ($idx) = ($secname =~ s/_/\\_/g)? $l: $secname;
print "\n\\subsec{$secname$v}\\kbdsidx{$idx}\\label{se:$l}\n$doc\n";
}
}
print '\vfill\eject';
sub library_syntax { my ($fun, $args) = @_;
return '' if ($fun->{Class} =~ /^(gp|default|gp_default)$/);
my ($Cname) = $fun->{'C-Name'};
return '' if (!$Cname);
my ($Variant) = $fun->{Variant};
my ($Proto) = $fun->{Prototype};
$Proto =~ s/\\n.*//; # delete Mnemonics
my (@proto) = split(//, $Proto);
$args =~ s/[{}&]//g;
$args =~ s/ *=[^,\)]*//g; # delete default values
my (@ARGS) = split(/[,^] */, $args); # ^ for O(p^e)
my ($type) = "GEN";
my (@vars)=();
$args = '';
for (my $i = 0; $i <= $#proto; )
{
my ($c) = $proto[$i++];
if ($c eq 'l') { $type = "long"; next; }
if ($c eq 'v') { $type = "void"; next; }
if ($c =~ /^[GWIJE]$/) {$args .= ", GEN " . shift(@ARGS); next;}
if ($c eq 'U') {$args .= ", ulong " . shift(@ARGS); next;}
if ($c eq 'L') {$args .= ", long " . shift(@ARGS); next;}
if ($c eq 'n') {my ($v) = shift(@ARGS); push @vars,"\\kbd{$v}";
$args .= ", long " . $v; next;}
if ($c =~ /^[rs]$/) {$args .= ", const char *" . shift(@ARGS); next;}
if ($c eq 'p') {$args .= ", long prec"; next;}
if ($c eq 'b') {$args .= ", long bitprec"; next;}
if ($c eq 'P') {$args .= ", long precdl"; next;}
if ($c eq 'C') {$args .= ", GEN ctx"; next;}
if ($c eq '') { next; }
if ($c eq 'D') {
$c = $proto[$i++];
if ($c eq 'G') {$args .= ", GEN " . shift(@ARGS) ." = NULL"; next;}
if ($c =~ /^[rs]$/) {$args .= ", const char *" . shift(@ARGS) ." = NULL"; next;}
if ($c eq '&') {$args .= ", GEN *". shift(@ARGS) ." = NULL"; next;}
if ($c eq 'P') {$args .= ", long precdl"; next;}
if ($c eq 'n') {
my ($v) = shift(@ARGS);
$args .= ", long $v = -1";
push @vars,"\\kbd{$v}";
next;
}
if ($c eq 'V') {
next;
}
if ($c =~ /^[EI]$/) {
$args .= ", GEN ". shift(@ARGS) ." = NULL"; next;
}
while (($c = $proto[$i++]) ne ',') {}
}
}
$args =~ s/^, //;
my ($post);
my ($l)=scalar @vars;
if ($l==0) { $post=''; }
elsif ($l==1)
{
$post = " where $vars[0] is a variable number";
}
else
{
my ($vl)=join(", ",@vars);
$post = " where $vl are variable numbers";
}
my ($txt) = "\n\nThe library syntax is \\fun{$type}{$Cname}{$args}$post.";
$txt .= "\n$Variant" if ($Variant);
return $txt;
}