# Regenerate (overwriting only if changed):
#
# mg_vtable.h
+# pod/perlguts.pod
#
-# from information stored in this file.
+# from information stored in this file. pod/perlguts.pod is not completely
+# regenerated. Only the magic table is replaced; the other parts remain
+# untouched.
#
# Accepts the standard regen_lib -q and -v args.
#
desc => '%ENV hash element' },
fm => { char => 'f', vtable => 'regdata', value_magic => 1,
readonly_acceptable => 1, desc => "Formline ('compiled' format)" },
+ study => { char => 'G', vtable => 'regexp', value_magic => 1,
+ readonly_acceptable => 1, desc => 'study()ed string' },
regex_global => { char => 'g', vtable => 'mglob', value_magic => 1,
- readonly_acceptable => 1,
- desc => 'm//g target / study()ed string' },
+ readonly_acceptable => 1, desc => 'm//g target' },
hints => { char => 'H', vtable => 'hints', desc => '%^H hash' },
hintselem => { char => 'h', vtable => 'hintselem',
desc => '%^H hash element' },
desc => '@ISA array element' },
nkeys => { char => 'k', vtable => 'nkeys', value_magic => 1,
desc => 'scalar(keys()) lvalue' },
- dbfile => { char => 'L', vtable => 'dbline',
+ dbfile => { char => 'L',
desc => 'Debugger %_<filename' },
- dbline => { char => 'l', desc => 'Debugger %_<filename element' },
+ dbline => { char => 'l', vtable => 'dbline',
+ desc => 'Debugger %_<filename element' },
shared => { char => 'N', desc => 'Shared between threads',
unknown_to_sv_magic => 1 },
shared_scalar => { char => 'n', desc => 'Shared between threads',
unknown_to_sv_magic => 1 },
vec => { char => 'v', vtable => 'vec', value_magic => 1,
desc => 'vec() lvalue' },
- vstring => { char => 'V', value_magic => 1,
+ vstring => { char => 'V', value_magic => 1, vtable => 'vstring',
desc => 'SV was vstring literal' },
utf8 => { char => 'w', vtable => 'utf8', value_magic => 1,
desc => 'Cached UTF-8 information' },
cond => '#ifdef USE_LOCALE_COLLATE'},
'hintselem' => {set => 'sethint', clear => 'clearhint'},
'hints' => {clear => 'clearhints'},
+ 'vstring' => {set => 'setvstring'},
);
my ($vt, $raw, $names) = map {
open_new($_, '>',
{ by => 'regen/mg_vtable.pl', file => $_, style => '*' });
} 'mg_vtable.h', 'mg_raw.h', 'mg_names.c';
+my $guts = open_new("pod/perlguts.pod", ">");
print $vt <<'EOH';
/* These constants should be used in preference to raw characters
$data->{byte} = $byte;
$mg_order{(uc $byte) . $byte} = $name;
}
+ my @rows;
foreach (sort keys %mg_order) {
my $name = $mg_order{$_};
my $data = $mg{$name};
$char =~ s/([\\"])/\\$1/g;
printf $names qq[\t{ PERL_MAGIC_%-${longest_p1}s "%s(%s)" },\n],
"$name,", $name, $char;
+
+ push @rows, [(sprintf "%-2s PERL_MAGIC_%s", $data->{char}, $name),
+ $data->{vtable} ? "vtbl_$data->{vtable}" : '(none)',
+ $data->{desc}];
}
+ select +(select($guts), do {
+ my @header = ('(old-style char and macro)', 'MGVTBL', 'Type of magic');
+ my @widths = (0, 0);
+ foreach my $row (@rows) {
+ for (0, 1) {
+ $widths[$_] = length $row->[$_]
+ if length $row->[$_] > $widths[$_];
+ }
+ }
+ my $indent = ' ';
+ my $format
+ = sprintf "$indent%%-%ds%%-%ds%%s\n", $widths[0] + 1, $widths[1] + 1;
+ my $desc_wrap =
+ 79 - 7 - (length $indent) - $widths[0] - $widths[1] - 2;
+
+ open my $oldguts, "<", "pod/perlguts.pod"
+ or die "$0 cannot open pod/perlguts.pod for reading: $!";
+ while (<$oldguts>) {
+ print;
+ last if /^=for mg_vtable.pl begin/
+ }
+
+ print "\n", $indent . "mg_type\n";
+ printf $format, @header;
+ printf $format, map {'-' x length $_} @header;
+ foreach (@rows) {
+ my ($type, $vtbl, $desc) = @$_;
+ $desc =~ tr/\n/ /;
+ my @cont;
+ if (length $desc > $desc_wrap) {
+ # If it's too long, first split on '(', if there.
+ # [Which, if there, is always short enough, currently.
+ # Make this more robust if that changes]
+ ($desc, @cont) = split /(?=\()/, $desc;
+ if (!@cont) {
+ ($desc, @cont) = $desc =~ /(.{1,$desc_wrap})(?: |\z)/g
+ }
+ }
+ printf $format, $type, $vtbl, $desc;
+ printf $format, '', '', $_ foreach @cont;
+ }
+ print "\n";
+
+ while (<$oldguts>) {
+ last if /^=for mg_vtable.pl end/;
+ }
+ do { print } while <$oldguts>;
+ })[0];
}
my @names = sort keys %sig;
die "Too many vtable names" if @vtable_names > 63;
read_only_bottom_close_and_rename($_) foreach $vt, $raw, $names;
+ close_and_rename($guts);