mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 01:51:49 +01:00 
			
		
		
		
	* dup and dup2 work for go32v2
+ also should work for linux (after linux.pp patch)
This commit is contained in:
		
							parent
							
								
									ebb2c9f47d
								
							
						
					
					
						commit
						1ededfde9a
					
				| @ -24,13 +24,20 @@ Interface | |||||||
| {$endif} | {$endif} | ||||||
| 
 | 
 | ||||||
| {$ifdef TP} | {$ifdef TP} | ||||||
|   {$define in_dos} | {$define implemented} | ||||||
|   {$define usedup} |  | ||||||
| {$endif TP} | {$endif TP} | ||||||
| {$ifdef Go32v2} | {$ifdef Go32v2} | ||||||
|   {$define in_dos} | {$define implemented} | ||||||
|   { $define usedup} |  | ||||||
| {$endif} | {$endif} | ||||||
|  | {$ifdef linux} | ||||||
|  | {$define implemented} | ||||||
|  | {$endif} | ||||||
|  | 
 | ||||||
|  | { be sure msdos is not set for FPC compiler } | ||||||
|  | {$ifdef FPC} | ||||||
|  | {$UnDef MsDos} | ||||||
|  | {$endif FPC} | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| Var | Var | ||||||
|   IOStatus      : Integer; |   IOStatus      : Integer; | ||||||
| @ -53,14 +60,24 @@ Uses | |||||||
| {$ifdef go32v2} | {$ifdef go32v2} | ||||||
|   go32, |   go32, | ||||||
| {$endif go32v2} | {$endif go32v2} | ||||||
|  | {$ifdef linux} | ||||||
|  |   linux, | ||||||
|  | {$endif linux} | ||||||
|   dos; |   dos; | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| {***************************************************************************** | {***************************************************************************** | ||||||
| 				     Dos | 				     Dos | ||||||
| *****************************************************************************} | *****************************************************************************} | ||||||
| 
 | 
 | ||||||
| {$ifdef in_dos} | {$ifdef implemented} | ||||||
|  | 
 | ||||||
|  | {$ifdef TP} | ||||||
|  | 
 | ||||||
|  | const | ||||||
|  |   UnusedHandle    = -1; | ||||||
|  |   StdInputHandle  = 0; | ||||||
|  |   StdOutputHandle = 1; | ||||||
|  |   StdErrorHandle  = 2; | ||||||
| 
 | 
 | ||||||
| Type | Type | ||||||
|   PtrRec = packed record |   PtrRec = packed record | ||||||
| @ -74,24 +91,24 @@ Type | |||||||
| 
 | 
 | ||||||
| Var | Var | ||||||
|   PrefSeg      : Word; |   PrefSeg      : Word; | ||||||
| {$IfDef MsDos} |  | ||||||
|   MinBlockSize : Word; |   MinBlockSize : Word; | ||||||
|   MyBlockSize  : Word; |   MyBlockSize  : Word; | ||||||
| {$endif} |   Handles      : PHandles; | ||||||
|  |   OldHandle,OldErrorHandle    : Byte; | ||||||
|  | {$endif TP} | ||||||
|  | 
 | ||||||
|  | Var | ||||||
|   F,FE	            : File; |   F,FE	            : File; | ||||||
|   RedirChanged      : Boolean; |   RedirChanged      : Boolean; | ||||||
|   RedirErrorChanged : Boolean; |   RedirErrorChanged : Boolean; | ||||||
|   OldHandle,OldErrorHandle    : Byte; |  | ||||||
| {$ifdef UseDUP} |  | ||||||
|   TempH, TempErrorH : longint; |   TempH, TempErrorH : longint; | ||||||
| {$endif} |  | ||||||
| {$ifdef FPC} |  | ||||||
|   HandlesOffset : word; |  | ||||||
| {$else} |  | ||||||
|   Handles      : PHandles; |  | ||||||
| {$endif FPC} |  | ||||||
| 
 | 
 | ||||||
| function dup(fh : longint) : longint; | { For linux the following functions exist | ||||||
|  | Function  Dup(oldfile:longint;var newfile:longint):Boolean; | ||||||
|  | Function  Dup2(oldfile,newfile:longint):Boolean; } | ||||||
|  | {$ifdef go32v2} | ||||||
|  | 
 | ||||||
|  | function dup(fh : longint;var nh : longint) : boolean; | ||||||
|   var |   var | ||||||
|     Regs : Registers; |     Regs : Registers; | ||||||
| 
 | 
 | ||||||
| @ -99,32 +116,31 @@ begin | |||||||
|     Regs.ah:=$45; |     Regs.ah:=$45; | ||||||
|     Regs.bx:=fh; |     Regs.bx:=fh; | ||||||
|     MsDos (Regs); |     MsDos (Regs); | ||||||
|  |     Dup:=true; | ||||||
|     If (Regs.Flags and fCarry)=0 then |     If (Regs.Flags and fCarry)=0 then | ||||||
|       Dup:=Regs.Ax |       nh:=Regs.Ax | ||||||
|     else |     else | ||||||
|       Dup:=-1; |       Dup:=false; | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
| function dup2(fh,nh : longint) : longint; | function dup2(fh,nh : longint) : boolean; | ||||||
|   var |   var | ||||||
|     Regs : Registers; |     Regs : Registers; | ||||||
| 
 | 
 | ||||||
| begin | begin | ||||||
|  |     Dup2:=true; | ||||||
|     If fh=nh then |     If fh=nh then | ||||||
|       begin |  | ||||||
|         dup2:=nh; |  | ||||||
|       exit; |       exit; | ||||||
|       end; |  | ||||||
|     Regs.ah:=$46; |     Regs.ah:=$46; | ||||||
|     Regs.bx:=fh; |     Regs.bx:=fh; | ||||||
|     Regs.cx:=nh; |     Regs.cx:=nh; | ||||||
|     MsDos (Regs); |     MsDos (Regs); | ||||||
|     If (Regs.Flags and fCarry)=0 then |     If (Regs.Flags and fCarry)<>0 then | ||||||
|       Dup2:=nh |       Dup2:=false; | ||||||
|     else |  | ||||||
|       Dup2:=-1; |  | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
|  | {$endif def go32v2} | ||||||
|  | 
 | ||||||
| {$I-} | {$I-} | ||||||
| function FileExist(const FileName : PathStr) : Boolean; | function FileExist(const FileName : PathStr) : Boolean; | ||||||
| var | var | ||||||
| @ -140,7 +156,6 @@ end; | |||||||
| {............................................................................} | {............................................................................} | ||||||
| 
 | 
 | ||||||
| function ChangeRedir(Const Redir : String; AppendToFile : Boolean) : Boolean; | function ChangeRedir(Const Redir : String; AppendToFile : Boolean) : Boolean; | ||||||
|   var temp : byte; |  | ||||||
|   begin |   begin | ||||||
|     ChangeRedir:=False; |     ChangeRedir:=False; | ||||||
|     If Redir = '' then Exit; |     If Redir = '' then Exit; | ||||||
| @ -154,29 +169,20 @@ function ChangeRedir(Const Redir : String; AppendToFile : Boolean) : Boolean; | |||||||
|     RedirError:=IOResult; |     RedirError:=IOResult; | ||||||
|     IOStatus:=RedirError; |     IOStatus:=RedirError; | ||||||
|     If IOStatus <> 0 then Exit; |     If IOStatus <> 0 then Exit; | ||||||
| {$ifdef UseDUP} |  | ||||||
|     TempH:=dup(1); |  | ||||||
|     if dup2(1,FileRec(F).Handle)=FileRec(F).Handle then |  | ||||||
| {$else UseDUP} |  | ||||||
| {$ifndef FPC} | {$ifndef FPC} | ||||||
|     Handles:=Ptr (prefseg, PWord (Ptr (prefseg, $34))^); |     Handles:=Ptr (prefseg, PWord (Ptr (prefseg, $34))^); | ||||||
|     OldHandle:=Handles^[1]; |     OldHandle:=Handles^[1]; | ||||||
|     Handles^[1]:=Handles^[FileRec (F).Handle]; |     Handles^[1]:=Handles^[FileRec (F).Handle]; | ||||||
|   {$else} |  | ||||||
|     DosMemGet(prefseg,HandlesOffset+1,OldHandle,1); |  | ||||||
|     DosMemGet(prefseg,HandlesOffset+FileRec(F).handle,temp,1); |  | ||||||
|     dosmemput(prefseg,HandlesOffset+1,temp,1); |  | ||||||
|     { NO MEM use as %fs is distroyed somewhere !! |  | ||||||
|     OldHandle:=Mem[prefseg:HandlesOffset+1]; |  | ||||||
|     Mem[prefseg:HandlesOffset+1]:=Mem[prefseg:HandlesOffset+FileRec(F).handle];} |  | ||||||
|   {$endif} |  | ||||||
| {$endif UseDUP} |  | ||||||
|     ChangeRedir:=True; |     ChangeRedir:=True; | ||||||
|  | {$else} | ||||||
|  |     if dup(StdOutputHandle,TempH) and | ||||||
|  |        dup2(FileRec(F).Handle,StdOutputHandle) then | ||||||
|  |       ChangeRedir:=True; | ||||||
|  | {$endif def FPC} | ||||||
|      RedirChanged:=True; |      RedirChanged:=True; | ||||||
|   end; |   end; | ||||||
| 
 | 
 | ||||||
| function ChangeErrorRedir(Const Redir : String; AppendToFile : Boolean) : Boolean; | function ChangeErrorRedir(Const Redir : String; AppendToFile : Boolean) : Boolean; | ||||||
|   var temp : byte; |  | ||||||
|   begin |   begin | ||||||
|     ChangeErrorRedir:=False; |     ChangeErrorRedir:=False; | ||||||
|     If Redir = '' then Exit; |     If Redir = '' then Exit; | ||||||
| @ -192,29 +198,21 @@ function ChangeErrorRedir(Const Redir : String; AppendToFile : Boolean) : Boolea | |||||||
|     RedirError:=IOResult; |     RedirError:=IOResult; | ||||||
|     IOStatus:=RedirError; |     IOStatus:=RedirError; | ||||||
|     If IOStatus <> 0 then Exit; |     If IOStatus <> 0 then Exit; | ||||||
| {$ifdef UseDUP} |  | ||||||
|     TempErrorH:=dup(2); |  | ||||||
|     if dup2(2,FileRec(F).Handle)=FileRec(F).Handle then |  | ||||||
| {$else UseDUP} |  | ||||||
| {$ifndef FPC} | {$ifndef FPC} | ||||||
|     Handles:=Ptr (prefseg, PWord (Ptr (prefseg, $34))^); |     Handles:=Ptr (prefseg, PWord (Ptr (prefseg, $34))^); | ||||||
|     OldErrorHandle:=Handles^[2]; |     OldErrorHandle:=Handles^[2]; | ||||||
|     Handles^[2]:=Handles^[FileRec (FE).Handle]; |     Handles^[2]:=Handles^[FileRec (FE).Handle]; | ||||||
|   {$else} |  | ||||||
|     DosMemGet(prefseg,HandlesOffset+2,OldErrorHandle,1); |  | ||||||
|     DosMemGet(prefseg,HandlesOffset+FileRec(F).handle,temp,1); |  | ||||||
|     dosmemput(prefseg,HandlesOffset+1,temp,1); |  | ||||||
|     {OldErrorHandle:=Mem[prefseg:HandlesOffset+2]; |  | ||||||
|     Mem[prefseg:HandlesOffset+2]:=Mem[prefseg:HandlesOffset+FileRec(FE).handle];} |  | ||||||
|   {$endif} |  | ||||||
| {$endif UseDUP} |  | ||||||
|     ChangeErrorRedir:=True; |     ChangeErrorRedir:=True; | ||||||
|  | {$else} | ||||||
|  |     if dup(StdErrorHandle,TempErrorH) and | ||||||
|  |        dup2(FileRec(FE).Handle,StdErrorHandle) then | ||||||
|  |       ChangeErrorRedir:=True; | ||||||
|  | {$endif} | ||||||
|     RedirErrorChanged:=True; |     RedirErrorChanged:=True; | ||||||
|   end; |   end; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| {$IfDef MsDos} | {$IfDef MsDos} | ||||||
| 
 |  | ||||||
| {Set HeapEnd Pointer to Current Used Heapsize} | {Set HeapEnd Pointer to Current Used Heapsize} | ||||||
| Procedure SmallHeap;assembler; | Procedure SmallHeap;assembler; | ||||||
| asm | asm | ||||||
| @ -252,16 +250,12 @@ end; | |||||||
| 
 | 
 | ||||||
|   begin |   begin | ||||||
|     If not RedirChanged then Exit; |     If not RedirChanged then Exit; | ||||||
| {$ifdef UseDUP} |  | ||||||
|     dup2(1,TempH); |  | ||||||
| {$else UseDUP} |  | ||||||
| {$ifndef FPC} | {$ifndef FPC} | ||||||
|     Handles^[1]:=OldHandle; |     Handles^[1]:=OldHandle; | ||||||
|  |     OldHandle:=StdOutputHandle; | ||||||
| {$else} | {$else} | ||||||
|     dosmemput(prefseg,HandlesOffset+1,OldHandle,1); |     dup2(TempH,StdOutputHandle); | ||||||
|     {Mem[prefseg:HandlesOffset+1]:=OldHandle;} |  | ||||||
| {$endif} | {$endif} | ||||||
| {$endif UseDUP} |  | ||||||
|     Close (F); |     Close (F); | ||||||
|     RedirChanged:=false; |     RedirChanged:=false; | ||||||
|   end; |   end; | ||||||
| @ -274,13 +268,9 @@ end; | |||||||
|     If not RedirErrorChanged then Exit; |     If not RedirErrorChanged then Exit; | ||||||
| {$ifndef FPC} | {$ifndef FPC} | ||||||
|     Handles^[2]:=OldErrorHandle; |     Handles^[2]:=OldErrorHandle; | ||||||
|  |     OldErrorHandle:=StdErrorHandle; | ||||||
| {$else} | {$else} | ||||||
| {$ifdef UseDUP} |     dup2(TempErrorH,StdErrorHandle); | ||||||
|     dup2(1,TempErrorH); |  | ||||||
| {$else UseDUP} |  | ||||||
|     dosmemput(prefseg,HandlesOffset+2,OldErrorHandle,1); |  | ||||||
|     {Mem[prefseg:HandlesOffset+2]:=OldErrorHandle;} |  | ||||||
| {$endif UseDUP} |  | ||||||
| {$endif} | {$endif} | ||||||
|     Close (FE); |     Close (FE); | ||||||
|     RedirErrorChanged:=false; |     RedirErrorChanged:=false; | ||||||
| @ -322,28 +312,13 @@ Begin | |||||||
| End; | End; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| procedure InitRedir; | {$else not  implemented} | ||||||
| begin |  | ||||||
| {$ifndef FPC} |  | ||||||
|   PrefSeg:=PrefixSeg; |  | ||||||
| {$else FPC} |  | ||||||
|  {$ifdef go32v2} |  | ||||||
|   PrefSeg:=go32_info_block.linear_address_of_original_psp div 16; |  | ||||||
|   HandlesOffset:=Memw[prefseg:$34]; |  | ||||||
|  {$else } |  | ||||||
|   PrefSeg:=0; |  | ||||||
|  {$endif } |  | ||||||
| {$endif FPC} |  | ||||||
| end; |  | ||||||
| 
 |  | ||||||
| {$endif indos} |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| {***************************************************************************** | {***************************************************************************** | ||||||
| 				 Linux | 				 Linux | ||||||
| *****************************************************************************} | *****************************************************************************} | ||||||
| 
 | 
 | ||||||
| {$ifdef linux} |  | ||||||
| 
 | 
 | ||||||
| function ExecuteRedir (Const ProgName, ComLine, RedirStdOut, RedirStdErr : String) : boolean; | function ExecuteRedir (Const ProgName, ComLine, RedirStdOut, RedirStdErr : String) : boolean; | ||||||
| begin | begin | ||||||
| @ -372,19 +347,21 @@ procedure InitRedir; | |||||||
| begin | begin | ||||||
| end; | end; | ||||||
| 
 | 
 | ||||||
| {$endif linux} | {$endif not implemented} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| {***************************************************************************** | {***************************************************************************** | ||||||
| 				  Initialize | 				  Initialize | ||||||
| *****************************************************************************} | *****************************************************************************} | ||||||
| 
 | 
 | ||||||
| Begin |  | ||||||
|   InitRedir; |  | ||||||
| End. | End. | ||||||
| { | { | ||||||
|   $Log$ |   $Log$ | ||||||
|   Revision 1.8  1999-02-22 02:15:18  peter |   Revision 1.9  1999-02-22 11:12:33  pierre | ||||||
|  |     * dup and dup2 work for go32v2 | ||||||
|  |     + also should work for linux (after linux.pp patch) | ||||||
|  | 
 | ||||||
|  |   Revision 1.8  1999/02/22 02:15:18  peter | ||||||
|     + default extension for save in the editor |     + default extension for save in the editor | ||||||
|     + Separate Text to Find for the grep dialog |     + Separate Text to Find for the grep dialog | ||||||
|     * fixed redir crash with tp7 |     * fixed redir crash with tp7 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 pierre
						pierre