1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-11 05:18:09 +03:00

r13982: Add support for prototypes spread across multiple lines. Try to keep line

empty after inserting new prototypes.
(This used to be commit d3a21b58d4)
This commit is contained in:
Jelmer Vernooij 2006-03-07 20:22:26 +00:00 committed by Gerald (Jerry) Carter
parent 98d4c63867
commit 6e8f1ffc7d

View File

@ -3,9 +3,6 @@
#
# Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
# Published under the GNU GPL
#
# TODO:
# - update for prototypes that span lines
use strict;
use warnings;
@ -52,8 +49,8 @@ Show list of options
=head1 BUGS
Prototypes must appear on one line - they can't be split across multiple lines.
Some things are erroneously recognized as functions
Strange complex functions are not recognized. In particular those
created by macros or returning (without typedef) function pointers.
=head1 LICENSE
@ -89,6 +86,14 @@ GetOptions(
'v|verbose' => sub { $verbose += 1; }
) or Usage();
sub count($$)
{
my ($t, $s) = @_;
my $count = 0;
while($s =~ s/^(.)//) { $count++ if $1 eq $t; }
return $count;
}
my $header = shift @ARGV;
sub process_file($)
@ -96,18 +101,33 @@ sub process_file($)
my $file = shift;
open (IN, "<$file");
while (my $line = <IN>) {
next if ($line =~ /^\s/);
next unless ($line =~ /\(/);
next if ($line =~ /^\/|[;]|^#|}|^\s*static/);
next unless ($line =~ /^([^(]+)(\s+)(\w+)\s*\((.*)\)\s*{*\s*$/);
$_ = $line;
next if /^\s/;
next unless /\(/;
next if /^\/|[;]|^#|}|^\s*static/;
s/\/\*(.*?)\*\///g;
my $public = s/_PUBLIC_//g;
s/_PRINTF_ATTRIBUTE\([^)]+\)//g;
next unless /^(struct\s+\w+|union\s+\w+|\w+)\s+\**\s*(\w+)\s*\((.*)$/;
my $name = $3;
my $name = $2;
next if ($name eq "main");
next unless ($1 =~ /^[\*\w\s]+$/);
$line =~ s/}\s*$//g;
$line =~ s/\n//g;
# Read continuation lines if any
my $prn = 1 + count("(", $3) - count(")", $3);
while ($prn) {
my $l = <IN>;
$l or die("EOF while parsing function prototype");
$line .= $l;
$prn += count("(", $l) - count(")", $l);
}
$line =~ s/\n$//;
# Strip off possible start of function
$line =~ s/{\s*$//g;
$new_protos{$name} = "$line;";
}
@ -131,34 +151,64 @@ sub insert_new_protos()
%new_protos = ();
}
my $blankline_due = 0;
open (HDR, "<$header");
while (my $line = <HDR>) {
# Insert prototypes that weren't in the header before
if ($line =~ /^\/\* New prototypes are inserted above this line.*\*\/\s*$/) {
insert_new_protos();
print "$line\n";
next;
if ($line eq "\n") {
$blankline_due = 1;
$line = <HDR>;
}
# Recognize C files that prototypes came from
if ($line =~ /^\/\* The following definitions come from (.*) \*\//) {
if ($line =~ /\/\* The following definitions come from (.*) \*\//) {
insert_new_protos();
if ($blankline_due) {
print "\n";
$blankline_due = 0;
}
process_file($1);
print "$line";
next;
}
if ($blankline_due) {
print "\n";
$blankline_due = 0;
}
# Insert prototypes that weren't in the header before
if ($line =~ /\/\* New prototypes are inserted above this line.*\*\/\s*/) {
insert_new_protos();
print "$line\n";
next;
}
if ($line =~ /^\s*typedef |^\#|^\s*static/) {
print "$line";
next;
}
unless ($line =~ /^([^(]+)(\s+)(\w+)\s*\((.*)\)\s*;\s*$/) {
$_ = $line;
s/\/\*(.*?)\*\///g;
my $public = s/_PUBLIC_//g;
s/_PRINTF_ATTRIBUTE\([^)]+\)//g;
unless (/^(struct\s+\w+|union\s+\w+|\w+)\s+\**\s*(\w+)\s*\((.*)$/) {
print "$line";
next;
}
my $name = $3;
# Read continuation lines if any
my $prn = 1 + count("(", $3) - count(")", $3);
while ($prn) {
my $l = <HDR>;
$l or die("EOF while parsing function prototype");
$line .= $l;
$prn += count("(", $l) - count(")", $l);
}
my $name = $2;
# This prototype is for a function that was removed
unless (defined($new_protos{$name})) {