tindex.pp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. const
  2. err: boolean = false;
  3. var
  4. a, b: array[0..515] of byte;
  5. bw: array[0..258] of word absolute b;
  6. bd: array[0..129] of dword absolute b;
  7. procedure test_index;
  8. type
  9. pword = ^word;
  10. pdword = ^cardinal;
  11. var
  12. i, j, k: longint;
  13. index: longint;
  14. l: dword;
  15. begin
  16. for i := 0 to 512 do
  17. a[i] := byte(i);
  18. for i := 0 to 256 do
  19. for j := 0 to 31 do
  20. for k := 0 to 31 do
  21. begin
  22. fillchar(b,sizeof(b),0);
  23. move(a[j],b[k+4],i);
  24. { for i = 256, every element appears in the array }
  25. if (byte(i)>0) then
  26. index:=i-1
  27. else
  28. index:=0;
  29. if indexbyte(b[k+4],index,a[j+i])<>-1 then
  30. begin
  31. writeln(indexbyte(b[k+4],index,a[j+1]),' <> -1');
  32. writeln('indexbyte error 1 for (',i,',',j,',',k,')');
  33. halt(1);
  34. end;
  35. if b[k+4]=0 then
  36. index:=0
  37. else if (b[k+4]+i>=256) then
  38. index:=256-b[k+4]
  39. else
  40. index:=i;
  41. if indexbyte(b[k+4],i+1,0)<>index then
  42. begin
  43. writeln(indexbyte(b[k+4],i+1,0),' <> ',index);
  44. writeln('indexbyte error 2 for (',i,',',j,',',k,')');
  45. halt(2);
  46. end;
  47. {same for length=-1}
  48. if indexbyte(b[k+4],-1,0)<>index then
  49. begin
  50. writeln(indexbyte(b[k+4],-1,0),' <> ',index);
  51. writeln('indexbyte error 2a for (',i,',',j,',',k,')');
  52. halt(22);
  53. end;
  54. if indexbyte(b[k+4],i,b[k+4+i-1])<>i-1 then
  55. begin
  56. writeln('indexbyte error 3 for (',i,',',j,',',k,')');
  57. halt(3);
  58. end;
  59. {same for length=-1}
  60. if i<>0 then // previous test will be no-op when i=0
  61. if indexbyte(b[k+4],-1,b[k+4+i-1])<>i-1 then
  62. begin
  63. writeln('indexbyte error 3a for (',i,',',j,',',k,')');
  64. halt(23);
  65. end;
  66. if (i<1) then
  67. index:=-1
  68. else
  69. index:=i shr 1;
  70. if indexbyte(b[k+4],i,b[k+4+i shr 1])<>index then
  71. begin
  72. writeln(indexbyte(b[k+4],i,b[k+4+i shr 1]),' <> ',index);
  73. writeln('indexbyte error 4 for (',i,',',j,',',k,')');
  74. halt(4);
  75. end;
  76. {same for length=-1}
  77. if i<>0 then // previous test will be no-op when i=0
  78. if indexbyte(b[k+4],-1,b[k+4+i shr 1])<>index then
  79. begin
  80. writeln(indexbyte(b[k+4],-1,b[k+4+i shr 1]),' <> ',index);
  81. writeln('indexbyte error 4a for (',i,',',j,',',k,')');
  82. halt(24);
  83. end;
  84. if (i=0) then
  85. index:=-1
  86. else
  87. index:=0;
  88. if indexbyte(b[k+4],i,b[k+4])<>index then
  89. begin
  90. writeln('indexbyte error 5 for (',i,',',j,',',k,')');
  91. halt(5);
  92. end;
  93. {same for length=-1}
  94. if i<>0 then
  95. if indexbyte(b[k+4],-1,b[k+4])<>index then
  96. begin
  97. writeln('indexbyte error 5a for (',i,',',j,',',k,')');
  98. halt(25);
  99. end;
  100. if indexword(b[k+4],i shr 1,0)<>-1 then
  101. begin
  102. writeln('indexword error 6 for (',i,',',j,',',k,')');
  103. halt(6);
  104. end;
  105. if (unaligned(pword(@b[k+4])^)=0) then
  106. index:=0
  107. else if (i=0) then
  108. index:=-1
  109. else if (b[k+4+i-1] = 0) and
  110. odd(i) then
  111. index:=((i+1) shr 1)-1
  112. else
  113. index:=((i+1) shr 1);
  114. if indexword(b[k+4],(i+1) shr 1 + 1,0)<>index then
  115. begin
  116. writeln(indexword(b[k+4],(i+1) shr 1 + 1,0),' <> ',index);
  117. writeln('indexword error 7 for (',i,',',j,',',k,')');
  118. halt(7);
  119. end;
  120. if (i=0) then
  121. index:=0
  122. else
  123. index:=i shr 1;
  124. l:=unaligned(pword(@(b[k+4+(i and not 1)]))^);
  125. if indexword(b[k+4],i shr 1+1,l)<>index then
  126. begin
  127. writeln(indexword(b[k+4],((i and not 1)+1) shr 1+1,l),' <> ',index);
  128. writeln('indexword error 8 for (',i,',',j,',',k,')');
  129. halt(8);
  130. end;
  131. l:=unaligned(pword(@(b[k+4+((i shr 2) and not 1)-2]))^);
  132. if (i>=8) then
  133. index:=((i shr 2) and not 1) shr 1 - 1
  134. else
  135. index:=-1;
  136. if indexword(b[k+4],i shr 1,l)<>index then
  137. begin
  138. writeln(indexword(b[k+4],i shr 1,l),' <> ',index);
  139. writeln('indexword error 9 for (',i,',',j,',',k,')');
  140. halt(9);
  141. end;
  142. l:=unaligned(pword(@(b[k+4]))^);
  143. if (i<2) then
  144. index:=-1
  145. else
  146. index:=0;
  147. if indexword(b[k+4],i shr 1,l)<>index then
  148. begin
  149. writeln('indexword error 10 for (',i,',',j,',',k,')');
  150. halt(10);
  151. end;
  152. if (unaligned(pdword(@b[k+4])^)=0) then
  153. index:=0
  154. else if (i=0) then
  155. index:=-1
  156. else if (b[k+4+i-1] = 0) and
  157. ((i mod 4) = 1) then
  158. index:=((i+3) shr 2)-1
  159. else
  160. index:=((i+3) shr 2);
  161. if indexdword(b[k+4],(i+3) shr 2 + 1,0)<>index then
  162. begin
  163. writeln(indexdword(b[k+4],(i+3) shr 2 + 1,0),' <> ',index);
  164. writeln('indexdword error 11 for (',i,',',j,',',k,')');
  165. halt(11);
  166. end;
  167. if (i=0) then
  168. index:=0
  169. else
  170. index:=i shr 2;
  171. l:=unaligned(pdword(@(b[k+4+(i and not 3)]))^);
  172. if indexdword(b[k+4],i shr 2+1,l)<>index then
  173. begin
  174. writeln('indexdword error 12 for (',i,',',j,',',k,')');
  175. halt(12);
  176. end;
  177. l:=unaligned(pdword(@(b[k+4+((i shr 3) and not 3)-4]))^);
  178. if (i>=32) then
  179. index:=((i shr 3) and not 3) shr 2 - 1
  180. else
  181. index:=-1;
  182. if indexdword(b[k+4],i shr 2,l)<>index then
  183. begin
  184. writeln(indexdword(b[k+4],i shr 2,l),' <> ',index);
  185. writeln('indexword error 13 for (',i,',',j,',',k,')');
  186. halt(13);
  187. end;
  188. l:=unaligned(pword(@(b[k+4]))^);
  189. if (i<4) then
  190. index:=-1
  191. else
  192. index:=0;
  193. if indexword(b[k+4],i shr 2,l)<>index then
  194. begin
  195. writeln('indexdword error 14 for (',i,',',j,',',k,')');
  196. halt(14);
  197. end;
  198. end;
  199. end;
  200. begin
  201. test_index;
  202. end.