1#!/usr/bin/perl -w
2
3$infile = "stdin";
4
5if ($ARGV[0]) {
6  $infile = $ARGV[0];
7}
8
9$infile =~ m"^([^.]+)"o;
10
11# $fpref = $1;
12$allsrc = "";
13
14open (IN, $infile) || die "Cannot open input file $infile";
15
16while (<IN>) {
17  $allsrc .= $_;
18}
19
20close IN;
21
22print "\n";
23print "============================\n";
24print ".. File $infile\n";
25print "============================\n";
26
27################
28# typedef struct
29################
30
31@presrc = split (/^typedef\s+struct\s+\S*\s*[{][^}]+[}]\s*[^;]+;\s*$/osm, $allsrc);
32$ip = 0;
33$dalias="";
34
35while ($allsrc =~ /^typedef\s+struct\s+(\S*)\s*[{][^}]+[}]\s*([^;]+);\s*(\#define\s+(\S+)\s+\S+[*])?$/gosm) {
36  $dnam = $1;
37  $dalias = $2;
38  $ddefine = $4;
39  @anam = (split(/[ \t,*]+/, $dalias));
40  if (defined($ddefine)) {
41    push @anam, $ddefine;
42  }
43  if (!defined($dnam) || $dnam eq "") {
44    $dnam = $anam[$#anam];
45  }
46  $presrc = $presrc[$ip];
47
48  if ($presrc =~ /[\n][\/][*]\s+[@]data[static]*\s+(\S+)([^\/*][^*]*[*]+)*[\/]\s*$/osm) {
49    $hnam = $1;
50    $ok = 0;
51    foreach $nam (@anam) {
52      if ($hnam eq $nam) {$ok = 1}
53    }
54    if (!$ok && $dnam ne $hnam) {
55      print "bad docheader for $hnam precedes $dnam\n";
56    }
57  }
58  else {
59    print "bad or missing docheader for $dnam\n";
60  }
61  $ip++;
62}
63
64################
65# typedef enum
66################
67
68@presrc = split (/^typedef\s+enum\s+\S*\s*[{][^}]+[}]\s*[^;]+;\s*$/osm, $allsrc);
69$ip = 0;
70$dalias="";
71
72while ($allsrc =~ /^typedef\s+enum\s+(\S*)\s*[{][^}]+[}]\s*([^;]+);\s*?$/gosm) {
73  $ealias = $1;
74  $enam = $2;
75  if (!defined($enam) || $enam eq "") {
76    $enam = $ealias;
77  }
78  @anam = (split(/[ \t,*]+/, $enam));
79
80  $presrc = $presrc[$ip];
81
82  if ($presrc =~ /[\n][\/][*]\s+[@]enum[static]*\s+(\S+)([^\/*][^*]*[*]+)*[\/]\s*$/osm) {
83    $hnam = $1;
84    $ok = 0;
85    foreach $nam (@anam) {
86      if ($hnam eq $nam) {$ok = 1}
87    }
88    if (!$ok && $enam ne $hnam) {
89      print "bad enumheader for $hnam precedes $enam\n";
90    }
91  }
92  else {
93    print "bad enumheader bad or missing docheader for $enam\n";
94  }
95  $ip++;
96}
97
98################
99# const
100################
101
102@presrc = split (/^[sc][tatic ]*onst\s+[^*=;\(\)]*\s[^*]\S+\s*[=][^;]+;\s*?$/osm, $allsrc);
103$ip = 0;
104$dalias="";
105
106while ($allsrc =~ /^[sc][tatic ]*onst\s+[^*=;\(\)]*\s([^*]\S+)\s*[=]([^;]+);\s*?$/gosm) {
107  $cnam = $1;
108  $cnam =~ s/[\[][0-9]*[\]]$//;
109  if (!defined($cnam) || $cnam eq "") {
110    $cnam = "unknown";
111  }
112
113  $presrc = $presrc[$ip];
114
115#  print "PRESRC $ip\n$presrc\n====================\n";
116  if ($presrc =~ /[\n][\/][*]\s+[@]const(static)?\s+(\S+)([^\/*][^*]*[*]+)*[\/]\s*$/osm) {
117    $hnam = $2;
118#    if ($cnam ne $hnam) {
119#      print "bad constheader for $hnam precedes $cnam\n";
120#    }
121  }
122  elsif ($presrc =~ /^\s*$/) {}
123  else {
124    print "bad constheader bad or missing docheader for $cnam\n";
125  }
126  $ip++;
127}
128