The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

_END }

    close NEW or die "write error in $podtmp: $!\n";
    close POD or die "read error in $pod: $!\n";

    if($changes) { rename $podtmp, $pod or die "rename $podtmp $pod: $!" }
    else         { unlink $podtmp       or die "unlink $podtmp: $!"  }
}

sub produce_table($) { my $table = shift;

    my @rows;

warn "TABLE $table\n"; if($table eq 'confstr') { my @names = confstr_names; foreach my $name (sort @names) { my $val = confstr $name; push @rows, [ $name, defined $val ? "'$val'" : 'undef' ] } } elsif($table eq 'sysconf') { my @names = sysconf_names; foreach my $name (sort @names) { my $val = sysconf $name; push @rows, [ $name, defined $val ? $val : 'undef' ] } } elsif($table eq 'pathconf') { my @names = pathconf_names; foreach my $name (sort @names) { my $val = pathconf __FILE__, $name; push @rows, [ $name, defined $val ? $val : 'undef' ] } } elsif($table eq 'rlimit') { my @names = rlimit_names; foreach my $name (sort @names) { my ($soft, $hard, $success) = getrlimit $name; $soft //= 'undef'; $hard //= 'undef'; push @rows, [ $name, sprintf "%-25s %s", $soft, $hard ] } } elsif($table eq 'ulimit') { my @names = ulimit_names; foreach my $name (sort @names) { my $val = $name =~ m/GET/ ? ulimit $name : '(setter)'; push @rows, [ $name, defined $val ? $val : 'undef' ] } } elsif($table eq 'math') { my $constants = $POSIX::1003::Math::EXPORT_TAGS{constants}; no strict 'refs'; foreach my $name (sort @$constants) { my $val = &{"POSIX::1003::Math::$name"}; defined $val or $val = 'undef'; push @rows, [ $name, $val ]; } } elsif($table eq 'math') { my $constants = $POSIX::1003::Math::EXPORT_TAGS{constants}; no strict 'refs'; foreach my $name (sort @$constants) { my $val = &{"POSIX::1003::Math::$name"}; defined $val or $val = 'undef'; push @rows, [ $name, $val ]; } } elsif($table eq 'signals') { my $constants = $POSIX::1003::Signals::EXPORT_TAGS{constants}; no strict 'refs'; foreach my $name (sort @$constants) { my $val = &{"POSIX::1003::Signals::$name"}; defined $val or $val = 'undef'; push @rows, [ $name, $val ]; } } elsif($table eq 'fdio') { my $constants = $POSIX::1003::FdIO::EXPORT_TAGS{constants}; no strict 'refs'; foreach my $name (sort @$constants) { my $val = &{"POSIX::1003::FdIO::$name"}; defined $val or $val = 'undef'; push @rows, [ $name, $val ]; } } elsif($table eq 'fsys') { my $constants = $POSIX::1003::FS::EXPORT_TAGS{constants}; no strict 'refs'; foreach my $name (sort @$constants) { my $val = &{"POSIX::1003::FS::$name"}; defined $val or $val = 'undef'; push @rows, [ $name, $val ]; } } elsif($table eq 'termios') { my $constants = $POSIX::1003::Termios::EXPORT_TAGS{constants}; no strict 'refs'; foreach my $name (sort @$constants) { my $val = &{"POSIX::1003::Termios::$name"}; defined $val or $val = 'undef'; push @rows, [ $name, $val ]; } } else { die "do not know how to make table $table"; }

    my $longest_name = 0;
    my $longest_val  = 5;  # at least 'undef'
    for (@rows)
    {   $longest_name = length $_->[0] if $longest_name < length $_->[0];
        $longest_val  = length $_->[1] if $longest_val  < length $_->[1];
    }

    my @lines;
    foreach (@rows)
    {   my ($name, $value) = @$_;
        $name .= ' ' x ($longest_name - length $name);
        push @lines, "  $name   $value\n";
    }

    if($longest_name+$longest_val < 20)
    {    push @lines, "\n" while @lines %3;
         my $rows   = @lines / 3;
         my @left   = splice @lines, 0, $rows;
         chomp @left;
         my @middle = splice @lines, 0, $rows;
         chomp @middle;
         my @right = @lines;
         @lines = ();
         push @lines, sprintf "%-21s %-21s %s"
           , shift @left, shift @middle, shift @right
                 while @left;
    }
    elsif($longest_name+$longest_val < 30)
    {    push @lines, "\n" if @lines %2;
         my @left  = splice @lines, 0, @lines/2;
         chomp @left;
         my @right = @lines;
         @lines = ();
         push @lines, sprintf "%-31s  %s", shift @left, shift @right
             while @left;
    }
    @lines;
}