redir.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Test Suite
  4. Copyright (c) 1999-2000 by Pierre Muller
  5. Unit to redirect output and error to files
  6. Adapted from code donated to public domain by Schwartz Gabriel 20/03/1993
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. Unit Redir;
  14. Interface
  15. {$R-}
  16. {$ifndef Linux}
  17. {$ifndef Unix}
  18. {$S-}
  19. {$endif}
  20. {$endif}
  21. {$ifdef TP}
  22. {$define implemented}
  23. {$endif TP}
  24. {$ifdef Go32v2}
  25. {$define implemented}
  26. {$endif}
  27. {$ifdef Win32}
  28. {$define implemented}
  29. {$endif}
  30. {$ifdef linux}
  31. {$define implemented}
  32. {$endif}
  33. { be sure msdos is not set for FPC compiler }
  34. {$ifdef FPC}
  35. {$UnDef MsDos}
  36. {$endif FPC}
  37. Var
  38. IOStatus : Integer;
  39. RedirErrorOut,RedirErrorIn,
  40. RedirErrorError : Integer;
  41. ExecuteResult : Word;
  42. {------------------------------------------------------------------------------}
  43. procedure InitRedir;
  44. function ExecuteRedir (Const ProgName, ComLine, RedirStdIn, RedirStdOut, RedirStdErr : String) : boolean;
  45. procedure DosExecute(ProgName, ComLine : String);
  46. function ChangeRedirOut(Const Redir : String; AppendToFile : Boolean) : Boolean;
  47. procedure RestoreRedirOut;
  48. procedure DisableRedirOut;
  49. procedure EnableRedirOut;
  50. function ChangeRedirIn(Const Redir : String) : Boolean;
  51. procedure RestoreRedirIn;
  52. procedure DisableRedirIn;
  53. procedure EnableRedirIn;
  54. function ChangeRedirError(Const Redir : String; AppendToFile : Boolean) : Boolean;
  55. procedure RestoreRedirError;
  56. procedure DisableRedirError;
  57. procedure EnableRedirError;
  58. procedure RedirDisableAll;
  59. procedure RedirEnableAll;
  60. Implementation
  61. Uses
  62. {$ifdef go32v2}
  63. go32,
  64. {$endif go32v2}
  65. {$ifdef win32}
  66. windows,
  67. {$endif win32}
  68. {$ifdef unix}
  69. {$ifdef ver1_0}
  70. linux,
  71. {$else}
  72. unix,
  73. {$endif}
  74. {$endif unix}
  75. dos;
  76. Const
  77. {$ifdef UNIX}
  78. DirSep='/';
  79. {$else UNIX}
  80. DirSep='\';
  81. {$endif UNIX}
  82. var
  83. FIN,FOUT,FERR : ^File;
  84. RedirChangedOut,
  85. RedirChangedIn : Boolean;
  86. RedirChangedError : Boolean;
  87. InRedirDisabled,OutRedirDisabled,ErrorRedirDisabled : Boolean;
  88. {*****************************************************************************
  89. Helpers
  90. *****************************************************************************}
  91. function FixPath(const s:string):string;
  92. var
  93. i : longint;
  94. begin
  95. { Fix separator }
  96. for i:=1 to length(s) do
  97. if s[i] in ['/','\'] then
  98. fixpath[i]:=DirSep
  99. else
  100. fixpath[i]:=s[i];
  101. fixpath[0]:=s[0];
  102. end;
  103. {*****************************************************************************
  104. Dos
  105. *****************************************************************************}
  106. {$ifdef implemented}
  107. {$ifdef TP}
  108. {$ifndef win32}
  109. const
  110. UnusedHandle = -1;
  111. StdInputHandle = 0;
  112. StdOutputHandle = 1;
  113. StdErrorHandle = 2;
  114. {$endif win32}
  115. Type
  116. PtrRec = packed record
  117. Ofs, Seg : Word;
  118. end;
  119. PHandles = ^THandles;
  120. THandles = Array [Byte] of Byte;
  121. PWord = ^Word;
  122. Var
  123. MinBlockSize : Word;
  124. MyBlockSize : Word;
  125. Handles : PHandles;
  126. PrefSeg : Word;
  127. OldHandleOut,OldHandleIn,OldHandleError : Byte;
  128. {$endif TP}
  129. var
  130. TempHOut, TempHIn,TempHError : longint;
  131. { For linux the following functions exist
  132. Function Dup(oldfile:longint;var newfile:longint):Boolean;
  133. Function Dup2(oldfile,newfile:longint):Boolean;
  134. Function fdClose(fd:longint):boolean;
  135. }
  136. {$ifdef go32v2}
  137. function dup(fh : longint;var nh : longint) : boolean;
  138. var
  139. Regs : Registers;
  140. begin
  141. Regs.ah:=$45;
  142. Regs.bx:=fh;
  143. MsDos (Regs);
  144. Dup:=true;
  145. If (Regs.Flags and fCarry)=0 then
  146. nh:=Regs.Ax
  147. else
  148. Dup:=false;
  149. end;
  150. function dup2(fh,nh : longint) : boolean;
  151. var
  152. Regs : Registers;
  153. begin
  154. Dup2:=true;
  155. If fh=nh then
  156. exit;
  157. Regs.ah:=$46;
  158. Regs.bx:=fh;
  159. Regs.cx:=nh;
  160. MsDos (Regs);
  161. If (Regs.Flags and fCarry)<>0 then
  162. Dup2:=false;
  163. end;
  164. Function FdClose (Handle : Longint) : boolean;
  165. var Regs: registers;
  166. begin
  167. Regs.Eax := $3e00;
  168. Regs.Ebx := Handle;
  169. MsDos(Regs);
  170. FdClose:=(Regs.Flags and fCarry)=0;
  171. end;
  172. {$endif def go32v2}
  173. {$ifdef win32}
  174. Function FdClose (Handle : Longint) : boolean;
  175. begin
  176. { Do we need this ?? }
  177. FdClose:=true;
  178. end;
  179. {$endif}
  180. {$ifdef TP}
  181. Function FdClose (Handle : Longint) : boolean;
  182. begin
  183. { if executed as under GO32 this hangs the DOS-prompt }
  184. FdClose:=true;
  185. end;
  186. {$endif}
  187. {$I-}
  188. function FileExist(const FileName : PathStr) : Boolean;
  189. var
  190. f : file;
  191. Attr : word;
  192. begin
  193. Assign(f, FileName);
  194. GetFAttr(f, Attr);
  195. FileExist := DosError = 0;
  196. end;
  197. {............................................................................}
  198. function ChangeRedirOut(Const Redir : String; AppendToFile : Boolean) : Boolean;
  199. begin
  200. ChangeRedirOut:=False;
  201. If Redir = '' then Exit;
  202. Assign (FOUT^, Redir);
  203. If AppendToFile and FileExist(Redir) then
  204. Begin
  205. Reset(FOUT^,1);
  206. Seek(FOUT^,FileSize(FOUT^));
  207. End else Rewrite (FOUT^);
  208. RedirErrorOut:=IOResult;
  209. IOStatus:=RedirErrorOut;
  210. If IOStatus <> 0 then Exit;
  211. {$ifndef FPC}
  212. Handles:=Ptr (prefseg, PWord (Ptr (prefseg, $34))^);
  213. OldHandleOut:=Handles^[StdOutputHandle];
  214. Handles^[StdOutputHandle]:=Handles^[FileRec (FOUT^).Handle];
  215. ChangeRedirOut:=True;
  216. OutRedirDisabled:=False;
  217. {$else}
  218. {$ifdef win32}
  219. if SetStdHandle(Std_Output_Handle,FileRec(FOUT^).Handle) then
  220. {$else not win32}
  221. if dup(StdOutputHandle,TempHOut) and
  222. dup2(FileRec(FOUT^).Handle,StdOutputHandle) then
  223. {$endif not win32}
  224. begin
  225. ChangeRedirOut:=True;
  226. OutRedirDisabled:=False;
  227. end;
  228. {$endif def FPC}
  229. RedirChangedOut:=True;
  230. end;
  231. function ChangeRedirIn(Const Redir : String) : Boolean;
  232. begin
  233. ChangeRedirIn:=False;
  234. If Redir = '' then Exit;
  235. Assign (FIN^, Redir);
  236. Reset(FIN^,1);
  237. RedirErrorIn:=IOResult;
  238. IOStatus:=RedirErrorIn;
  239. If IOStatus <> 0 then Exit;
  240. {$ifndef FPC}
  241. Handles:=Ptr (prefseg, PWord (Ptr (prefseg, $34))^);
  242. OldHandleIn:=Handles^[StdInputHandle];
  243. Handles^[StdInputHandle]:=Handles^[FileRec (FIN^).Handle];
  244. ChangeRedirIn:=True;
  245. InRedirDisabled:=False;
  246. {$else}
  247. {$ifdef win32}
  248. if SetStdHandle(Std_Input_Handle,FileRec(FIN^).Handle) then
  249. {$else not win32}
  250. if dup(StdInputHandle,TempHIn) and
  251. dup2(FileRec(FIN^).Handle,StdInputHandle) then
  252. {$endif not win32}
  253. begin
  254. ChangeRedirIn:=True;
  255. InRedirDisabled:=False;
  256. end;
  257. {$endif def FPC}
  258. RedirChangedIn:=True;
  259. end;
  260. function ChangeRedirError(Const Redir : String; AppendToFile : Boolean) : Boolean;
  261. begin
  262. ChangeRedirError:=False;
  263. If Redir = '' then Exit;
  264. Assign (FERR^, Redir);
  265. If AppendToFile and FileExist(Redir) then
  266. Begin
  267. Reset(FERR^,1);
  268. Seek(FERR^,FileSize(FERR^));
  269. End else Rewrite (FERR^);
  270. RedirErrorError:=IOResult;
  271. IOStatus:=RedirErrorError;
  272. If IOStatus <> 0 then Exit;
  273. {$ifndef FPC}
  274. Handles:=Ptr (prefseg, PWord (Ptr (prefseg, $34))^);
  275. OldHandleError:=Handles^[StdErrorHandle];
  276. Handles^[StdErrorHandle]:=Handles^[FileRec (FERR^).Handle];
  277. ChangeRedirError:=True;
  278. ErrorRedirDisabled:=False;
  279. {$else}
  280. {$ifdef win32}
  281. if SetStdHandle(Std_Error_Handle,FileRec(FERR^).Handle) then
  282. {$else not win32}
  283. if dup(StdErrorHandle,TempHError) and
  284. dup2(FileRec(FERR^).Handle,StdErrorHandle) then
  285. {$endif not win32}
  286. begin
  287. ChangeRedirError:=True;
  288. ErrorRedirDisabled:=False;
  289. end;
  290. {$endif}
  291. RedirChangedError:=True;
  292. end;
  293. {$IfDef MsDos}
  294. {Set HeapEnd Pointer to Current Used Heapsize}
  295. Procedure SmallHeap;assembler;
  296. asm
  297. mov bx,word ptr HeapPtr
  298. shr bx,4
  299. inc bx
  300. add bx,word ptr HeapPtr+2
  301. mov ax,PrefixSeg
  302. sub bx,ax
  303. mov es,ax
  304. mov ah,4ah
  305. int 21h
  306. end;
  307. {Set HeapEnd Pointer to Full Heapsize}
  308. Procedure FullHeap;assembler;
  309. asm
  310. mov bx,word ptr HeapEnd
  311. shr bx,4
  312. inc bx
  313. add bx,word ptr HeapEnd+2
  314. mov ax,PrefixSeg
  315. sub bx,ax
  316. mov es,ax
  317. mov ah,4ah
  318. int 21h
  319. end;
  320. {$EndIf MsDos}
  321. procedure RestoreRedirOut;
  322. begin
  323. If not RedirChangedOut then Exit;
  324. {$ifndef FPC}
  325. Handles^[StdOutputHandle]:=OldHandleOut;
  326. OldHandleOut:=StdOutputHandle;
  327. {$else}
  328. {$ifdef win32}
  329. SetStdHandle(Std_Output_Handle,StdOutputHandle);
  330. {$else not win32}
  331. dup2(TempHOut,StdOutputHandle);
  332. {$endif not win32}
  333. {$endif FPC}
  334. Close (FOUT^);
  335. fdClose(TempHOut);
  336. RedirChangedOut:=false;
  337. end;
  338. {............................................................................}
  339. procedure RestoreRedirIn;
  340. begin
  341. If not RedirChangedIn then Exit;
  342. {$ifndef FPC}
  343. Handles^[StdInputHandle]:=OldHandleIn;
  344. OldHandleIn:=StdInputHandle;
  345. {$else}
  346. {$ifdef win32}
  347. SetStdHandle(Std_Input_Handle,StdInputHandle);
  348. {$else not win32}
  349. dup2(TempHIn,StdInputHandle);
  350. {$endif not win32}
  351. {$endif}
  352. Close (FIn^);
  353. fdClose(TempHIn);
  354. RedirChangedIn:=false;
  355. end;
  356. {............................................................................}
  357. procedure DisableRedirIn;
  358. begin
  359. If not RedirChangedIn then Exit;
  360. If InRedirDisabled then Exit;
  361. {$ifndef FPC}
  362. Handles^[StdInputHandle]:=OldHandleIn;
  363. {$else}
  364. {$ifdef win32}
  365. SetStdHandle(Std_Input_Handle,StdInputHandle);
  366. {$else not win32}
  367. dup2(TempHIn,StdInputHandle);
  368. {$endif not win32}
  369. {$endif}
  370. InRedirDisabled:=True;
  371. end;
  372. {............................................................................}
  373. procedure EnableRedirIn;
  374. begin
  375. If not RedirChangedIn then Exit;
  376. If not InRedirDisabled then Exit;
  377. {$ifndef FPC}
  378. Handles:=Ptr (prefseg, PWord (Ptr (prefseg, $34))^);
  379. Handles^[StdInputHandle]:=Handles^[FileRec (FIn^).Handle];
  380. {$else}
  381. {$ifdef win32}
  382. SetStdHandle(Std_Input_Handle,FileRec(FIn^).Handle);
  383. {$else not win32}
  384. dup2(FileRec(FIn^).Handle,StdInputHandle);
  385. {$endif not win32}
  386. {$endif}
  387. InRedirDisabled:=False;
  388. end;
  389. {............................................................................}
  390. procedure DisableRedirOut;
  391. begin
  392. If not RedirChangedOut then Exit;
  393. If OutRedirDisabled then Exit;
  394. {$ifndef FPC}
  395. Handles^[StdOutputHandle]:=OldHandleOut;
  396. {$else}
  397. {$ifdef win32}
  398. SetStdHandle(Std_Output_Handle,StdOutputHandle);
  399. {$else not win32}
  400. dup2(TempHOut,StdOutputHandle);
  401. {$endif not win32}
  402. {$endif}
  403. OutRedirDisabled:=True;
  404. end;
  405. {............................................................................}
  406. procedure EnableRedirOut;
  407. begin
  408. If not RedirChangedOut then Exit;
  409. If not OutRedirDisabled then Exit;
  410. {$ifndef FPC}
  411. Handles:=Ptr (prefseg, PWord (Ptr (prefseg, $34))^);
  412. Handles^[StdOutputHandle]:=Handles^[FileRec (FOut^).Handle];
  413. {$else}
  414. {$ifdef win32}
  415. SetStdHandle(Std_Output_Handle,FileRec(FOut^).Handle);
  416. {$else not win32}
  417. dup2(FileRec(FOut^).Handle,StdOutputHandle);
  418. {$endif not win32}
  419. {$endif}
  420. OutRedirDisabled:=False;
  421. end;
  422. {............................................................................}
  423. procedure RestoreRedirError;
  424. begin
  425. If not RedirChangedError then Exit;
  426. {$ifndef FPC}
  427. Handles^[StdErrorHandle]:=OldHandleError;
  428. OldHandleError:=StdErrorHandle;
  429. {$else}
  430. {$ifdef win32}
  431. SetStdHandle(Std_Error_Handle,StdErrorHandle);
  432. {$else not win32}
  433. dup2(TempHError,StdErrorHandle);
  434. {$endif not win32}
  435. {$endif}
  436. Close (FERR^);
  437. fdClose(TempHError);
  438. RedirChangedError:=false;
  439. end;
  440. {............................................................................}
  441. procedure DisableRedirError;
  442. begin
  443. If not RedirChangedError then Exit;
  444. If ErrorRedirDisabled then Exit;
  445. {$ifndef FPC}
  446. Handles^[StdErrorHandle]:=OldHandleError;
  447. {$else}
  448. {$ifdef win32}
  449. SetStdHandle(Std_Error_Handle,StdErrorHandle);
  450. {$else not win32}
  451. dup2(TempHError,StdErrorHandle);
  452. {$endif not win32}
  453. {$endif}
  454. ErrorRedirDisabled:=True;
  455. end;
  456. {............................................................................}
  457. procedure EnableRedirError;
  458. begin
  459. If not RedirChangedError then Exit;
  460. If not ErrorRedirDisabled then Exit;
  461. {$ifndef FPC}
  462. Handles:=Ptr (prefseg, PWord (Ptr (prefseg, $34))^);
  463. Handles^[StdErrorHandle]:=Handles^[FileRec (FErr^).Handle];
  464. {$else}
  465. {$ifdef win32}
  466. SetStdHandle(Std_Error_Handle,FileRec(FErr^).Handle);
  467. {$else not win32}
  468. dup2(FileRec(FERR^).Handle,StdErrorHandle);
  469. {$endif not win32}
  470. {$endif}
  471. ErrorRedirDisabled:=False;
  472. end;
  473. {............................................................................}
  474. function ExecuteRedir (Const ProgName, ComLine, RedirStdIn, RedirStdOut, RedirStdErr : String) : boolean;
  475. Begin
  476. RedirErrorOut:=0; RedirErrorIn:=0; RedirErrorError:=0;
  477. ExecuteResult:=0;
  478. IOStatus:=0;
  479. if RedirStdIn<>'' then
  480. ChangeRedirIn(RedirStdIn);
  481. if RedirStdOut<>'' then
  482. ChangeRedirOut(RedirStdOut,false);
  483. if RedirStdErr<>'stderr' then
  484. ChangeRedirError(RedirStdErr,false);
  485. DosExecute(ProgName,ComLine);
  486. RestoreRedirOut;
  487. RestoreRedirIn;
  488. RestoreRedirError;
  489. ExecuteRedir:=(IOStatus=0) and (RedirErrorOut=0) and
  490. (RedirErrorIn=0) and (RedirErrorError=0) and
  491. (ExecuteResult=0);
  492. End;
  493. {............................................................................}
  494. procedure RedirDisableAll;
  495. begin
  496. If RedirChangedIn and not InRedirDisabled then
  497. DisableRedirIn;
  498. If RedirChangedOut and not OutRedirDisabled then
  499. DisableRedirOut;
  500. If RedirChangedError and not ErrorRedirDisabled then
  501. DisableRedirError;
  502. end;
  503. {............................................................................}
  504. procedure RedirEnableAll;
  505. begin
  506. If RedirChangedIn and InRedirDisabled then
  507. EnableRedirIn;
  508. If RedirChangedOut and OutRedirDisabled then
  509. EnableRedirOut;
  510. If RedirChangedError and ErrorRedirDisabled then
  511. EnableRedirError;
  512. end;
  513. procedure InitRedir;
  514. begin
  515. {$ifndef FPC}
  516. PrefSeg:=PrefixSeg;
  517. {$endif FPC}
  518. end;
  519. {$else not implemented}
  520. {*****************************************************************************
  521. Fake
  522. *****************************************************************************}
  523. function ExecuteRedir (Const ProgName, ComLine, RedirStdIn, RedirStdOut, RedirStdErr : String) : boolean;
  524. begin
  525. ExecuteRedir:=false;
  526. end;
  527. function ChangeRedirOut(Const Redir : String; AppendToFile : Boolean) : Boolean;
  528. begin
  529. ChangeRedirOut:=false;
  530. end;
  531. procedure RestoreRedirOut;
  532. begin
  533. end;
  534. procedure DisableRedirOut;
  535. begin
  536. end;
  537. procedure EnableRedirOut;
  538. begin
  539. end;
  540. function ChangeRedirIn(Const Redir : String) : Boolean;
  541. begin
  542. ChangeRedirIn:=false;
  543. end;
  544. procedure RestoreRedirIn;
  545. begin
  546. end;
  547. procedure DisableRedirIn;
  548. begin
  549. end;
  550. procedure EnableRedirIn;
  551. begin
  552. end;
  553. function ChangeRedirError(Const Redir : String; AppendToFile : Boolean) : Boolean;
  554. begin
  555. ChangeRedirError:=false;
  556. end;
  557. procedure RestoreRedirError;
  558. begin
  559. end;
  560. procedure DisableRedirError;
  561. begin
  562. end;
  563. procedure EnableRedirError;
  564. begin
  565. end;
  566. procedure RedirDisableAll;
  567. begin
  568. end;
  569. procedure RedirEnableAll;
  570. begin
  571. end;
  572. procedure InitRedir;
  573. begin
  574. end;
  575. {$endif not implemented}
  576. {............................................................................}
  577. procedure DosExecute(ProgName, ComLine : String);
  578. {$ifdef win32}
  579. var
  580. StoreInherit : BOOL;
  581. {$endif win32}
  582. Begin
  583. {$IfDef MsDos}
  584. SmallHeap;
  585. {$EndIf MsDos}
  586. SwapVectors;
  587. { Must use shell() for linux for the wildcard expansion (PFV) }
  588. {$ifdef UNIX}
  589. IOStatus:=0;
  590. ExecuteResult:=Shell(FixPath(Progname)+' '+Comline);
  591. { Signal that causes the stop of the shell }
  592. IOStatus:=ExecuteResult and $7F;
  593. { Exit Code seems to be in the second byte,
  594. is this also true for BSD ??
  595. $80 bit is a CoreFlag apparently }
  596. ExecuteResult:=(ExecuteResult and $ff00) shr 8;
  597. {$else}
  598. {$ifdef win32}
  599. StoreInherit:=ExecInheritsHandles;
  600. ExecInheritsHandles:=true;
  601. {$endif win32}
  602. DosError:=0;
  603. Dos.Exec (Getenv('COMSPEC'),'/C '+FixPath(progname)+' '+Comline);
  604. {$ifdef win32}
  605. ExecInheritsHandles:=StoreInherit;
  606. {$endif win32}
  607. IOStatus:=DosError;
  608. ExecuteResult:=DosExitCode;
  609. {$endif}
  610. SwapVectors;
  611. {$ifdef CPU86}
  612. { reset the FPU }
  613. {$asmmode att}
  614. asm
  615. fninit
  616. end;
  617. {$endif CPU86}
  618. {$IfDef MsDos}
  619. Fullheap;
  620. {$EndIf MsDos}
  621. End;
  622. {*****************************************************************************
  623. Initialize
  624. *****************************************************************************}
  625. initialization
  626. New(FIn); New(FOut); New(FErr);
  627. finalization
  628. Dispose(FIn); Dispose(FOut); Dispose(FErr);
  629. End.
  630. {
  631. $Log$
  632. Revision 1.6 2001-07-01 20:13:50 peter
  633. * udpated for dos
  634. Revision 1.5 2001/02/03 00:13:34 peter
  635. * linux -> unix for not 1.0.x compilers
  636. Revision 1.4 2000/12/10 12:08:11 peter
  637. * win32 and go32v2 updates
  638. Revision 1.3 2000/11/30 22:38:22 peter
  639. * renamed test suite
  640. Revision 1.1 2000/11/29 23:14:20 peter
  641. * new testsuite setup
  642. }