-
Notifications
You must be signed in to change notification settings - Fork 138
/
ops_summary.pl
118 lines (86 loc) · 2.32 KB
/
ops_summary.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#! perl
# Copyright (C) 2007, Parrot Foundation.
use warnings;
use strict;
package OpsSummary;
use base 'Pod::Parser';
my $current_file;
my $current_op;
my %blurb_for_file;
my %blurbs_for_op;
my %ops_in_file;
sub command {
my ( $parser, $command, $paragraph, $line_num ) = @_;
1 while chomp $paragraph;
undef $current_op;
# looks like a new opcode, let's try to add it
if ( $command eq 'item' ) {
my ($opname) = $paragraph =~ /^B<([^>]+)>/;
return unless defined $opname;
push @{ $blurbs_for_op{$opname} }, "=item $paragraph\n\n";
$ops_in_file{$current_file}{$opname} = 1;
$current_op = $opname;
}
}
sub verbatim {
my ( $parser, $paragraph, $line_num ) = @_;
1 while chomp $paragraph;
if ( defined $current_op ) {
$blurbs_for_op{$current_op}[-1] .= "$paragraph\n";
}
}
sub interior_sequence {
my ( $parser, $seq_command, $seq_argument ) = @_;
}
sub textblock {
my ( $parser, $paragraph, $line_num ) = @_;
1 while chomp $paragraph;
# get the short blurb for our file
if ( not exists $blurb_for_file{$current_file} ) {
$blurb_for_file{$current_file} = "$paragraph\n";
}
if ( defined $current_op ) {
$blurbs_for_op{$current_op}[-1] .= "$paragraph\n";
}
}
die "OpsSummary is not meant to be used as a module" if caller;
@ARGV = grep { $_ !~ /index\.pod$/ } <docs/ops/*.pod>
unless @ARGV;
my $parser = new OpsSummary;
for (@ARGV) {
next if $_ eq 'index.pod';
$current_file = $_;
$parser->parse_from_file($_);
}
print << "EOH";
=head1 NAME
Parrot opcodes summary
=head2 Parrot Opcodes by Category
=over 4
EOH
foreach my $file ( sort keys %ops_in_file ) {
print "=item $blurb_for_file{$file}\n";
print join ', ', map { "C<$_>" } sort keys %{ $ops_in_file{$file} };
print "\n\n";
}
print << "EOH2";
=back
=head2 Alphabetical Listing of Parrot Opcodes
=over 8
EOH2
foreach my $op ( sort keys %blurbs_for_op ) {
my $op_has_description = grep { /^.+\n+./ } @{ $blurbs_for_op{$op} };
$blurbs_for_op{$op}[-1] .= "-\n" unless $op_has_description;
foreach my $syntax ( @{ $blurbs_for_op{$op} } ) {
print "$syntax\n";
}
}
print << "EOH3";
=back
EOH3
# Local Variables:
# mode: cperl
# cperl-indent-level: 4
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4: