#!/usr/bin/perl
# Copyright 2012-2022, Alexander Shibakov
# This file is part of SPLinT
#
# SPLinT is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# SPLinT is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with SPLinT. If not, see .
use Getopt::Long;
use Pod::Usage;
my $man = 0;
my $help = 0;
#Getopt::Long::Configure ("bundling"); # to allow -abc to set a, b, and c
GetOptions ("help|?" => \$help,
man => \$man,
) or pod2usage(2);
pod2usage(-exitval => 0, -verbose => 1) if $help;
pod2usage(-exitval => 0, -verbose => 2) if $man;
for ($i = 0; $i <= $#ARGV; $i++) {
open FILE, "<$ARGV[$i]" or die "Cannot open file $ARGV[$i]!\n";
$filename = $ARGV[$i];
while() {
$text = $_;
while( $text =~ /(\\newcount|\\newtoks|\\newdimen|\\newif|\\let|\\([exg]|char|toks|count)?def)\w*(\\[a-zA-Z@]+)/g ) {
$cs = $3;
push @all, $cs;
if ( defined $secse{$cs}->{$filename} ) { $secse{$cs}->{$filename}++; }
else { $secse{$cs}->{$filename} = 1; };
}
}
}
#print keys %secse;
@alphsecs = sort keys %secse;
foreach $ocs (@alphsecs) {
print "$ocs \% ". ref $secse{$osc};
@fnames = sort keys %{$secse{$ocs}};
foreach $fname (@fnames) {
print " $fname ($secse{$ocs}->{$fname} occurence";
if ( $secse{$ocs}->{$fname} > 1 ) {print "s";}
print ")";
}
print "\n";
}
print "\n";
$i = $#alphsecs;
$i++;
print "total sequences: $i\n";
__END__
=head1 CSLIST
cslist.pl - output a list of all control sequences in the input files.
=head1 SYNOPSIS
cslist.pl [options] input_files
Options:
--help|-h|-? brief help message
--man|-m full documentation
=head1 OPTIONS
=over 8
=item B<--help>
Print a brief help message and exit.
=item B<--man>
Print the manual page and exit.
=back
=head1 DESCRIPTION
B will read the given , and produce a list of all the
B control sequences defined in those files (a contorl sequence is considered
I in a file B if one of B<\def>, B<\let>, B<\new...>, or similar
preceeds it in B.
=cut