|
@@ -24,13 +24,20 @@ Interface
|
|
{$endif}
|
|
{$endif}
|
|
|
|
|
|
{$ifdef TP}
|
|
{$ifdef TP}
|
|
- {$define in_dos}
|
|
|
|
- {$define usedup}
|
|
|
|
|
|
+{$define implemented}
|
|
{$endif TP}
|
|
{$endif TP}
|
|
{$ifdef Go32v2}
|
|
{$ifdef Go32v2}
|
|
- {$define in_dos}
|
|
|
|
- { $define usedup}
|
|
|
|
|
|
+{$define implemented}
|
|
{$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,19 +60,29 @@ 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
|
|
- Ofs, Seg : Word;
|
|
|
|
- end;
|
|
|
|
|
|
+ Ofs, Seg : Word;
|
|
|
|
+ end;
|
|
|
|
|
|
PHandles = ^THandles;
|
|
PHandles = ^THandles;
|
|
THandles = Array [Byte] of Byte;
|
|
THandles = Array [Byte] of Byte;
|
|
@@ -74,24 +91,24 @@ Type
|
|
|
|
|
|
Var
|
|
Var
|
|
PrefSeg : Word;
|
|
PrefSeg : Word;
|
|
-{$IfDef MsDos}
|
|
|
|
MinBlockSize : Word;
|
|
MinBlockSize : Word;
|
|
MyBlockSize : Word;
|
|
MyBlockSize : Word;
|
|
-{$endif}
|
|
|
|
- F,FE : File;
|
|
|
|
- RedirChanged : Boolean;
|
|
|
|
- RedirErrorChanged : Boolean;
|
|
|
|
|
|
+ Handles : PHandles;
|
|
OldHandle,OldErrorHandle : Byte;
|
|
OldHandle,OldErrorHandle : Byte;
|
|
-{$ifdef UseDUP}
|
|
|
|
|
|
+{$endif TP}
|
|
|
|
+
|
|
|
|
+Var
|
|
|
|
+ F,FE : File;
|
|
|
|
+ RedirChanged : Boolean;
|
|
|
|
+ RedirErrorChanged : Boolean;
|
|
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;
|
|
|
|
- end;
|
|
|
|
|
|
+ exit;
|
|
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
|
|
|
|
- Dup2:=nh
|
|
|
|
- else
|
|
|
|
- Dup2:=-1;
|
|
|
|
|
|
+ If (Regs.Flags and fCarry)<>0 then
|
|
|
|
+ Dup2:=false;
|
|
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;
|
|
|
|
+{$else}
|
|
|
|
+ if dup(StdOutputHandle,TempH) and
|
|
|
|
+ dup2(FileRec(F).Handle,StdOutputHandle) then
|
|
ChangeRedir:=True;
|
|
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;
|
|
|
|
+{$else}
|
|
|
|
+ if dup(StdErrorHandle,TempErrorH) and
|
|
|
|
+ dup2(FileRec(FE).Handle,StdErrorHandle) then
|
|
ChangeErrorRedir:=True;
|
|
ChangeErrorRedir:=True;
|
|
- RedirErrorChanged:=True;
|
|
|
|
|
|
+{$endif}
|
|
|
|
+ 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);
|
|
|
|
- {Mem[prefseg:HandlesOffset+1]:=OldHandle;}
|
|
|
|
|
|
+ dup2(TempH,StdOutputHandle);
|
|
{$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(1,TempErrorH);
|
|
|
|
-{$else UseDUP}
|
|
|
|
- dosmemput(prefseg,HandlesOffset+2,OldErrorHandle,1);
|
|
|
|
- {Mem[prefseg:HandlesOffset+2]:=OldErrorHandle;}
|
|
|
|
-{$endif UseDUP}
|
|
|
|
|
|
+ dup2(TempErrorH,StdErrorHandle);
|
|
{$endif}
|
|
{$endif}
|
|
Close (FE);
|
|
Close (FE);
|
|
RedirErrorChanged:=false;
|
|
RedirErrorChanged:=false;
|
|
@@ -322,28 +312,13 @@ Begin
|
|
End;
|
|
End;
|
|
|
|
|
|
|
|
|
|
-procedure InitRedir;
|
|
|
|
-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}
|
|
|
|
|
|
+{$else not implemented}
|
|
|
|
|
|
|
|
|
|
{*****************************************************************************
|
|
{*****************************************************************************
|
|
- 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
|