summaryrefslogtreecommitdiffstats
path: root/bin/checkposix
blob: 2cbd62b22b87bfa6a191ccf0afdd28efcbec452c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/local/bin/perl -w
#
# Copyright by the Board of Trustees of the University of Illinois.
# All rights reserved.
#
# This file is part of HDF5.  The full HDF5 copyright notice, including
# terms governing use, modification, and redistribution, is contained in
# the files COPYING and Copyright.html.  COPYING can be found at the root
# of the source code distribution tree; Copyright.html can be found at the
# root level of an installed copy of the electronic HDF5 document set and
# is linked from the top-level documents page.  It can also be found at
# http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html.  If you do not have
# access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu.
#
require 5.003;

#
# Robb Matzke, matzke@llnl.gov
# 30 Aug 1997
#
# Purpose: Given the names of C source files this script will print the
#	   file name, line number, and function name of any function that
#	   doesn't begin with the letter `h' or `H' as stipulated by the
#	   HDF5 programming style guide.
#
#	   Emacs users can run this script as the compile command and
#	   use `next-error' (usually bound to M-`) to find each name
#	   violation.
#

while (<>) {

   # Get rid of comments by removing the inside part.
   s|/\*.*?\*/||g;
   if ($in_comment) {
      if (/\*\//) {
         s|.*?\*/||;
         $in_comment = 0;
      } else {
         $_="\n";
      }
   } elsif (m|/\*|) {
      s|/\*.*||;
      $in_comment = 1;
   }

   # Get rid of string constants if they begin and end on this line.
   s/([\'\"])([^\1]|\\\1)*?\1/$1$1/g;

   # Get rid of preprocessor directives
   s/^\#.*//;

   # Now find all function calls on this line
   while (($name)=/\b([a-gi-z_A-GI-Z]\w*)\s*\(/) {
      $_ = $';
      
      # Ignore C statements that look sort of like function
      # calls.
      next if $name =~ /^(if|for|return|sizeof|switch|while|void)$/;

      # Ignore things that get misdetected because of the simplified
      # parsing that takes place here.
      next if $name =~ /^int$/;

      # These are really HDF5 functions/macros even though they don't
      # start with `h' or `H'.
      next if $name =~ /^FUNC_(ENTER|LEAVE)(_INIT)?$/;
      next if $name =~ /^U?INT(8|16|32|64)(ENCODE|DECODE)$/;
      next if $name =~ /^(MIN3?|MAX3?|NELMTS|BOUND|CONSTR)$/;
      next if $name =~ /^addr_defined$/;

      # These functions/macros are exempt.
      next if $name =~ /^(assert|main|[fs]?printf|va_(start|arg|end))$/;

      print "$ARGV:$.: $name\n";
   }

} continue {
   close ARGV if eof;
}