162306a36Sopenharmony_ci#!/usr/bin/env perl
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# checkdeclares: find struct declared more than once
562306a36Sopenharmony_ci#
662306a36Sopenharmony_ci# Copyright 2021 Wan Jiabing<wanjiabing@vivo.com>
762306a36Sopenharmony_ci# Inspired by checkincludes.pl
862306a36Sopenharmony_ci#
962306a36Sopenharmony_ci# This script checks for duplicate struct declares.
1062306a36Sopenharmony_ci# Note that this will not take into consideration macros so
1162306a36Sopenharmony_ci# you should run this only if you know you do have real dups
1262306a36Sopenharmony_ci# and do not have them under #ifdef's.
1362306a36Sopenharmony_ci# You could also just review the results.
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciuse strict;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cisub usage {
1862306a36Sopenharmony_ci	print "Usage: checkdeclares.pl file1.h ...\n";
1962306a36Sopenharmony_ci	print "Warns of struct declaration duplicates\n";
2062306a36Sopenharmony_ci	exit 1;
2162306a36Sopenharmony_ci}
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ciif ($#ARGV < 0) {
2462306a36Sopenharmony_ci	usage();
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cimy $dup_counter = 0;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciforeach my $file (@ARGV) {
3062306a36Sopenharmony_ci	open(my $f, '<', $file)
3162306a36Sopenharmony_ci	    or die "Cannot open $file: $!.\n";
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	my %declaredstructs = ();
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	while (<$f>) {
3662306a36Sopenharmony_ci		if (m/^\s*struct\s*(\w*);$/o) {
3762306a36Sopenharmony_ci			++$declaredstructs{$1};
3862306a36Sopenharmony_ci		}
3962306a36Sopenharmony_ci	}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	close($f);
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	foreach my $structname (keys %declaredstructs) {
4462306a36Sopenharmony_ci		if ($declaredstructs{$structname} > 1) {
4562306a36Sopenharmony_ci			print "$file: struct $structname is declared more than once.\n";
4662306a36Sopenharmony_ci			++$dup_counter;
4762306a36Sopenharmony_ci		}
4862306a36Sopenharmony_ci	}
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ciif ($dup_counter == 0) {
5262306a36Sopenharmony_ci	print "No duplicate struct declares found.\n";
5362306a36Sopenharmony_ci}
54