system.inc 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Run time library.
  4. Copyright (c) 1993,97 by the Free Pascal development team
  5. See the file COPYING.FPC, included in this distribution,
  6. For details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {****************************************************************************
  12. Local types
  13. ****************************************************************************}
  14. {
  15. TextRec and FileRec are put in a separate file to make it available to other
  16. units without putting it explicitly in systemh.
  17. This way we keep TP compatibility, and the TextRec definition is available
  18. for everyone who needs it.
  19. }
  20. {$i filerec.inc}
  21. {$i textrec.inc}
  22. Procedure HandleError (Errno : Longint); forward;
  23. Procedure HandleErrorFrame (Errno : longint;frame : longint); forward;
  24. type
  25. FileFunc = Procedure(var t : TextRec);
  26. const
  27. { Random / Randomize constants }
  28. OldRandSeed : Cardinal = 0;
  29. InitialSeed : Boolean = TRUE;
  30. Seed2 : Cardinal = 0;
  31. Seed3 : Cardinal = 0;
  32. { For Error Handling.}
  33. ErrorBase : Longint = 0;
  34. { Used by the ansistrings and maybe also other things in the future }
  35. var
  36. emptychar : char;public name 'FPC_EMPTYCHAR';
  37. {****************************************************************************
  38. Routines which have compiler magic
  39. ****************************************************************************}
  40. {$I innr.inc}
  41. Function lo(i : Integer) : byte; [INTERNPROC: In_lo_Word];
  42. Function lo(w : Word) : byte; [INTERNPROC: In_lo_Word];
  43. Function lo(l : Longint) : Word; [INTERNPROC: In_lo_long];
  44. Function lo(l : DWord) : Word; [INTERNPROC: In_lo_long];
  45. Function hi(i : Integer) : byte; [INTERNPROC: In_hi_Word];
  46. Function hi(w : Word) : byte; [INTERNPROC: In_hi_Word];
  47. Function hi(l : Longint) : Word; [INTERNPROC: In_hi_long];
  48. Function hi(l : DWord) : Word; [INTERNPROC: In_hi_long];
  49. Function chr(b : byte) : Char; [INTERNPROC: In_chr_byte];
  50. Function Length(s : string) : byte; [INTERNPROC: In_Length_string];
  51. Function Length(c : char) : byte; [INTERNPROC: In_Length_string];
  52. Procedure Reset(var f : TypedFile); [INTERNPROC: In_Reset_TypedFile];
  53. Procedure Rewrite(var f : TypedFile); [INTERNPROC: In_Rewrite_TypedFile];
  54. {****************************************************************************
  55. Include processor specific routines
  56. ****************************************************************************}
  57. {$IFDEF I386}
  58. {$IFDEF M68K}
  59. {$Error Can't determine processor type !}
  60. {$ENDIF}
  61. {$I i386.inc} { Case dependent, don't change }
  62. {$ELSE}
  63. {$IFDEF M68K}
  64. {$I m68k.inc} { Case dependent, don't change }
  65. {$ELSE}
  66. {$Error Can't determine processor type !}
  67. {$ENDIF}
  68. {$ENDIF}
  69. {****************************************************************************
  70. Set Handling
  71. ****************************************************************************}
  72. { Include set support which is processor specific}
  73. {$I set.inc}
  74. {****************************************************************************
  75. Subroutines for String handling
  76. ****************************************************************************}
  77. { Needs to be before RTTI handling }
  78. {$i sstrings.inc}
  79. Type
  80. PLongint = ^Longint;
  81. PByte = ^Byte;
  82. {$i astrings.inc}
  83. {****************************************************************************
  84. Run-Time Type Information (RTTI)
  85. ****************************************************************************}
  86. {$i rtti.inc}
  87. {****************************************************************************
  88. Math Routines
  89. ****************************************************************************}
  90. {$ifndef RTLLITE}
  91. function Hi(b : byte): byte;
  92. begin
  93. Hi := b shr 4
  94. end;
  95. function Lo(b : byte): byte;
  96. begin
  97. Lo := b and $0f
  98. end;
  99. Function swap (X : Word) : Word;[internconst:in_const_swap_word];
  100. Begin
  101. swap:=(X and $ff) shl 8 + (X shr 8)
  102. End;
  103. Function Swap (X : Integer) : Integer;[internconst:in_const_swap_word];
  104. Begin
  105. Swap:=Integer(Swap(Word(X)));
  106. End;
  107. Function swap (X : Longint) : Longint;[internconst:in_const_swap_long];
  108. Begin
  109. Swap:=(X and $ffff) shl 16 + (X shr 16)
  110. End;
  111. Function Swap (X : Cardinal) : Cardinal;[internconst:in_const_swap_long];
  112. Begin
  113. Swap:=Swap(Longint(X));
  114. End;
  115. {$endif RTLLITE}
  116. {****************************************************************************
  117. Random function routines
  118. This implements a very long cycle random number generator by combining
  119. three independant generators. The technique was described in the March
  120. 1987 issue of Byte.
  121. Taken and modified with permission from the PCQ Pascal rtl code.
  122. ****************************************************************************}
  123. {$R-}
  124. {$Q-}
  125. Procedure UseSeed(seed : Longint);Forward;
  126. Function Random : Real;
  127. var
  128. ReturnValue : Real;
  129. begin
  130. if (InitialSeed) OR ((RandSeed <> OldRandSeed) AND (NOT InitialSeed)) then
  131. Begin
  132. { This is a pretty complicated affair }
  133. { Initially we must call UseSeed when RandSeed is initalized }
  134. { We must also call UseSeed each time RandSeed is reinitialized }
  135. { DO NOT CHANGE THE ORDER OF DECLARATIONS IN THIS BLOCK }
  136. { UNLESS YOU WANT RANDON TO CRASH OF COURSE (CEC) }
  137. InitialSeed:=FALSE;
  138. OldRandSeed:=RandSeed;
  139. UseSeed(RandSeed);
  140. end;
  141. Inc(RandSeed);
  142. RandSeed := (RandSeed * 706) mod 500009;
  143. OldRandSeed:=RandSeed;
  144. INC(Seed2);
  145. Seed2 := (Seed2 * 774) MOD 600011;
  146. INC(Seed3);
  147. Seed3 := (Seed3 * 871) MOD 765241;
  148. ReturnValue := RandSeed/500009.0 +
  149. Seed2/600011.0 +
  150. Seed3/765241.0;
  151. Random := frac(ReturnValue);
  152. end;
  153. Function Random(l : Longint) : Longint;
  154. begin
  155. if (InitialSeed) OR ((RandSeed <> OldRandSeed) AND (NOT InitialSeed)) then
  156. Begin
  157. { This is a pretty complicated affair }
  158. { Initially we must call UseSeed when RandSeed is initalized }
  159. { We must also call UseSeed each time RandSeed is reinitialized }
  160. { DO NOT CHANGE THE ORDER OF DECLARATIONS IN THIS BLOCK }
  161. { UNLESS YOU WANT RANDON TO CRASH OF COURSE (CEC) }
  162. InitialSeed:=FALSE;
  163. OldRandSeed:=RandSeed;
  164. UseSeed(Randseed);
  165. end;
  166. Inc(RandSeed);
  167. RandSeed := (RandSeed * 998) mod 1000003;
  168. OldRandSeed:=RandSeed;
  169. if l=0 then
  170. Random:=0
  171. else
  172. Random := RandSeed mod l;
  173. end;
  174. Procedure UseSeed(seed : Longint);
  175. begin
  176. randseed := seed mod 1000003;
  177. Seed2 := (Random(65000) * Random(65000)) mod 600011;
  178. Seed3 := (Random(65000) * Random(65000)) mod 765241;
  179. end;
  180. { Include processor specific routines }
  181. {$I math.inc}
  182. {****************************************************************************
  183. Memory Management
  184. ****************************************************************************}
  185. {$ifndef RTLLITE}
  186. Function Ptr(sel,off : Longint) : pointer;[internconst:in_const_ptr];
  187. Begin
  188. sel:=0;
  189. ptr:=pointer(off);
  190. End;
  191. {$ifndef INTERNALADDR}
  192. Function Addr(var x):pointer;
  193. begin
  194. Addr:=@x;
  195. end;
  196. {$endif}
  197. Function CSeg : Word;
  198. Begin
  199. Cseg:=0;
  200. End;
  201. Function DSeg : Word;
  202. Begin
  203. Dseg:=0;
  204. End;
  205. Function SSeg : Word;
  206. Begin
  207. Sseg:=0;
  208. End;
  209. {$endif RTLLITE}
  210. {*****************************************************************************
  211. Directory support.
  212. *****************************************************************************}
  213. Procedure getdir(drivenr:byte;Var dir:ansistring);
  214. { this is needed to also allow ansistrings, the shortstring version is
  215. OS dependent }
  216. var
  217. s : shortstring;
  218. begin
  219. getdir(drivenr,s);
  220. dir:=s;
  221. end;
  222. {*****************************************************************************
  223. Miscellaneous
  224. *****************************************************************************}
  225. procedure int_overflow;[public,alias:'FPC_OVERFLOW'];
  226. begin
  227. HandleErrorFrame(215,get_frame);
  228. end;
  229. Function IOResult:Word;
  230. Begin
  231. IOResult:=InOutRes;
  232. InOutRes:=0;
  233. End;
  234. procedure fillchar(var x;count : longint;value : boolean);
  235. begin
  236. fillchar(x,count,byte(value));
  237. end;
  238. procedure fillchar(var x;count : longint;value : char);
  239. begin
  240. fillchar(x,count,byte(value));
  241. end;
  242. {*****************************************************************************
  243. Init / Exit / ExitProc
  244. *****************************************************************************}
  245. {$ifdef HASFINALIZE}
  246. const
  247. maxunits=1024; { See also files.pas of the compiler source }
  248. type
  249. TInitFinalRec=record
  250. InitProc,
  251. FinalProc : TProcedure;
  252. end;
  253. TInitFinalTable=record
  254. TableCount,
  255. InitCount : longint;
  256. Procs : array[1..maxunits] of TInitFinalRec;
  257. end;
  258. var
  259. InitFinalTable : TInitFinalTable;external name 'INITFINAL';
  260. procedure InitializeUnits;[public,alias:'FPC_INITIALIZEUNITS'];
  261. var
  262. i : longint;
  263. begin
  264. with InitFinalTable do
  265. begin
  266. for i:=1to TableCount do
  267. begin
  268. if assigned(Procs[i].InitProc) then
  269. Procs[i].InitProc();
  270. InitCount:=i;
  271. end;
  272. end;
  273. end;
  274. procedure FinalizeUnits;[public,alias:'FPC_FINALIZEUNITS'];
  275. begin
  276. with InitFinalTable do
  277. begin
  278. while (InitCount>0) do
  279. begin
  280. if assigned(Procs[InitCount].FinalProc) then
  281. Procs[InitCount].FinalProc();
  282. dec(InitCount);
  283. end;
  284. end;
  285. end;
  286. {$endif}
  287. Procedure HandleErrorFrame (Errno : longint;frame : longint);
  288. {
  289. Procedure to handle internal errors, i.e. not user-invoked errors
  290. Internal function should ALWAYS call HandleError instead of RunError.
  291. Can be used for exception handlers to specify the frame
  292. }
  293. var
  294. addr : longint;
  295. begin
  296. addr:=get_caller_addr(frame);
  297. If ErrorProc<>Nil then
  298. TErrorProc (ErrorProc)(Errno,pointer(addr));
  299. errorcode:=Errno;
  300. exitcode:=Errno;
  301. erroraddr:=pointer(addr);
  302. errorbase:=get_caller_frame(frame);
  303. halt(errorcode);
  304. end;
  305. Procedure HandleError (Errno : longint);[public,alias : 'FPC_HANDLEERROR'];
  306. {
  307. Procedure to handle internal errors, i.e. not user-invoked errors
  308. Internal function should ALWAYS call HandleError instead of RunError.
  309. }
  310. begin
  311. HandleErrorFrame(Errno,get_frame);
  312. end;
  313. procedure runerror(w : word);[alias: 'FPC_RUNERROR'];
  314. begin
  315. errorcode:=w;
  316. exitcode:=w;
  317. erroraddr:=pointer(get_caller_addr(get_frame));
  318. errorbase:=get_caller_frame(get_frame);
  319. halt(errorcode);
  320. end;
  321. Procedure RunError;
  322. Begin
  323. RunError (0);
  324. End;
  325. Procedure Halt;
  326. Begin
  327. Halt(0);
  328. End;
  329. Procedure dump_stack(var f : text;bp : Longint);
  330. var
  331. i, prevbp : Longint;
  332. Begin
  333. prevbp:=bp-1;
  334. i:=0;
  335. while bp > prevbp Do
  336. Begin
  337. Writeln(stderr,' 0x',HexStr(get_caller_addr(bp),8));
  338. Inc(i);
  339. If i>max_frame_dump Then
  340. exit;
  341. prevbp:=bp;
  342. bp:=get_caller_frame(bp);
  343. End;
  344. End;
  345. Procedure system_exit;forward;
  346. Procedure do_exit;[Public,Alias:'FPC_DO_EXIT'];
  347. var
  348. current_exit : Procedure;
  349. Begin
  350. while exitProc<>nil Do
  351. Begin
  352. InOutRes:=0;
  353. current_exit:=tProcedure(exitProc);
  354. exitProc:=nil;
  355. current_exit();
  356. End;
  357. {$ifdef HASFINALIZE}
  358. { Finalize units }
  359. FinalizeUnits;
  360. {$endif}
  361. { Show runtime error }
  362. If erroraddr<>nil Then
  363. Begin
  364. Writeln(stdout,'Run time error ',Errorcode,' at 0x',hexstr(Longint(Erroraddr),8));
  365. dump_stack(stdout,ErrorBase);
  366. End;
  367. { call system dependent exit code }
  368. System_exit;
  369. End;
  370. Type
  371. PExitProcInfo = ^TExitProcInfo;
  372. TExitProcInfo = Record
  373. Next : PExitProcInfo;
  374. SaveExit : Pointer;
  375. Proc : TProcedure;
  376. End;
  377. const
  378. ExitProcList: PExitProcInfo = nil;
  379. Procedure DoExitProc;
  380. var
  381. P : PExitProcInfo;
  382. Proc : TProcedure;
  383. Begin
  384. P:=ExitProcList;
  385. ExitProcList:=P^.Next;
  386. ExitProc:=P^.SaveExit;
  387. Proc:=P^.Proc;
  388. DisPose(P);
  389. Proc();
  390. End;
  391. Procedure AddExitProc(Proc: TProcedure);
  392. var
  393. P : PExitProcInfo;
  394. Begin
  395. New(P);
  396. P^.Next:=ExitProcList;
  397. P^.SaveExit:=ExitProc;
  398. P^.Proc:=Proc;
  399. ExitProcList:=P;
  400. ExitProc:=@DoExitProc;
  401. End;
  402. {*****************************************************************************
  403. Abstract/Assert support.
  404. *****************************************************************************}
  405. procedure AbstractError;[public,alias : 'FPC_ABSTRACTERROR'];
  406. Type
  407. TAbstractErrorProc=Procedure;
  408. begin
  409. If AbstractErrorProc<>nil then
  410. TAbstractErrorProc(AbstractErrorProc);
  411. HandleError(211);
  412. end;
  413. Procedure int_assert(Const Msg,FName:string;LineNo,ErrorAddr:Longint); [Public,Alias : 'FPC_ASSERT'];
  414. type
  415. TAssertErrorProc=procedure(const msg,fname:string;lineno,erroraddr:longint);
  416. begin
  417. if AssertErrorProc<>nil then
  418. TAssertErrorProc(AssertErrorProc)(Msg,FName,LineNo,ErrorAddr)
  419. else
  420. HandleError(227);
  421. end;
  422. Procedure SysAssert(Const Msg,FName:string;LineNo,ErrorAddr:Longint);
  423. begin
  424. If msg='' then
  425. write(stderr,'Assertion failed')
  426. else
  427. write(stderr,msg);
  428. writeln(stderr,' (',FName,', line ',LineNo,').');
  429. end;
  430. {*****************************************************************************
  431. SetJmp/LongJmp support.
  432. *****************************************************************************}
  433. {$i setjump.inc}
  434. {*****************************************************************************
  435. Object Pascal support
  436. *****************************************************************************}
  437. {$i objpas.inc}
  438. {
  439. $Log$
  440. Revision 1.60 1999-06-11 11:47:00 peter
  441. * random doesn't rte 200 with random(0)
  442. Revision 1.59 1999/06/05 20:45:12 michael
  443. + AbstractErro should call HandleError, not runerror.
  444. Revision 1.58 1999/05/17 21:52:39 florian
  445. * most of the Object Pascal stuff moved to the system unit
  446. Revision 1.57 1999/04/17 13:10:25 peter
  447. * addr() internal
  448. Revision 1.56 1999/04/15 12:20:01 peter
  449. + finalization support
  450. Revision 1.55 1999/03/01 15:41:03 peter
  451. * use external names
  452. * removed all direct assembler modes
  453. Revision 1.54 1999/02/01 00:05:14 florian
  454. + functions lo/hi for DWord type implemented
  455. Revision 1.53 1999/01/29 09:23:09 pierre
  456. * Fillchar(..,..,boolean) added
  457. Revision 1.52 1999/01/22 12:39:23 pierre
  458. + added text arg for dump_stack
  459. Revision 1.51 1999/01/18 10:05:52 pierre
  460. + system_exit procedure added
  461. Revision 1.50 1998/12/28 15:50:46 peter
  462. + stdout, which is needed when you write something in the system unit
  463. to the screen. Like the runtime error
  464. Revision 1.49 1998/12/21 14:28:21 pierre
  465. * HandleError -> HandleErrorFrame to avoid problem in
  466. assembler code in i386.inc
  467. (call to overloaded function in assembler block !)
  468. Revision 1.48 1998/12/18 17:21:33 peter
  469. * fixed io-error handling
  470. Revision 1.47 1998/12/15 22:43:03 peter
  471. * removed temp symbols
  472. Revision 1.46 1998/12/10 23:59:56 peter
  473. * removed warnign
  474. Revision 1.45 1998/12/01 14:00:10 pierre
  475. + added conversion from exceptions into run time error
  476. (only if syswin32 compiled with -ddebug for now !)
  477. * added HandleError(errno,frame)
  478. where you specify the frame
  479. needed for win32 exception handling
  480. Revision 1.44 1998/11/26 23:16:15 jonas
  481. * changed RandSeed and OldRandSeed to Cardinal to avoid negative random numbers
  482. Revision 1.43 1998/11/17 10:36:07 michael
  483. + renamed astrings.pp to astrings.inc
  484. Revision 1.42 1998/11/16 10:21:25 peter
  485. * fixes for H+
  486. Revision 1.41 1998/11/05 10:29:36 pierre
  487. * fix for length(char) in const expressions
  488. Revision 1.40 1998/11/04 20:34:02 michael
  489. + Removed ifdef useansistrings
  490. Revision 1.39 1998/10/12 22:11:28 jonas
  491. * fixed RandSeed bug
  492. Revision 1.38 1998/10/12 12:43:37 florian
  493. * made FPC_HANDLEERROR public
  494. Revision 1.37 1998/10/07 11:40:08 jonas
  495. * changed seed2 and seed3 to cardinal to prevent overflow
  496. Revision 1.36 1998/10/05 12:32:51 peter
  497. + assert() support
  498. Revision 1.35 1998/10/02 09:25:11 peter
  499. * more constant expression evals
  500. Revision 1.34 1998/09/22 15:30:54 peter
  501. * shortstring=string type added
  502. Revision 1.33 1998/09/16 13:08:03 michael
  503. Added AbstractErrorHandler
  504. Revision 1.32 1998/09/16 12:37:07 michael
  505. Added FPC_ prefix to abstracterror
  506. Revision 1.31 1998/09/15 17:12:32 michael
  507. + Merged changes from fixes branch
  508. Revision 1.30 1998/09/14 10:48:20 peter
  509. * FPC_ names
  510. * Heap manager is now system independent
  511. Revision 1.29.2.1 1998/09/15 17:08:43 michael
  512. + Added abstracterror call
  513. Revision 1.29 1998/09/01 17:36:21 peter
  514. + internconst
  515. Revision 1.28 1998/08/17 12:24:16 carl
  516. + important comment added
  517. Revision 1.27 1998/08/13 16:22:11 jonas
  518. * random now returns a value between 0 and max-1 instead of between 0 and max
  519. Revision 1.26 1998/08/11 00:05:26 peter
  520. * $ifdef ver0_99_5 updates
  521. Revision 1.25 1998/07/30 13:26:18 michael
  522. + Added support for ErrorProc variable. All internal functions are required
  523. to call HandleError instead of runerror from now on.
  524. This is necessary for exception support.
  525. Revision 1.24 1998/07/28 20:37:45 michael
  526. + added setjmp/longjmp and exception support
  527. Revision 1.23 1998/07/23 19:53:20 michael
  528. + Adapted assert to Delphi format
  529. Revision 1.22 1998/07/23 13:08:41 michael
  530. + Implemented DO_ASSERT function.
  531. Revision 1.21 1998/07/15 12:09:35 carl
  532. * would not compile under FPC v0.99.5
  533. Revision 1.20 1998/07/13 21:19:12 florian
  534. * some problems with ansi string support fixed
  535. Revision 1.19 1998/07/08 11:56:55 carl
  536. * randon and Random(l) now work correctly - don't touch it works!
  537. Revision 1.18 1998/07/02 13:01:55 carl
  538. * hmmm... it is luck (BSS zeroed with GAS) that DoError and ErrorBase work.
  539. Now they are initilized instead.
  540. Revision 1.17 1998/07/02 12:53:09 carl
  541. * DOERROR RESOTRED! DON'T TOUCH :)
  542. Revision 1.16 1998/07/02 12:11:50 carl
  543. * no SINGLE in m68k and other processors!
  544. Revision 1.15 1998/07/02 09:25:05 peter
  545. * fixed do_error in runtimeerror
  546. Revision 1.14 1998/07/01 15:29:59 peter
  547. * better readln/writeln
  548. Revision 1.13 1998/06/26 08:21:09 daniel
  549. - Doerror removed.
  550. Revision 1.12 1998/06/25 14:04:25 peter
  551. + internal inc/dec
  552. Revision 1.11 1998/06/25 09:44:20 daniel
  553. + RTLLITE directive to compile minimal RTL.
  554. Revision 1.10 1998/06/15 15:16:26 daniel
  555. * RTLLITE conditional added to produce smaller RTL
  556. Revision 1.9 1998/06/10 07:46:45 michael
  557. + Forgot to commit some changes
  558. Revision 1.8 1998/06/08 12:38:24 michael
  559. Implemented rtti, inserted ansistrings again
  560. Revision 1.7 1998/06/04 23:46:01 peter
  561. * comp,extended are only i386 added support_comp,support_extended
  562. Revision 1.6 1998/05/20 11:23:09 cvs
  563. * test commit. Shouldn't be allowed.
  564. Revision 1.5 1998/05/12 10:42:45 peter
  565. * moved getopts to inc/, all supported OS's need argc,argv exported
  566. + strpas, strlen are now exported in the systemunit
  567. * removed logs
  568. * removed $ifdef ver_above
  569. Revision 1.4 1998/04/16 12:30:47 peter
  570. + inc(pchar), dec(pchar), incc(pchar,a),dec(pchar,a)
  571. Revision 1.3 1998/04/08 07:53:32 michael
  572. + Changed Random() function. Moved from system to processor dependent files (from Pedro Gimeno)
  573. }