system.pp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2006 by Florian Klaempfl
  4. member of the Free Pascal development team.
  5. System unit for embedded systems
  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. Unit system;
  13. {$namespace org.freepascal.rtl}
  14. {*****************************************************************************}
  15. interface
  16. {*****************************************************************************}
  17. {$define FPC_IS_SYSTEM}
  18. {$I-,Q-,H-,R-,V-}
  19. {$implicitexceptions off}
  20. {$mode objfpc}
  21. {$undef FPC_HAS_FEATURE_ANSISTRINGS}
  22. {$undef FPC_HAS_FEATURE_TEXTIO}
  23. {$undef FPC_HAS_FEATURE_VARIANTS}
  24. {$undef FPC_HAS_FEATURE_CLASSES}
  25. {$undef FPC_HAS_FEATURE_EXCEPTIONS}
  26. {$undef FPC_HAS_FEATURE_OBJECTS}
  27. {$undef FPC_HAS_FEATURE_RTTI}
  28. {$undef FPC_HAS_FEATURE_FILEIO}
  29. {$undef FPC_INCLUDE_SOFTWARE_INT64_TO_DOUBLE}
  30. Type
  31. { The compiler has all integer types defined internally. Here
  32. we define only aliases }
  33. DWord = LongWord;
  34. Cardinal = LongWord;
  35. Integer = SmallInt;
  36. UInt64 = QWord;
  37. SizeInt = Longint;
  38. SizeUInt = Longint;
  39. PtrInt = Longint;
  40. PtrUInt = Longint;
  41. ValReal = Double;
  42. AnsiChar = Char;
  43. UnicodeChar = WideChar;
  44. { map comp to int64, }
  45. Comp = Int64;
  46. HResult = type longint;
  47. { Java primitive types }
  48. jboolean = boolean;
  49. jbyte = shortint;
  50. jshort = smallint;
  51. jint = longint;
  52. jlong = int64;
  53. jchar = widechar;
  54. jfloat = single;
  55. jdouble = double;
  56. Arr1jboolean = array of jboolean;
  57. Arr1jbyte = array of jbyte;
  58. Arr1jshort = array of jshort;
  59. Arr1jint = array of jint;
  60. Arr1jlong = array of jlong;
  61. Arr1jchar = array of jchar;
  62. Arr1jfloat = array of jfloat;
  63. Arr1jdouble = array of jdouble;
  64. Arr2jboolean = array of Arr1jboolean;
  65. Arr2jbyte = array of Arr1jbyte;
  66. Arr2jshort = array of Arr1jshort;
  67. Arr2jint = array of Arr1jint;
  68. Arr2jlong = array of Arr1jlong;
  69. Arr2jchar = array of Arr1jchar;
  70. Arr2jfloat = array of Arr1jfloat;
  71. Arr2jdouble = array of Arr1jdouble;
  72. Arr3jboolean = array of Arr2jboolean;
  73. Arr3jbyte = array of Arr2jbyte;
  74. Arr3jshort = array of Arr2jshort;
  75. Arr3jint = array of Arr2jint;
  76. Arr3jlong = array of Arr2jlong;
  77. Arr3jchar = array of Arr2jchar;
  78. Arr3jfloat = array of Arr2jfloat;
  79. Arr3jdouble = array of Arr2jdouble;
  80. const
  81. { max. values for longint and int}
  82. maxLongint = $7fffffff;
  83. maxSmallint = 32767;
  84. maxint = maxsmallint;
  85. { Java base class type }
  86. {$i java_sysh.inc}
  87. {$i java_sys.inc}
  88. type
  89. TObject = class(JLObject)
  90. strict private
  91. DestructorCalled: Boolean;
  92. public
  93. procedure Free;
  94. destructor Destroy; virtual;
  95. procedure finalize; override;
  96. end;
  97. {$i innr.inc}
  98. {$i jmathh.inc}
  99. {$i jrech.inc}
  100. {$i jdynarrh.inc}
  101. Function lo(i : Integer) : byte; [INTERNPROC: fpc_in_lo_Word];
  102. Function lo(w : Word) : byte; [INTERNPROC: fpc_in_lo_Word];
  103. Function lo(l : Longint) : Word; [INTERNPROC: fpc_in_lo_long];
  104. Function lo(l : DWord) : Word; [INTERNPROC: fpc_in_lo_long];
  105. Function lo(i : Int64) : DWord; [INTERNPROC: fpc_in_lo_qword];
  106. Function lo(q : QWord) : DWord; [INTERNPROC: fpc_in_lo_qword];
  107. Function hi(i : Integer) : byte; [INTERNPROC: fpc_in_hi_Word];
  108. Function hi(w : Word) : byte; [INTERNPROC: fpc_in_hi_Word];
  109. Function hi(l : Longint) : Word; [INTERNPROC: fpc_in_hi_long];
  110. Function hi(l : DWord) : Word; [INTERNPROC: fpc_in_hi_long];
  111. Function hi(i : Int64) : DWord; [INTERNPROC: fpc_in_hi_qword];
  112. Function hi(q : QWord) : DWord; [INTERNPROC: fpc_in_hi_qword];
  113. Function chr(b : byte) : AnsiChar; [INTERNPROC: fpc_in_chr_byte];
  114. function RorByte(Const AValue : Byte): Byte;[internproc:fpc_in_ror_x];
  115. function RorByte(Const AValue : Byte;Dist : Byte): Byte;[internproc:fpc_in_ror_x_x];
  116. function RolByte(Const AValue : Byte): Byte;[internproc:fpc_in_rol_x];
  117. function RolByte(Const AValue : Byte;Dist : Byte): Byte;[internproc:fpc_in_rol_x_x];
  118. function RorWord(Const AValue : Word): Word;[internproc:fpc_in_ror_x];
  119. function RorWord(Const AValue : Word;Dist : Byte): Word;[internproc:fpc_in_ror_x_x];
  120. function RolWord(Const AValue : Word): Word;[internproc:fpc_in_rol_x];
  121. function RolWord(Const AValue : Word;Dist : Byte): Word;[internproc:fpc_in_rol_x_x];
  122. function RorDWord(Const AValue : DWord): DWord;[internproc:fpc_in_ror_x];
  123. function RorDWord(Const AValue : DWord;Dist : Byte): DWord;[internproc:fpc_in_ror_x_x];
  124. function RolDWord(Const AValue : DWord): DWord;[internproc:fpc_in_rol_x];
  125. function RolDWord(Const AValue : DWord;Dist : Byte): DWord;[internproc:fpc_in_rol_x_x];
  126. function RorQWord(Const AValue : QWord): QWord;[internproc:fpc_in_ror_x];
  127. function RorQWord(Const AValue : QWord;Dist : Byte): QWord;[internproc:fpc_in_ror_x_x];
  128. function RolQWord(Const AValue : QWord): QWord;[internproc:fpc_in_rol_x];
  129. function RolQWord(Const AValue : QWord;Dist : Byte): QWord;[internproc:fpc_in_rol_x_x];
  130. function SarShortint(Const AValue : Shortint): Shortint;[internproc:fpc_in_sar_x];
  131. function SarShortint(Const AValue : Shortint;Shift : Byte): Shortint;[internproc:fpc_in_sar_x_y];
  132. function SarSmallint(Const AValue : Smallint): Smallint;[internproc:fpc_in_sar_x];
  133. function SarSmallint(Const AValue : Smallint;Shift : Byte): Smallint;[internproc:fpc_in_sar_x_y];
  134. function SarLongint(Const AValue : Longint): Longint;[internproc:fpc_in_sar_x];
  135. function SarLongint(Const AValue : Longint;Shift : Byte): Longint;[internproc:fpc_in_sar_x_y];
  136. function SarInt64(Const AValue : Int64): Int64;[internproc:fpc_in_sar_x];
  137. function SarInt64(Const AValue : Int64;Shift : Byte): Int64;[internproc:fpc_in_sar_x_y];
  138. {$i compproc.inc}
  139. {$i ustringh.inc}
  140. {*****************************************************************************}
  141. implementation
  142. {*****************************************************************************}
  143. {i jdynarr.inc}
  144. {
  145. This file is part of the Free Pascal run time library.
  146. Copyright (c) 2011 by Jonas Maebe
  147. member of the Free Pascal development team.
  148. This file implements the helper routines for dyn. Arrays in FPC
  149. See the file COPYING.FPC, included in this distribution,
  150. for details about the copyright.
  151. This program is distributed in the hope that it will be useful,
  152. but WITHOUT ANY WARRANTY; without even the implied warranty of
  153. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  154. **********************************************************************
  155. }
  156. {$i ustrings.inc}
  157. {$i rtti.inc}
  158. {$i jrec.inc}
  159. function min(a,b : longint) : longint;
  160. begin
  161. if a<=b then
  162. min:=a
  163. else
  164. min:=b;
  165. end;
  166. { copying helpers }
  167. { also for booleans }
  168. procedure fpc_copy_jbyte_array(src, dst: TJByteArray);
  169. var
  170. i: longint;
  171. begin
  172. for i:=0 to min(high(src),high(dst)) do
  173. dst[i]:=src[i];
  174. end;
  175. procedure fpc_copy_jshort_array(src, dst: TJShortArray);
  176. var
  177. i: longint;
  178. begin
  179. for i:=0 to min(high(src),high(dst)) do
  180. dst[i]:=src[i];
  181. end;
  182. procedure fpc_copy_jint_array(src, dst: TJIntArray);
  183. var
  184. i: longint;
  185. begin
  186. for i:=0 to min(high(src),high(dst)) do
  187. dst[i]:=src[i];
  188. end;
  189. procedure fpc_copy_jlong_array(src, dst: TJLongArray);
  190. var
  191. i: longint;
  192. begin
  193. for i:=0 to min(high(src),high(dst)) do
  194. dst[i]:=src[i];
  195. end;
  196. procedure fpc_copy_jchar_array(src, dst: TJCharArray);
  197. var
  198. i: longint;
  199. begin
  200. for i:=0 to min(high(src),high(dst)) do
  201. dst[i]:=src[i];
  202. end;
  203. procedure fpc_copy_jfloat_array(src, dst: TJFloatArray);
  204. var
  205. i: longint;
  206. begin
  207. for i:=0 to min(high(src),high(dst)) do
  208. dst[i]:=src[i];
  209. end;
  210. procedure fpc_copy_jdouble_array(src, dst: TJDoubleArray);
  211. var
  212. i: longint;
  213. begin
  214. for i:=0 to min(high(src),high(dst)) do
  215. dst[i]:=src[i];
  216. end;
  217. procedure fpc_copy_jobject_array(src, dst: TJObjectArray);
  218. var
  219. i: longint;
  220. begin
  221. for i:=0 to min(high(src),high(dst)) do
  222. dst[i]:=src[i];
  223. end;
  224. procedure fpc_copy_jrecord_array(src, dst: TJRecordArray);
  225. var
  226. i: longint;
  227. begin
  228. for i:=0 to min(high(src),high(dst)) do
  229. dst[i]:=FpcBaseRecordType(src[i].clone);
  230. end;
  231. { 1-dimensional setlength routines }
  232. function fpc_setlength_dynarr_jbyte(aorg, anew: TJByteArray; deepcopy: boolean): TJByteArray;
  233. begin
  234. if deepcopy or
  235. (length(aorg)<>length(anew)) then
  236. begin
  237. fpc_copy_jbyte_array(aorg,anew);
  238. result:=anew
  239. end
  240. else
  241. result:=aorg;
  242. end;
  243. function fpc_setlength_dynarr_jshort(aorg, anew: TJShortArray; deepcopy: boolean): TJShortArray;
  244. begin
  245. if deepcopy or
  246. (length(aorg)<>length(anew)) then
  247. begin
  248. fpc_copy_jshort_array(aorg,anew);
  249. result:=anew
  250. end
  251. else
  252. result:=aorg;
  253. end;
  254. function fpc_setlength_dynarr_jint(aorg, anew: TJIntArray; deepcopy: boolean): TJIntArray;
  255. begin
  256. if deepcopy or
  257. (length(aorg)<>length(anew)) then
  258. begin
  259. fpc_copy_jint_array(aorg,anew);
  260. result:=anew
  261. end
  262. else
  263. result:=aorg;
  264. end;
  265. function fpc_setlength_dynarr_jlong(aorg, anew: TJLongArray; deepcopy: boolean): TJLongArray;
  266. begin
  267. if deepcopy or
  268. (length(aorg)<>length(anew)) then
  269. begin
  270. fpc_copy_jlong_array(aorg,anew);
  271. result:=anew
  272. end
  273. else
  274. result:=aorg;
  275. end;
  276. function fpc_setlength_dynarr_jchar(aorg, anew: TJCharArray; deepcopy: boolean): TJCharArray;
  277. begin
  278. if deepcopy or
  279. (length(aorg)<>length(anew)) then
  280. begin
  281. fpc_copy_jchar_array(aorg,anew);
  282. result:=anew
  283. end
  284. else
  285. result:=aorg;
  286. end;
  287. function fpc_setlength_dynarr_jfloat(aorg, anew: TJFloatArray; deepcopy: boolean): TJFloatArray;
  288. begin
  289. if deepcopy or
  290. (length(aorg)<>length(anew)) then
  291. begin
  292. fpc_copy_jfloat_array(aorg,anew);
  293. result:=anew
  294. end
  295. else
  296. result:=aorg;
  297. end;
  298. function fpc_setlength_dynarr_jdouble(aorg, anew: TJDoubleArray; deepcopy: boolean): TJDoubleArray;
  299. begin
  300. if deepcopy or
  301. (length(aorg)<>length(anew)) then
  302. begin
  303. fpc_copy_jdouble_array(aorg,anew);
  304. result:=anew
  305. end
  306. else
  307. result:=aorg;
  308. end;
  309. function fpc_setlength_dynarr_jobject(aorg, anew: TJObjectArray; deepcopy: boolean; docopy : boolean = true): TJObjectArray;
  310. begin
  311. if deepcopy or
  312. (length(aorg)<>length(anew)) then
  313. begin
  314. if docopy then
  315. fpc_copy_jobject_array(aorg,anew);
  316. result:=anew
  317. end
  318. else
  319. result:=aorg;
  320. end;
  321. function fpc_setlength_dynarr_jrecord(aorg, anew: TJRecordArray; deepcopy: boolean): TJRecordArray;
  322. begin
  323. if deepcopy or
  324. (length(aorg)<>length(anew)) then
  325. begin
  326. fpc_copy_jrecord_array(aorg,anew);
  327. result:=anew
  328. end
  329. else
  330. result:=aorg;
  331. end;
  332. { multi-dimensional setlength routine }
  333. function fpc_setlength_dynarr_multidim(aorg, anew: TJObjectArray; deepcopy: boolean; ndim: longint; eletype: jchar): TJObjectArray;
  334. var
  335. partdone,
  336. i: longint;
  337. begin
  338. { resize the current dimension; no need to copy the subarrays of the old
  339. array, as the subarrays will be (re-)initialised immediately below }
  340. result:=fpc_setlength_dynarr_jobject(aorg,anew,deepcopy,false);
  341. { if aorg was empty, there's nothing else to do since result will now
  342. contain anew, of which all other dimensions are already initialised
  343. correctly since there are no aorg elements to copy }
  344. if not assigned(aorg) and
  345. not deepcopy then
  346. exit;
  347. partdone:=min(high(result),high(aorg));
  348. { ndim must be >=2 when this routine is called, since it has to return
  349. an array of java.lang.Object! (arrays are also objects, but primitive
  350. types are not) }
  351. if ndim=2 then
  352. begin
  353. { final dimension -> copy the primitive arrays }
  354. case eletype of
  355. FPCJDynArrTypeJByte:
  356. begin
  357. for i:=low(result) to partdone do
  358. result[i]:=JLObject(fpc_setlength_dynarr_jbyte(TJByteArray(aorg[i]),TJByteArray(anew[i]),deepcopy));
  359. for i:=succ(partdone) to high(result) do
  360. result[i]:=JLObject(fpc_setlength_dynarr_jbyte(nil,TJByteArray(anew[i]),deepcopy));
  361. end;
  362. FPCJDynArrTypeJShort:
  363. begin
  364. for i:=low(result) to partdone do
  365. result[i]:=JLObject(fpc_setlength_dynarr_jshort(TJShortArray(aorg[i]),TJShortArray(anew[i]),deepcopy));
  366. for i:=succ(partdone) to high(result) do
  367. result[i]:=JLObject(fpc_setlength_dynarr_jshort(nil,TJShortArray(anew[i]),deepcopy));
  368. end;
  369. FPCJDynArrTypeJInt:
  370. begin
  371. for i:=low(result) to partdone do
  372. result[i]:=JLObject(fpc_setlength_dynarr_jint(TJIntArray(aorg[i]),TJIntArray(anew[i]),deepcopy));
  373. for i:=succ(partdone) to high(result) do
  374. result[i]:=JLObject(fpc_setlength_dynarr_jint(nil,TJIntArray(anew[i]),deepcopy));
  375. end;
  376. FPCJDynArrTypeJLong:
  377. begin
  378. for i:=low(result) to partdone do
  379. result[i]:=JLObject(fpc_setlength_dynarr_jlong(TJLongArray(aorg[i]),TJLongArray(anew[i]),deepcopy));
  380. for i:=succ(partdone) to high(result) do
  381. result[i]:=JLObject(fpc_setlength_dynarr_jlong(nil,TJLongArray(anew[i]),deepcopy));
  382. end;
  383. FPCJDynArrTypeJChar:
  384. begin
  385. for i:=low(result) to partdone do
  386. result[i]:=JLObject(fpc_setlength_dynarr_jchar(TJCharArray(aorg[i]),TJCharArray(anew[i]),deepcopy));
  387. for i:=succ(partdone) to high(result) do
  388. result[i]:=JLObject(fpc_setlength_dynarr_jchar(nil,TJCharArray(anew[i]),deepcopy));
  389. end;
  390. FPCJDynArrTypeJFloat:
  391. begin
  392. for i:=low(result) to partdone do
  393. result[i]:=JLObject(fpc_setlength_dynarr_jfloat(TJFloatArray(aorg[i]),TJFloatArray(anew[i]),deepcopy));
  394. for i:=succ(partdone) to high(result) do
  395. result[i]:=JLObject(fpc_setlength_dynarr_jfloat(nil,TJFloatArray(anew[i]),deepcopy));
  396. end;
  397. FPCJDynArrTypeJDouble:
  398. begin
  399. for i:=low(result) to partdone do
  400. result[i]:=JLObject(fpc_setlength_dynarr_jdouble(TJDoubleArray(aorg[i]),TJDoubleArray(anew[i]),deepcopy));
  401. for i:=succ(partdone) to high(result) do
  402. result[i]:=JLObject(fpc_setlength_dynarr_jdouble(nil,TJDoubleArray(anew[i]),deepcopy));
  403. end;
  404. FPCJDynArrTypeJObject:
  405. begin
  406. for i:=low(result) to partdone do
  407. result[i]:=JLObject(fpc_setlength_dynarr_jobject(TJObjectArray(aorg[i]),TJObjectArray(anew[i]),deepcopy,true));
  408. for i:=succ(partdone) to high(result) do
  409. result[i]:=JLObject(fpc_setlength_dynarr_jobject(nil,TJObjectArray(anew[i]),deepcopy,true));
  410. end;
  411. FPCJDynArrTypeRecord:
  412. begin
  413. for i:=low(result) to partdone do
  414. result[i]:=JLObject(fpc_setlength_dynarr_jrecord(TJRecordArray(aorg[i]),TJRecordArray(anew[i]),deepcopy));
  415. for i:=succ(partdone) to high(result) do
  416. result[i]:=JLObject(fpc_setlength_dynarr_jrecord(nil,TJRecordArray(anew[i]),deepcopy));
  417. end;
  418. end;
  419. end
  420. else
  421. begin
  422. { recursively handle the next dimension }
  423. for i:=low(result) to partdone do
  424. result[i]:=JLObject(fpc_setlength_dynarr_multidim(TJObjectArray(aorg[i]),TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
  425. for i:=succ(partdone) to high(result) do
  426. result[i]:=JLObject(fpc_setlength_dynarr_multidim(nil,TJObjectArray(anew[i]),deepcopy,pred(ndim),eletype));
  427. end;
  428. end;
  429. {i jdynarr.inc end}
  430. {*****************************************************************************
  431. Misc. System Dependent Functions
  432. *****************************************************************************}
  433. procedure TObject.Free;
  434. begin
  435. if not DestructorCalled then
  436. begin
  437. DestructorCalled:=true;
  438. Destroy;
  439. end;
  440. end;
  441. destructor TObject.Destroy;
  442. begin
  443. end;
  444. procedure TObject.Finalize;
  445. begin
  446. Free;
  447. end;
  448. {*****************************************************************************
  449. SystemUnit Initialization
  450. *****************************************************************************}
  451. end.