home *** CD-ROM | disk | FTP | other *** search
-
- { File FORK.INC }
-
- CONST
- CR = ^M;
- Null = ^@;
-
- TYPE
- AnyString = String[255];
-
- VAR
- EnvSegAbs : Integer ABSOLUTE CSeg:$002c; {environment string segment}
-
- FUNCTION DOSErrorMsg(AX : Integer) : Anystring;
-
- VAR
- ErrNumStr : AnyString;
-
- BEGIN { DOSErrorMsg }
-
- CASE AX of
- 1 : DOSErrorMsg := 'Invalid function';
- 2 : DOSErrorMsg := 'File not found';
- 3 : DOSErrorMsg := 'Path not found';
- 4 : DOSErrorMsg := 'Too many file names';
- 5 : DOSErrorMsg := 'Access denied';
- 7 : DOSErrorMsg := 'Arena trashed';
- 8 : DOSErrorMsg := 'Not enough memory';
- 9 : DOSErrorMsg := 'Invalid block';
- 10 : DOSErrorMsg := 'Bad environment';
- 11 : DOSErrorMsg := 'Bad format';
-
- ELSE
- Begin
- Str(AX, ErrNumStr);
- DOSErrorMsg := 'DOS Error ' + ErrNumStr;
- End;
- END; {CASE}
-
- END; {FUNCTION DOSErrorMsg }
-
-
- FUNCTION Fork (ProgName, Cmdline : AnyString ) : Boolean;
-
- TYPE
- RegType = RECORD
- AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags : Integer;
- END;
-
- FCBType = Array[0..36] of Char;
-
- VAR
- Regs : RegType;
- Status : Boolean;
- CmdLen : Byte ABSOLUTE CmdLine;
- FCB1, FCB2 : FCBType;
- ParmBlock : Record
- EnvSeg : Integer;
- CmdPtr : ^AnyString;
- FCB1Ptr : ^FCBType;
- FCB2Ptr : ^FCBType;
- End;
-
- FUNCTION CallDOS (VAR Regs : RegType) : Boolean;
-
- Begin { Function CallDOS }
-
- MsDos(Regs);
- CallDOS := (NOT Odd(Regs.Flags));
-
- End; { Function CallDOS }
-
- PROCEDURE MakeFCB(CmdLine : AnyString; VAR FCB1, FCB2 : FCBType);
-
- VAR
- Regs : RegType;
- DummyFlag : Boolean;
-
- Begin { Procedure MakeFCB }
-
- FillChar( FCB1, SizeOf(FCB1), 0 );
- Regs.AX := $2901;
- Regs.DS := Seg(CmdLine[1]);
- Regs.SI := Ofs(CmdLine[1]);
- Regs.ES := Seg(FCB1);
- Regs.DI := Ofs(FCB1);
- DummyFlag := CallDOS(Regs);
-
- FillChar( FCB2, SizeOf(FCB2), 0 );
- Regs.AX := $2901;
- Regs.ES := Seg(FCB2);
- Regs.DI := Ofs(FCB2);
- DummyFlag := CallDOS(Regs);
-
- End; {Procedure MakeFCB }
-
-
- BEGIN { FUNCTION Fork }
-
- Status := TRUE;
-
- MakeFCB( CmdLine, FCB1, FCB2 );
- ProgName := ProgName + Null;
- CmdLine := ' ' + Cmdline + CR;
- CmdLen := Pred(CmdLen);
- WITH ParmBlock DO
- Begin
- EnvSeg := EnvSegAbs;
- CmdPtr := Addr(CmdLine);
- FCB1Ptr := Addr(FCB1);
- FCB2Ptr := Addr(FCB2);
- End;
-
- Regs.AX := $4b00;
- Regs.BX := Ofs(ParmBlock);
- Regs.DX := Ofs(ProgName[1]);
- Regs.DS := Seg(ProgName[1]);
- Regs.ES := Seg(ParmBlock);
-
- If (NOT CallDOS(Regs)) Then
- Begin
- Status := FALSE;
- Writeln('Unable to run "', ProgName,'" with "', CmdLine,'" : ',
- DOSErrorMsg(Regs.AX));
- End;
-
- Fork := Status;
-
- END; { Function Fork }
-
- { *********************************************************************** }
-
- Function System( AnyCommand : AnyString ) : Boolean;
-
- VAR
- CommandInt : AnyString;
-
- Function GetEnv( SearchName : AnyString ) : AnyString;
-
- TYPE
- EnvArrType = Array[0..32767] of Char;
-
- VAR
- EnvArrPtr : ^EnvArrType;
- Index : Integer;
- FoundName : AnyString;
- FoundValue : AnyString;
-
- BEGIN { Function GetEnv }
-
- EnvArrPtr := Ptr(EnvSegAbs, $0000);
- Index := 0;
- FoundValue := '';
-
- While ((EnvArrPtr^[Index] <> Null) AND (FoundValue = '')) DO
- BEGIN
- FoundName := '';
- WHILE (EnvArrPtr^[Index] <> '=') DO {copy until = sign found}
- Begin
- FoundName := FoundName + EnvArrPtr^[Index];
- Index := Index + 1;
- End;
- IF (FoundName = SearchName) THEN
- Begin
- Index := Index + 1; {advance past = sign}
- While (EnvArrPtr^[Index] <> Null) Do
- Begin
- FoundValue := FoundValue + EnvArrPtr^[Index];
- Index := Index + 1;
- End;
- End
- Else
- Begin
- Repeat
- Index := Index + 1;
- Until (EnvArrPtr^[Index] = Null);
- End;
- End;
-
- GetEnv := FoundValue;
-
- End; { Function GetEnv }
-
-
- Begin { Function System }
-
- System := FALSE;
- CommandInt := GetEnv('COMSPEC');
-
- If (CommandInt = '') Then
- Writeln('** Unable to find DOS Command Interpreter (COMMAND.COM) **')
- Else
- System := Fork(CommandInt, '/C ' + AnyCommand);
-
- End; { Function System }