redir.pp 18 KB

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