macpas.pp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. {
  2. This file is part of the Free Pascal Run time library.
  3. Copyright (c) 2004 by Olle Raab
  4. This unit contain procedures specific for mode MacPas.
  5. It should be platform independant.
  6. See the file COPYING.FPC, included in this distribution,
  7. For details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {$mode objfpc}
  13. unit MacPas;
  14. interface
  15. { Using inlining for small system functions/wrappers }
  16. {$inline on}
  17. {$ifndef DISABLE_SYSTEMINLINE}
  18. {$define SYSTEMINLINE}
  19. {$endif}
  20. type
  21. {$ifndef FPUNONE}
  22. LongDouble = ValReal;
  23. {$endif}
  24. FourCharArray = packed array[1..4] of AnsiChar;
  25. UnsignedByte = Byte;
  26. UnsignedWord = Word;
  27. UnsignedLong = Longword;
  28. {FourCharCode coercion
  29. This routine coreces string literals to a FourCharCode.}
  30. function FCC(const literal: string): LongWord; {$ifdef systeminline}inline;{$endif}
  31. {Same as FCC, to be compatible with GPC}
  32. function FOUR_CHAR_CODE(const literal: string): LongWord; {$ifdef systeminline}inline;{$endif}
  33. { Same as the "is" operator }
  34. Function Member (Instance : TObject; AClass : TClass) : boolean; {$ifdef systeminline}inline;{$endif}
  35. function ord4(i: smallint): smallint; {$ifdef systeminline}inline;{$endif}
  36. function ord4(l: longint): longint; {$ifdef systeminline}inline;{$endif}
  37. function ord4(c: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  38. function ord4(p: pointer): ptrint; {$ifdef systeminline}inline;{$endif}
  39. function BAnd(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  40. function BAnd(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  41. function BAnd(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  42. function BAnd(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  43. function BOr(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  44. function BOr(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  45. function BOr(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  46. function BOr(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  47. function BXor(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  48. function BXor(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  49. function BXor(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  50. function BXor(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  51. function Bsr(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  52. function Bsr(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  53. function Bsr(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  54. function Bsr(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  55. function Bsl(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  56. function Bsl(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  57. function Bsl(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  58. function Bsl(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  59. function BTst(i: longint; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  60. function BTst(i,j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  61. function BTst(i: int64; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  62. function BTst(i: qword; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  63. procedure BSet(var i: longint; j: cardinal); {$ifdef systeminline}inline;{$endif}
  64. procedure BSet(var i: cardinal; j: cardinal); {$ifdef systeminline}inline;{$endif}
  65. procedure BSet(var i: int64; j: cardinal); {$ifdef systeminline}inline;{$endif}
  66. procedure BSet(var i: qword; j: cardinal); {$ifdef systeminline}inline;{$endif}
  67. procedure BClr(var i: longint; j: cardinal); {$ifdef systeminline}inline;{$endif}
  68. procedure BClr(var i: cardinal; j: cardinal); {$ifdef systeminline}inline;{$endif}
  69. procedure BClr(var i: int64; j: cardinal); {$ifdef systeminline}inline;{$endif}
  70. procedure BClr(var i: qword; j: cardinal); {$ifdef systeminline}inline;{$endif}
  71. function BRotL(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  72. function BRotL(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  73. function BRotL(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  74. function BRotL(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  75. function BRotR(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  76. function BRotR(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  77. function BRotR(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  78. function BRotR(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  79. function BNot(i: longint): longint; {$ifdef systeminline}inline;{$endif}
  80. function BNot(i: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  81. function BNot(i: int64): int64; {$ifdef systeminline}inline;{$endif}
  82. function BNot(i: qword): qword; {$ifdef systeminline}inline;{$endif}
  83. implementation
  84. uses
  85. math;
  86. {$r-}
  87. {$q-}
  88. function FCC(const literal: string): LongWord; {$ifdef systeminline}inline;{$endif}
  89. begin
  90. {$ifdef FPC_LITTLE_ENDIAN}
  91. FCC := (ord(literal[1]) shl 24) or (ord(literal[2]) shl 16) or (ord(literal[3]) shl 8) or ord(literal[4]);
  92. {$else FPC_LITTLE_ENDIAN}
  93. FCC := PLongWord(@literal[1])^;
  94. {$endif FPC_LITTLE_ENDIAN}
  95. end;
  96. function FOUR_CHAR_CODE(const literal: string): LongWord; {$ifdef systeminline}inline;{$endif}
  97. begin
  98. {$ifdef FPC_LITTLE_ENDIAN}
  99. FOUR_CHAR_CODE := (ord(literal[1]) shl 24) or (ord(literal[2]) shl 16) or (ord(literal[3]) shl 8) or ord(literal[4]);
  100. {$else FPC_LITTLE_ENDIAN}
  101. FOUR_CHAR_CODE := PLongWord(@literal[1])^;
  102. {$endif FPC_LITTLE_ENDIAN}
  103. end;
  104. Function Member (Instance : TObject; AClass : TClass) : boolean; {$ifdef systeminline}inline;{$endif}
  105. begin
  106. Result:=Instance is AClass;
  107. end;
  108. function ord4(i: smallint): smallint; {$ifdef systeminline}inline;{$endif}
  109. begin
  110. result:=i;
  111. end;
  112. function ord4(l: longint): longint; {$ifdef systeminline}inline;{$endif}
  113. begin
  114. result := l;
  115. end;
  116. function ord4(c: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  117. begin
  118. result := c;
  119. end;
  120. function ord4(p: pointer): ptrint; {$ifdef systeminline}inline;{$endif}
  121. begin
  122. result := ptrint(p);
  123. end;
  124. function BAnd(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  125. begin
  126. result := i and j;
  127. end;
  128. function BAnd(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  129. begin
  130. result := i and j;
  131. end;
  132. function BAnd(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  133. begin
  134. result := i and j;
  135. end;
  136. function BAnd(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  137. begin
  138. result := i and j;
  139. end;
  140. function BOr(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  141. begin
  142. result := i or j;
  143. end;
  144. function BOr(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  145. begin
  146. result := i or j;
  147. end;
  148. function BOr(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  149. begin
  150. result := i or j;
  151. end;
  152. function BOr(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  153. begin
  154. result := i or j;
  155. end;
  156. function BXor(i,j: longint): longint; {$ifdef systeminline}inline;{$endif}
  157. begin
  158. result := i xor j;
  159. end;
  160. function BXor(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  161. begin
  162. result := i xor j;
  163. end;
  164. function BXor(i,j: int64): int64; {$ifdef systeminline}inline;{$endif}
  165. begin
  166. result := i xor j;
  167. end;
  168. function BXor(i,j: qword): qword; {$ifdef systeminline}inline;{$endif}
  169. begin
  170. result := i xor j;
  171. end;
  172. function Bsr(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  173. begin
  174. result := i shr j;
  175. end;
  176. function Bsr(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  177. begin
  178. result := i shr j;
  179. end;
  180. function Bsr(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  181. begin
  182. result := i shr j;
  183. end;
  184. function Bsr(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  185. begin
  186. result := i shr j;
  187. end;
  188. function Bsl(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  189. begin
  190. result := i shl j;
  191. end;
  192. function Bsl(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  193. begin
  194. result := i shl j;
  195. end;
  196. function Bsl(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  197. begin
  198. result := i shl j;
  199. end;
  200. function Bsl(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  201. begin
  202. result := i shl j;
  203. end;
  204. function BTst(i: longint; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  205. begin
  206. result := ((i shr j) and 1) <> 0;
  207. end;
  208. function BTst(i,j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  209. begin
  210. result := ((i shr j) and 1) <> 0;
  211. end;
  212. function BTst(i: int64; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  213. begin
  214. result := (cardinal(i shr j) and 1) <> 0;
  215. end;
  216. function BTst(i: qword; j: cardinal): boolean; {$ifdef systeminline}inline;{$endif}
  217. begin
  218. result := (cardinal(i shr j) and 1) <> 0;
  219. end;
  220. procedure BSet(var i: longint; j: cardinal); {$ifdef systeminline}inline;{$endif}
  221. begin
  222. i := i or (1 shl j);
  223. end;
  224. procedure BSet(var i: cardinal; j: cardinal); {$ifdef systeminline}inline;{$endif}
  225. begin
  226. i := i or (cardinal(1) shl j);
  227. end;
  228. procedure BSet(var i: int64; j: cardinal); {$ifdef systeminline}inline;{$endif}
  229. begin
  230. i := i or (int64(1) shl j);
  231. end;
  232. procedure BSet(var i: qword; j: cardinal); {$ifdef systeminline}inline;{$endif}
  233. begin
  234. i := i or (qword(1) shl j);
  235. end;
  236. procedure BClr(var i: longint; j: cardinal); {$ifdef systeminline}inline;{$endif}
  237. begin
  238. i := i and not (1 shl j);
  239. end;
  240. procedure BClr(var i: cardinal; j: cardinal); {$ifdef systeminline}inline;{$endif}
  241. begin
  242. i := i and not (1 shl j);
  243. end;
  244. procedure BClr(var i: int64; j: cardinal); {$ifdef systeminline}inline;{$endif}
  245. begin
  246. i := i and not (int64(1) shl j);
  247. end;
  248. procedure BClr(var i: qword; j: cardinal); {$ifdef systeminline}inline;{$endif}
  249. begin
  250. i := i and not (qword(1) shl j);
  251. end;
  252. function BRotL(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  253. begin
  254. result := (i shl j) or (i shr (32-j));
  255. end;
  256. function BRotL(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  257. begin
  258. result := (i shl j) or (i shr (32-j));
  259. end;
  260. function BRotL(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  261. begin
  262. result := (i shl j) or (i shr (64-j));
  263. end;
  264. function BRotL(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  265. begin
  266. result := (i shl j) or (i shr (64-j));
  267. end;
  268. function BRotR(i: longint; j: cardinal): longint; {$ifdef systeminline}inline;{$endif}
  269. begin
  270. result := (i shr j) or (i shl (32-j));
  271. end;
  272. function BRotR(i,j: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  273. begin
  274. result := (i shr j) or (i shl (32-j));
  275. end;
  276. function BRotR(i: int64; j: cardinal): int64; {$ifdef systeminline}inline;{$endif}
  277. begin
  278. result := (i shr j) or (i shl (64-j));
  279. end;
  280. function BRotR(i: qword; j: cardinal): qword; {$ifdef systeminline}inline;{$endif}
  281. begin
  282. result := (i shr j) or (i shl (64-j));
  283. end;
  284. function BNot(i: longint): longint; {$ifdef systeminline}inline;{$endif}
  285. begin
  286. result := not(i);
  287. end;
  288. function BNot(i: cardinal): cardinal; {$ifdef systeminline}inline;{$endif}
  289. begin
  290. result := not(i);
  291. end;
  292. function BNot(i: int64): int64; {$ifdef systeminline}inline;{$endif}
  293. begin
  294. result := not(i);
  295. end;
  296. function BNot(i: qword): qword; {$ifdef systeminline}inline;{$endif}
  297. begin
  298. result := not(i);
  299. end;
  300. {$ifndef FPUNONE}
  301. begin
  302. SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision])
  303. {$endif}
  304. end.