1#!/usr/bin/env bash
2
3
4temps="./check_const_list.sh"
5
6if [ "$1" == "clean" ] ; then
7  echo Removing $temps
8  rm -f $temps
9  exit
10fi
11
12if [ "$1" == "verbose" ] ; then
13  verbose=1
14  shift
15else
16  verbose=0
17fi
18
19os=`uname -s`
20
21if [ "$os" == "NetBSD" ] ; then
22  needgsed=1
23else
24  needgsed=0
25fi
26
27SED=sed
28
29if [ $needgsed -eq 1 ] ; then
30  SED=
31  SED=`which gsed`
32  if [ "$SED" == "" ] ; then
33    echo "GNU sed not found, this script might not work optimally"
34    SED=sed
35  fi
36fi
37
38
39for file in $@ ; do
40
41echo "Looking for constants in \"$file\""
42$SED  -n -e "s:.*[[:space:]]\([a-zA-Z_][a-zA-Z_0-9]*\)[[:space:]]*=[[:space:]]*\([&%$]*\)\([-+]*[0-9][xX]*[-0-9+[:space:]]*\)[[:space:]]*;.*:test_const \1 \"\3\" \"\2\" :p" $file  >  check_const_list.sh
43
44test_const ()
45{
46name=$1
47value="$2"
48prefix="$3"
49if [[ "x$prefix" = "x\$" ]] ; then
50  if [ $verbose -eq 1 ]; then
51    echo "Hexadecimal value"
52  fi
53  value=0x$value
54fi
55if [[ "x$prefix" = "x&" ]] ; then
56  if [ $verbose -eq 1 ]; then
57    echo "Octal value"
58  fi
59  if ! [ "${value:0:1}" == "0" ] ; then
60    value=0$value
61  fi
62fi
63if [[ "x$prefix" = "x%" ]] ; then
64  if [ $verbose -eq 1 ]; then
65    echo "Binary value"
66  fi
67  value=0b$value
68fi
69if [ $verbose -eq 1 ]; then
70  echo "Looking for $name, should be $value"
71fi
72ok=0
73matchvalue=
74source=
75namelist=`grep -i -n -r "#[[:space:]]*define[[:space:]]*$name[[:space:]]" /usr/include`
76# Remove comments
77namelist=${namelist//\/\**/}
78# Remove trailing spaces
79namelist=${namelist%%[[:space:]]}
80if [ -n "$namelist" ]; then
81  source=${namelist//#define*/}
82  if [ $verbose -eq 1 ] ; then
83    echo "Exact match found: \"$namelist\""
84  fi
85  matchvalue=`echo ${namelist} |$SED "s|.*#[[:space:]]*define[[:space:]]*$name[[:space:]]*||I" `
86  if [ $verbose -eq 1 ] ; then
87    echo "matchvalue=\"$matchvalue\""
88  fi
89  matchvalue="${matchvalue#"${matchvalue%%[![:space:]]*}"}"
90else
91  if [ $verbose -eq 1 ] ; then
92    echo "$name not found"
93  fi
94  namelist2=`grep -i $name -r -n /usr/include`
95  if [ -n "$namelist2" ]; then
96    echo "Match found: \"$namelist2\""
97    source=${namelist2//:*/}
98    matchvalue=${namelist//#define*$name2/}
99  fi
100fi
101if [ "$matchvalue" == "$value" ] ; then
102    echo "OK:      Constant \"$name\" value OK: \"$value\" location \"$source\""
103else
104  if [ "$source" != "" ] ; then
105    echo "Warning: Constant \"$name\" has value \"$value\" inside \"$file\" but \"$matchvalue\" location \"$source\""
106  else
107    echo "Warning: Constant \"$name\" has value \"$value\" inside \"$file\" but \"$matchvalue\" in system headers"
108  fi
109fi
110}
111
112set -f
113
114. ./check_const_list.sh
115
116done
117
118