check_consts.sh 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #!/usr/bin/env bash
  2. temps="./check_const_list.sh"
  3. if [ "$1" == "clean" ] ; then
  4. echo Removing $temps
  5. rm -f $temps
  6. exit
  7. fi
  8. if [ "$1" == "verbose" ] ; then
  9. verbose=1
  10. shift
  11. else
  12. verbose=0
  13. fi
  14. os=`uname -s`
  15. if [ "$os" == "NetBSD" ] ; then
  16. needgsed=1
  17. fi
  18. SED=sed
  19. if [ $needgsed -eq 1 ] ; then
  20. SED=
  21. SED=`which gsed`
  22. if [ "$SED" == "" ] ; then
  23. echo "GNU sed not found, this script might not work optimally"
  24. SED=sed
  25. fi
  26. fi
  27. for file in $@ ; do
  28. echo "Looking for constants in \"$file\""
  29. $SED -n "s:.*[[:space:]]\([a-zA-Z_][a-zA-Z_0-9]*\)[[:space:]]*=[[:space:]]*\([-+]*[0-9][xX]*[0-9+-\*/]*\)[[:space:]]*;.*:test_const \1 \2:p" $file > check_const_list.sh
  30. test_const ()
  31. {
  32. name=$1
  33. value=$2
  34. if [ $verbose -eq 1 ]; then
  35. echo "Looking for $name, should be $value"
  36. fi
  37. ok=0
  38. matchvalue=
  39. source=
  40. namelist=`grep -i -n -r "#[[:space:]]*define[[:space:]]*$name[[:space:]]" /usr/include`
  41. # Remove comments
  42. namelist=${namelist//\/\**/}
  43. # Remove trailing spaces
  44. namelist=${namelist%%[[:space:]]}
  45. if [ -n "$namelist" ]; then
  46. source=${namelist//#define*/}
  47. if [ $verbose -eq 1 ] ; then
  48. echo "Exact match found: \"$namelist\""
  49. fi
  50. matchvalue=`echo ${namelist} |$SED "s|.*#[[:space:]]*define[[:space:]]*$name[[:space:]]*||I" `
  51. if [ $verbose -eq 1 ] ; then
  52. echo "matchvalue=\"$matchvalue\""
  53. fi
  54. matchvalue="${matchvalue#"${matchvalue%%[![:space:]]*}"}"
  55. else
  56. if [ $verbose -eq 1 ] ; then
  57. echo "$name not found"
  58. fi
  59. namelist2=`grep -i $name -r -n /usr/include`
  60. if [ -n "$namelist2" ]; then
  61. echo "Match found: \"$namelist2\""
  62. source=${namelist2//:*/}
  63. matchvalue=${namelist//#define*$name2/}
  64. fi
  65. fi
  66. if [ "$matchvalue" == "$value" ] ; then
  67. echo "OK: Constant \"$name\" value OK: \"$value\" location \"$source\""
  68. else
  69. if [ "$source" != "" ] ; then
  70. echo "Warning: Constant \"$name\" has value \"$value\" inside \"$file\" but \"$matchvalue\" location \"$source\""
  71. else
  72. echo "Warning: Constant \"$name\" has value \"$value\" inside \"$file\" but \"$matchvalue\" in system headers"
  73. fi
  74. fi
  75. }
  76. set -f
  77. . ./check_const_list.sh
  78. done