redir.pp 18 KB

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