1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0
3#
4# checkdeclares: find struct declared more than once
5#
6# Copyright 2021 Wan Jiabing<wanjiabing@vivo.com>
7# Inspired by checkincludes.pl
8#
9# This script checks for duplicate struct declares.
10# Note that this will not take into consideration macros so
11# you should run this only if you know you do have real dups
12# and do not have them under #ifdef's.
13# You could also just review the results.
14
15use strict;
16
17sub usage {
18	print "Usage: checkdeclares.pl file1.h ...\n";
19	print "Warns of struct declaration duplicates\n";
20	exit 1;
21}
22
23if ($#ARGV < 0) {
24	usage();
25}
26
27my $dup_counter = 0;
28
29foreach my $file (@ARGV) {
30	open(my $f, '<', $file)
31	    or die "Cannot open $file: $!.\n";
32
33	my %declaredstructs = ();
34
35	while (<$f>) {
36		if (m/^\s*struct\s*(\w*);$/o) {
37			++$declaredstructs{$1};
38		}
39	}
40
41	close($f);
42
43	foreach my $structname (keys %declaredstructs) {
44		if ($declaredstructs{$structname} > 1) {
45			print "$file: struct $structname is declared more than once.\n";
46			++$dup_counter;
47		}
48	}
49}
50
51if ($dup_counter == 0) {
52	print "No duplicate struct declares found.\n";
53}
54