mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-27 07:22:07 +03:00
4cfd709021
This introduces a syntax-check script that validates header files use a common layout: /* ...copyright header... */ <one blank line> #ifndef SYMBOL # define SYMBOL ....content.... #endif /* SYMBOL */ For any file ending priv.h, before the #ifndef, we will require a guard to prevent bogus imports: #ifndef SYMBOL_ALLOW # error .... #endif /* SYMBOL_ALLOW */ <one blank line> The many mistakes this script identifies are then fixed. Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
150 lines
4.3 KiB
Perl
150 lines
4.3 KiB
Perl
#!/usr/bin/perl
|
|
#
|
|
# Validate that header files follow a standard layout:
|
|
#
|
|
# /*
|
|
# ...copyright header...
|
|
# */
|
|
# <one blank line>
|
|
# #ifndef SYMBOL
|
|
# # define SYMBOL
|
|
# ....content....
|
|
# #endif /* SYMBOL */
|
|
#
|
|
# For any file ending priv.h, before the #ifndef
|
|
# We will have a further section
|
|
#
|
|
# #ifndef SYMBOL_ALLOW
|
|
# # error ....
|
|
# #endif /* SYMBOL_ALLOW */
|
|
# <one blank line>
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
my $STATE_COPYRIGHT_COMMENT = 0;
|
|
my $STATE_COPYRIGHT_BLANK = 1;
|
|
my $STATE_PRIV_START = 2;
|
|
my $STATE_PRIV_ERROR = 3;
|
|
my $STATE_PRIV_END = 4;
|
|
my $STATE_PRIV_BLANK = 5;
|
|
my $STATE_GUARD_START = 6;
|
|
my $STATE_GUARD_DEFINE = 7;
|
|
my $STATE_GUARD_END = 8;
|
|
my $STATE_EOF = 9;
|
|
|
|
my $file = " ";
|
|
my $ret = 0;
|
|
my $ifdef = "";
|
|
my $ifdefpriv = "";
|
|
|
|
my $state = $STATE_EOF;
|
|
my $mistake = 0;
|
|
|
|
sub mistake {
|
|
my $msg = shift;
|
|
warn $msg;
|
|
$mistake = 1;
|
|
$ret = 1;
|
|
}
|
|
|
|
while (<>) {
|
|
if (not $file eq $ARGV) {
|
|
if ($state == $STATE_COPYRIGHT_COMMENT) {
|
|
&mistake("$file: missing copyright comment");
|
|
} elsif ($state == $STATE_COPYRIGHT_BLANK) {
|
|
&mistake("$file: missing blank line after copyright header");
|
|
} elsif ($state == $STATE_PRIV_START) {
|
|
&mistake("$file: missing '#ifndef $ifdefpriv'");
|
|
} elsif ($state == $STATE_PRIV_ERROR) {
|
|
&mistake("$file: missing '# error ...priv allow...'");
|
|
} elsif ($state == $STATE_PRIV_END) {
|
|
&mistake("$file: missing '#endif /* $ifdefpriv */'");
|
|
} elsif ($state == $STATE_PRIV_BLANK) {
|
|
&mistake("$file: missing blank line after priv header check");
|
|
} elsif ($state == $STATE_GUARD_START) {
|
|
&mistake("$file: missing '#ifndef $ifdef'");
|
|
} elsif ($state == $STATE_GUARD_DEFINE) {
|
|
&mistake("$file: missing '# define $ifdef'");
|
|
} elsif ($state == $STATE_GUARD_END) {
|
|
&mistake("$file: missing '#endif /* $ifdef */'");
|
|
}
|
|
|
|
$file = $ARGV;
|
|
$state = $STATE_COPYRIGHT_COMMENT;
|
|
$mistake = 0;
|
|
}
|
|
|
|
if ($mistake ||
|
|
$ARGV eq "config-post.h" ||
|
|
$ARGV =~ /vbox_(CAPI|XPCOM)/) {
|
|
$state = $STATE_EOF;
|
|
next;
|
|
}
|
|
|
|
if ($state == $STATE_COPYRIGHT_COMMENT) {
|
|
if (m,\*/,) {
|
|
$state = $STATE_COPYRIGHT_BLANK;
|
|
}
|
|
} elsif ($state == $STATE_COPYRIGHT_BLANK) {
|
|
if (! /^$/) {
|
|
&mistake("$file: missing blank line after copyright header");
|
|
}
|
|
if ($ARGV =~ /priv\.h$/) {
|
|
$state = $STATE_PRIV_START;
|
|
} else {
|
|
$state = $STATE_GUARD_START;
|
|
}
|
|
} elsif ($state == $STATE_PRIV_START) {
|
|
if (/^$/) {
|
|
&mistake("$file: too many blank lines after coyright header");
|
|
} elsif (/#ifndef\s(.*ALLOW.*)/) {
|
|
$ifdefpriv = $1;
|
|
$state = $STATE_PRIV_ERROR;
|
|
} else {
|
|
&mistake("$file: missing '#ifndef SYMBOL_ALLOW'");
|
|
}
|
|
} elsif ($state == $STATE_PRIV_ERROR) {
|
|
if (/# error ".*"$/) {
|
|
$state = $STATE_PRIV_END;
|
|
} else {
|
|
&mistake("$file: missing '#error ...priv allow...'");
|
|
}
|
|
} elsif ($state == $STATE_PRIV_END) {
|
|
if (m,#endif /\* $ifdefpriv \*/,) {
|
|
$state = $STATE_PRIV_BLANK;
|
|
} else {
|
|
&mistake("$file: missing '#endif /* $ifdefpriv */'");
|
|
}
|
|
} elsif ($state == $STATE_PRIV_BLANK) {
|
|
if (! /^$/) {
|
|
&mistake("$file: missing blank line after priv guard");
|
|
}
|
|
$state = $STATE_GUARD_START;
|
|
} elsif ($state == $STATE_GUARD_START) {
|
|
if (/^$/) {
|
|
&mistake("$file: too many blank lines after coyright header");
|
|
} elsif (/#ifndef\s(.*)$/) {
|
|
$ifdef = $1;
|
|
$state = $STATE_GUARD_DEFINE;
|
|
} else {
|
|
&mistake("$file: missing '#ifndef SYMBOL'");
|
|
}
|
|
} elsif ($state == $STATE_GUARD_DEFINE) {
|
|
if (/# define $ifdef$/) {
|
|
$state = $STATE_GUARD_END;
|
|
} else {
|
|
&mistake("$file: missing '# define $ifdef'");
|
|
}
|
|
} elsif ($state == $STATE_GUARD_END) {
|
|
if (m,#endif /\* $ifdef \*/$,) {
|
|
$state = $STATE_EOF;
|
|
}
|
|
} elsif ($state == $STATE_EOF) {
|
|
die "$file: unexpected content after '#endif /* $ifdef */'";
|
|
} else {
|
|
die "$file: unexpected state $state";
|
|
}
|
|
}
|
|
exit $ret;
|