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