check_errnostr.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!/usr/bin/env bash
  2. # Script to check for errno strings in errnostr.inc
  3. # compared to constant values in errno.inc
  4. temps="check_errnostr_list.sh testerrnostr* errnostrlst.inc"
  5. if [ "$1" == "clean" ] ; then
  6. echo Removing $temps
  7. rm -f $temps
  8. exit
  9. fi
  10. # Use gsed if present
  11. SED=`which gsed`
  12. if [ "$SED" == "" ] ; then
  13. SED=sed
  14. fi
  15. $SED -n "s:ESysE\(.*\)[[:space:]]*=[[:space:]]*\([[:space:]0-9]*\);: test_errnostr E\1 \2 :p" errno.inc | \
  16. $SED "s:':'':g" > check_errnostr_list.sh
  17. if [ "$1" == "verbose" ] ; then
  18. verbose=1
  19. fpcopt=-gl
  20. else
  21. verbose=0
  22. fpcopt=
  23. fi
  24. # Reverse 'error string', { ENUMBER }
  25. # to ENUMBER string
  26. $SED -n -e "s|[^']*\('.*'\)[[:space:]]*,*[[:space:]]*{[[:space:]]*\(E[A-Za-z_0-9]*\).*|(Number : ESys\2; NumberStr : '\2'; Str : \1),|p" errnostr.inc > errnostrlst.inc
  27. # Use temp directory to avoid
  28. # re-compilation of system unit
  29. mkdir .testtmp
  30. cd .testtmp
  31. # Free Pascal source including
  32. # errnostr.inc file
  33. # to test if strings are correct
  34. cat > testerrnostr.pp <<EOF
  35. uses
  36. Dos;
  37. {\$i errnostr.inc}
  38. {\$i errno.inc}
  39. type
  40. TNumberString = record
  41. Number : longint;
  42. NumberStr : String;
  43. Str : String;
  44. end;
  45. const
  46. ErrStringArray :
  47. Array [0..sys_errn] of TNumberString= (
  48. (Number :0; NumberStr : '0' ; str : ''),
  49. {\$i errnostrlst.inc}
  50. (Number :-1; NumberStr : ''; str : ''));
  51. var
  52. ErrorName : string;
  53. value,i,j : longint;
  54. verbose : boolean;
  55. str : string;
  56. function Quote (s : string) : string;
  57. var
  58. i : longint;
  59. begin
  60. Quote:='';
  61. for i:=1 to length(s) do
  62. if (s[i]='''') then
  63. Quote:=quote+''''''
  64. else
  65. Quote:=quote+s[i];
  66. end;
  67. begin
  68. if (paramcount=1) and (paramstr(1)='--write') then
  69. begin
  70. for i:=0 to sys_errn-1 do
  71. for j:=0 to sys_errn do
  72. if (ErrStringArray[j].Number=i) then
  73. with ErrStringArray[j] do
  74. writeln(' ''',Quote(Str), ''' { ',NumberStr, ' ',Number,' }');
  75. exit;
  76. end;
  77. if paramcount < 3 then
  78. begin
  79. writeln('Usage: testerrnostr ENAME value "Comment"');
  80. exit;
  81. end;
  82. val(paramstr(2),value);
  83. if (value>=0) and (value<sys_errn) then
  84. str:=sys_errlist[value]
  85. else
  86. str:='';
  87. verbose:=(GetEnv('verbose')<>'0');
  88. while (pos('''',str)>0) do
  89. delete(str,pos('''',str),1);
  90. if pos(str,paramstr(3))>0 then
  91. begin
  92. if verbose then
  93. writeln('String for ',paramstr(1),' is "',str,'" contained in ',paramstr(3));
  94. end
  95. else if (value>=sys_errn) then
  96. writeln('String for ',paramstr(1),' index ',value,'not in errnostr.inc, comment is ',paramstr(3))
  97. else
  98. begin
  99. write('String for ',paramstr(1),' index ',value, ' is "',sys_errlist[value],'"');
  100. writeln(', comment in errno.inc is ',paramstr(3));
  101. end;
  102. end.
  103. EOF
  104. fpc $fpcopt -Fi.. -o../testerrnostr ./testerrnostr.pp
  105. res=$?
  106. cd ..
  107. if [ $res -ne 0 ] ; then
  108. echo "Compilation of testerrnostr.pp failed"
  109. exit
  110. else
  111. rm -Rf .testtmp
  112. fi
  113. export verbose
  114. function test_errnostr ()
  115. {
  116. if [ $verbose -eq 1 ] ; then
  117. echo "Testing errno \"$1\""
  118. fi
  119. errno=$1
  120. shift
  121. value=$1
  122. shift
  123. comment="$@"
  124. comment2=`grep $errno errnostrlst.inc`
  125. ./testerrnostr $errno $value "$comment"
  126. }
  127. . ./check_errnostr_list.sh
  128. # ./testerrnostr --write