home *** CD-ROM | disk | FTP | other *** search
- {
- The following TP code assigns a new Environment to the COMMand.COM
- which is invoked by TP's EXEC Function. In this Case, it is used
- to produce a Dos PROMPT which is different from the one in the Master
- Environment. Control is returned when the user Types Exit ...
- }
-
- { Reduce Retained Memory }
-
- {$M 2048,0,0}
-
- Program NewEnv;
- Uses
- Dos;
- Type
- String128 = String[128];
- Const
- NewPrompt =
- 'PROMPT=$e[32mType Exit to Return to The Fitness Profiler$e[0m$_$_$p$g' + #0;
- Var
- EnvironNew,
- EnvironOld,
- offsetN,
- offsetO,
- SegBytes : Word;
- TextBuff : String128;
- Found,
- Okay : Boolean;
- Reg : Registers;
-
- Function AllocateSeg( BytesNeeded : Word ) : Word;
- begin
- Reg.AH := $48;
- Reg.BX := BytesNeeded div 16;
- MsDos( Reg );
- if Reg.Flags and FCarry <> 0 then
- AllocateSeg := 0
- else
- AllocateSeg := Reg.AX;
- end {AllocateSeg};
-
- Procedure DeAllocateSeg( AllocSeg : Word; Var okay : Boolean );
- begin
- Reg.ES := AllocSeg;
- Reg.AH := $49;
- MsDos( Reg );
- if Reg.Flags and FCarry <> 0 then
- okay := False
- else
- okay := True;
- end {DeAllocateSeg};
-
- Function EnvReadLn( EnvSeg : Word; Var Envoffset : Word ) : String128;
- Var
- tempstr : String128;
- loopc : Byte;
- begin
- loopc := 0;
- Repeat
- inC( loopc );
- tempstr[loopc] := CHR(Mem[EnvSeg:Envoffset]);
- inC( Envoffset );
- Until tempstr[loopc] = #0;
- tempstr[0] := CHR(loopc); {set str length}
- EnvReadLn := tempstr
- end {ReadEnvLn};
-
- Procedure EnvWriteLn( EnvSeg : Word; Var Envoffset : Word;
- AsciizStr : String );
- Var
- loopc : Byte;
- begin
- For loopc := 1 to Length( AsciizStr ) do
- begin
- Mem[EnvSeg:Envoffset] := orD(AsciizStr[loopc]);
- inC( Envoffset )
- end
- end {EnvWriteLn};
-
- begin {main}
- WriteLn(#10,'NewEnv v0.0 Dec.25.91 Greg Vigneault');
- SegBytes := 1024; { size of new environment (up to 32k)}
- EnvironNew := AllocateSeg( SegBytes );
- if EnvironNew = 0 then
- begin { asked For too much memory? }
- WriteLn('Can''t allocate memory segment Bytes.',#7);
- Halt(1)
- end;
- EnvironOld := MemW[ PrefixSeg:$002c ]; { current environ }
- { copy orig env, but change the PROMPT command }
- Found := False;
- offsetO := 0;
- offsetN := 0;
- Repeat { copy one env Var at a time, old env to new env}
- TextBuff := EnvReadLn( EnvironOld, offsetO );
- if offsetO >= SegBytes then
- begin { not enough space? }
- WriteLn('not enough new Environment space',#7);
- DeAllocateSeg( EnvironNew, okay );
- Halt(2) { abort to Dos }
- end;
- { check For the PROMPT command String }
- if Pos('PROMPT=',TextBuff) = 1 then
- begin { prompt command? }
- TextBuff := NewPrompt; { set new prompt }
- Found := True;
- end;
- { now Write the Variable to new environ }
- EnvWriteLn( EnvironNew, offsetN, TextBuff );
- { loop Until all Variables checked/copied }
- Until Mem[EnvironOld:offsetO] = 0;
- { if no prompt command found, create one }
- if not Found then
- EnvWriteLn( EnvironNew, offsetN, NewPrompt );
- Mem[EnvironNew:offsetN] := 0; { delimit new environ}
- MemW[ PrefixSeg:$2c ] := EnvironNew; { activate new env }
- WriteLn( #10, '....Type Exit to return to normal prompt...' );
- SwapVectors;
- Exec( GetEnv('COMSPEC'),'/S'); {shell to Dos w/ new prompt}
- SwapVectors;
- MemW[ PrefixSeg:$2c ] := EnvironOld; { restore original env}
- DeAllocateSeg( EnvironNew, okay );
- if not okay then
- WriteLn( 'Could not release memory!',#7 );
- end {NewEnv}.
- (*******************************************************************)