check_errno.sh 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #!/usr/bin/env bash
  2. # Small script to test fpc to system error numbers
  3. addtoerrno=0
  4. errnonew=./errno-new.inc
  5. temps="check_errno_list.sh check_reverse_errno_list.sh test-errno* $errnonew"
  6. if [ "$1" == "clean" ] ; then
  7. echo "Deleting $temps"
  8. rm -f $temps
  9. exit
  10. fi
  11. if [ "$1" == "verbose" ] ; then
  12. verbose=1
  13. echo "Being verbose"
  14. shift
  15. else
  16. verbose=0
  17. fi
  18. if [ "$1" == "addall" ] ; then
  19. addall=1
  20. echo "Adding all entries to errno-new.inc"
  21. shift
  22. else
  23. addall=0
  24. fi
  25. # Location of error number in system header
  26. errno_headers="/usr/include/asm-generic/errno-base.h /usr/include/asm-generic/errno.h"
  27. if [ "$1" != "" ] ; then
  28. errno_include=$1
  29. echo "Using $errno_include file"
  30. else
  31. errno_include=./errno.inc
  32. fi
  33. # Sustitution made to pass from fpc syscall number
  34. # to system define
  35. fpc_errno_prefix=ESysE
  36. errno_prefix=E
  37. # Test C file to grab all loaded headers
  38. cat > test-errno.c <<EOF
  39. #include <errno.h>
  40. int
  41. dummy ()
  42. {
  43. return 0;
  44. }
  45. EOF
  46. # Default C compiler is gcc
  47. # Can be overwritten by setting CC variable
  48. # But I don't know if other compilers also generate
  49. # .i files with --save-temps option
  50. if [ "$CC" == "" ] ; then
  51. CC=gcc
  52. fi
  53. # Use gcc with --save-temps option to create .i file
  54. $CC --save-temps -c ./test-errno.c
  55. # list of errno.h headers listed
  56. errno_headers_CC=` sed -n "s:.*\"\(.*\.h\)\".*:\1:p" test-errno.i |sort | uniq`
  57. echo "Headers found are \"$errno_headers_CC\""
  58. if [ "$errno_headers_CC" != "" ] ; then
  59. errno_headers="$errno_headers_CC"
  60. fi
  61. # You should only need to change the variables above
  62. sed -n "s:^[[:space:]]*${fpc_errno_prefix}\\([_a-zA-Z0-9]*\\)[[:space:]]*=[[:space:]]*\\([0-9][0-9]*\\).*:check_errno_number ${errno_prefix}\1 \2:p" ${errno_include} > check_errno_list.sh
  63. sed -n "s:#define[[:space:]]*${errno_prefix}\\([_a-zA-Z0-9]*\\)[[:space:]][[:space:]]*\\(-*[0-9A-Za-z_]*\\)[[:space:]]*\(.*\):check_reverse_errno_number ${fpc_errno_prefix}\1 \2 \"\3\":p" ${errno_headers} > check_reverse_errno_list.sh
  64. function rpad {
  65. word="$1"
  66. while [ ${#word} -lt $2 ]; do
  67. word="$word$3";
  68. done;
  69. echo "$word";
  70. }
  71. function compile_errno ()
  72. {
  73. errname=$1
  74. errvalue=$2
  75. # Test C file to grab all loaded headers
  76. cat > test-errno.c <<EOF
  77. #include <errno.h>
  78. #include <stdio.h>
  79. int
  80. main ()
  81. {
  82. printf ("$errname=%d\n",$errname);
  83. return 0;
  84. }
  85. EOF
  86. $CC -o ./test-errno ./test-errno.c
  87. compiledvalue=`./test-errno`
  88. if [ "$compiledvalue" == "$errname=$errvalue" ] ; then
  89. if [ $verbose -ne 0 ]; then
  90. echo "GCC reports $compiledvalue OK"
  91. fi
  92. else
  93. echo "GCC reports $compiledvalue, but $errvalue is expected"
  94. fi
  95. }
  96. function check_errno_number ()
  97. {
  98. sys=$1
  99. value=$2
  100. if [ $verbose -ne 0 ] ; then
  101. echo Testing $sys value $value
  102. fi
  103. # Remember value of this constant
  104. eval ${sys}=${value}
  105. compile_errno $sys $value
  106. found=`sed -n "/#define[[:space:]][[:space:]]*${sys}[^A-Za-z0-9_]/p" ${errno_headers}`
  107. val=`sed -n "s:#define[[:space:]][[:space:]]*${sys}[^A-Za-z0-9_][^A-Za-z0-9_]*\([0-9]*\).*:\1:p" ${errno_headers}`
  108. extval=`sed -n "s:#define[[:space:]][[:space:]]*${sys}[^A-Za-z0-9_][^A-Za-z0-9_]*\([0-9A-Za-z_]*\).*:\1:p" ${errno_headers}`
  109. if [ $verbose -ne 0 ] ; then
  110. echo Test for $sys found \"${found}\" \"${value}\" \"${val}\"
  111. fi
  112. if [ "${val}" == "${value}" ] ; then
  113. if [ $verbose -ne 0 ] ; then
  114. echo ${sys} value ${val} is correct
  115. fi
  116. else
  117. if [ $verbose -ne 0 ] ; then
  118. echo "${sys} val=\"$val\", extval=\"$extval\""
  119. fi
  120. if [ "${val}" == "" ] ; then
  121. foundvalue=`sed -n "/#define.*[^A-Za-z0-9_]${value}$/p" ${errno_headers}`
  122. if [ "${foundvalue}" == "" ] ; then
  123. foundvalue=`sed -n "s:\/\* ${value} is compa: ${value} is compa:p" ${errno_headers}`
  124. fi
  125. fi
  126. if [ "$extval" != "$val" ] ; then
  127. eval indirectval=\$$extval
  128. echo "indirectval =\"$indirectval\" for \"$extval\""
  129. if [ "$indirectval" != "$value" ] ; then
  130. echo problem for ${sys} expected ${value}, line is \"${found}\", val found is \"${indirectval}\"
  131. else
  132. echo "$sys is defined as $extval which is $indirectval as expected $value"
  133. fi
  134. else
  135. echo "problem for ${sys} expected ${value}, line is \"${found}\", val found is \"${val}\""
  136. fi
  137. fi
  138. }
  139. function write_errno_new_head ()
  140. {
  141. echo "{ File generated by $0" > $errnonew
  142. uname_info=`uname -s -r -m`
  143. echo " generated on \"$uname_info\" machine" >> $errnonew
  144. echo "List of missing system error number found in" >> $errnonew
  145. echo "$errno_headers" >> $errnonew
  146. echo "}" >> $errnonew
  147. }
  148. function check_reverse_errno_number ()
  149. {
  150. errname=$1
  151. errvalue=$2
  152. rpaderrname=$(rpad $errname 20 " ")
  153. if ! [[ "$errvalue" =~ ^[0-9]+$ ]] ; then
  154. eval errvalue=\$$errvalue
  155. fi
  156. printf -v padd "%s = %4d" "$rpaderrname" $errvalue
  157. found=`grep -i -w $1 ${errno_include}`
  158. comment="$3"
  159. comment=${comment##\/\*}
  160. comment=${comment%%\*\/}
  161. if [ "${found}" == "" ] ; then
  162. echo "Error ${errname}, value ${errvalue}, not in ${errno_include} file"
  163. if [ $addtoerrno -eq 0 ] ; then
  164. addtoerrno=1
  165. write_errno_new_head
  166. fi
  167. echo " $padd; { $comment }" >> $errnonew
  168. else
  169. if [ $addall -eq 1 ] ; then
  170. if [ $addtoerrno -eq 0 ] ; then
  171. addtoerrno=1
  172. write_errno_new_head
  173. fi
  174. echo " $padd; { $comment }" >> $errnonew
  175. fi
  176. fi
  177. }
  178. set -f
  179. echo "Checking all entries of ${errno_include} file"
  180. source ./check_errno_list.sh
  181. echo "Checking all defines from \"$errno_header\""
  182. source ./check_reverse_errno_list.sh
  183. if [ $addtoerrno -eq 1 ] ; then
  184. echo " Missing error number found"
  185. echo " New values are in \"$errnonew\"
  186. echo You might want to add these lines to \"$errno_include\""
  187. fi