aboutsummaryrefslogtreecommitdiff
path: root/scripts/finddeclarations.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/finddeclarations.pl')
-rwxr-xr-xscripts/finddeclarations.pl50
1 files changed, 50 insertions, 0 deletions
diff --git a/scripts/finddeclarations.pl b/scripts/finddeclarations.pl
new file mode 100755
index 0000000000..1b1a57b9b7
--- /dev/null
+++ b/scripts/finddeclarations.pl
@@ -0,0 +1,50 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+if ($ARGV[0] eq '--help') {
+ print << "EOF";
+Usage:
+
+ $0 definitions.c
+EOF
+ exit;
+}
+
+my ($cfname, $sfname, $gfname, $cpp) = @ARGV;
+
+my $F;
+
+open $F, "<", $cfname;
+
+my $text = join "", <$F>;
+
+close $F;
+
+my $s = qr/(?>\s*)/aso;
+my $w = qr/(?>\w+)/aso;
+my $argname = qr/$w(?:\[(?>\w+)\])?/aso;
+my $type_regex = qr/(?:$w$s\**$s)+/aso;
+my $arg_regex = qr/(?:$type_regex$s$argname)/aso;
+
+while ($text =~ /
+ (?<=\n) # Definition starts at the start of line
+ $type_regex # Return type
+ $s$w # Function name
+ $s\($s
+ (?:
+ $arg_regex(?:$s,$s$arg_regex)*+
+ ($s,$s\.\.\.)? # varargs function
+ |void
+ )?
+ $s\)
+ (?:$s FUNC_ATTR_$w(?:\((?>[^)]*)\))?)*+ # Optional attributes
+ (?=$s;) # Ending semicolon
+ /axsogp) {
+ my $match = "${^MATCH}";
+ my $s = "${^PREMATCH}";
+ $s =~ s/[^\n]++//g;
+ my $line = 1 + length $s;
+ print "${cfname}:${line}: $match\n";
+}