tcalext4.pp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. { %FILES=tcext4.o }
  2. { Tests passing of byte arrays by value of different sizes to C methods }
  3. program passvaluestest;
  4. {$MODE DELPHI}
  5. {$R-}
  6. {$Q-}
  7. type
  8. int8_t = shortint;
  9. pint8_t = ^int8_t;
  10. var
  11. success : boolean;
  12. {$packrecords c}
  13. type
  14. arr1 = array[1..1] of int8_t;
  15. arr2 = array[1..2] of int8_t;
  16. arr3 = array[1..3] of int8_t;
  17. arr4 = array[1..4] of int8_t;
  18. arr5 = array[1..5] of int8_t;
  19. arr7 = array[1..7] of int8_t;
  20. arr8 = array[1..8] of int8_t;
  21. arr9 = array[1..9] of int8_t;
  22. arr15 = array[1..15] of int8_t;
  23. arr16 = array[1..16] of int8_t;
  24. arr17 = array[1..17] of int8_t;
  25. arr24 = array[1..24] of int8_t;
  26. arr31 = array[1..31] of int8_t;
  27. arr32 = array[1..32] of int8_t;
  28. arr33 = array[1..33] of int8_t;
  29. procedure fill(var mem; size : integer);
  30. var
  31. i : Integer;
  32. p : pint8_t;
  33. begin
  34. p := @mem;
  35. for i := 0 to size-1 do begin
  36. p^ := random(255)+1;
  37. inc(p);
  38. end;
  39. end;
  40. procedure verify(val1, val2 : int64; nr : Integer);
  41. begin
  42. success := success and (val1 = val2);
  43. Write('Testing test ', nr , ', was ', val1, ', should be ', val2, '...');
  44. if (val1 = val2) then
  45. WriteLn('Success.')
  46. else
  47. WriteLn('Failed');
  48. end;
  49. function check(const s : array of int8_t) : int64;
  50. var
  51. i : Integer;
  52. begin
  53. result := 0;
  54. for i := low(s) to high(s) do
  55. inc(result, s[i]);
  56. end;
  57. {$L tcext4.o}
  58. function pass1(s : arr1) : int64; cdecl; external;
  59. function pass2(s : arr2) : int64; cdecl; external;
  60. function pass3(s : arr3) : int64; cdecl; external;
  61. function pass4(s : arr4) : int64; cdecl; external;
  62. function pass5(s : arr5) : int64; cdecl; external;
  63. function pass7(s : arr7) : int64; cdecl; external;
  64. function pass8(s : arr8) : int64; cdecl; external;
  65. function pass9(s : arr9) : int64; cdecl; external;
  66. function pass15(s : arr15) : int64; cdecl; external;
  67. function pass16(s : arr16) : int64; cdecl; external;
  68. function pass17(s : arr17) : int64; cdecl; external;
  69. function pass24(s : arr24) : int64; cdecl; external;
  70. function pass31(s : arr31) : int64; cdecl; external;
  71. function pass32(s : arr32) : int64; cdecl; external;
  72. function pass33(s : arr33) : int64; cdecl; external;
  73. procedure dotest;
  74. var
  75. s1 : arr1;
  76. s2 : arr2;
  77. s3 : arr3;
  78. s4 : arr4;
  79. s5 : arr5;
  80. s7 : arr7;
  81. s8 : arr8;
  82. s9 : arr9;
  83. s15 : arr15;
  84. s16 : arr16;
  85. s17 : arr17;
  86. s24 : arr24;
  87. s31 : arr31;
  88. s32 : arr32;
  89. s33 : arr33;
  90. begin
  91. randseed := 20;
  92. success := true;
  93. fill(s1, sizeof(s1));
  94. fill(s2, sizeof(s2));
  95. fill(s3, sizeof(s3));
  96. fill(s4, sizeof(s4));
  97. fill(s5, sizeof(s5));
  98. fill(s7, sizeof(s7));
  99. fill(s8, sizeof(s8));
  100. fill(s9, sizeof(s9));
  101. fill(s15, sizeof(s15));
  102. fill(s16, sizeof(s16));
  103. fill(s17, sizeof(s17));
  104. fill(s24, sizeof(s24));
  105. fill(s31, sizeof(s31));
  106. fill(s32, sizeof(s32));
  107. fill(s33, sizeof(s33));
  108. verify(pass1(s1), check(s1), 1);
  109. verify(pass2(s2), check(s2), 2);
  110. verify(pass3(s3), check(s3), 3);
  111. verify(pass4(s4), check(s4), 4);
  112. verify(pass5(s5), check(s5), 5);
  113. verify(pass7(s7), check(s7), 7);
  114. verify(pass8(s8), check(s8), 8);
  115. verify(pass9(s9), check(s9), 9);
  116. verify(pass15(s15), check(s15), 15);
  117. verify(pass16(s16), check(s16), 16);
  118. verify(pass17(s17), check(s17), 17);
  119. verify(pass24(s24), check(s24), 24);
  120. verify(pass31(s31), check(s31), 31);
  121. verify(pass32(s32), check(s32), 32);
  122. verify(pass33(s33), check(s33), 33);
  123. if (not success) then
  124. halt(1);
  125. end;
  126. begin
  127. dotest;
  128. end.