home *** CD-ROM | disk | FTP | other *** search
- {$A+,B-,F-,L-,N-,O-,R-,S-,V-}
-
- Unit prompt;
-
- {
-
- Author: Trevor J Carlsen
- PO Box 568
- Port Hedland
- Western Australia 6721
- 61-[0]-91-73-2026 (voice)
- 61-[0]-91-73-2930 (data )
-
- Released into the public domain.
-
- This Unit will automatically create a predefined prompt when shelling to Dos.
- if you wish to create your own custom prompt, all that is required is to give
- the Variable NewPrompt another value and call the Procedure ChangeShellPrompt.
-
- }
-
- Interface
-
- Uses Dos;
-
- Var
- NewPrompt : String;
-
- Procedure ChangeShellPrompt(Nprompt: String);
-
- Implementation
-
- Type
- EnvArray = Array[0..32767] of Byte;
- EnvPtr = ^EnvArray;
- Var
- EnvSize, EnvLen, EnvPos: Word;
- NewEnv, OldEnv : EnvPtr;
- TempStr : String;
- x : Word;
-
- Procedure ChangeShellPrompt(Nprompt: String);
-
- Function MainEnvSize: Word;
- Var
- x : Word;
- found : Boolean;
- begin
- found := False; x := 0;
- Repeat
- if (OldEnv^[x] = 0) and (OldEnv^[x+1] = 0) then
- found := True
- else
- inc(x);
- Until found;
- MainEnvSize := x - 1;
- end; { MainEnvSize}
-
- Procedure AddEnvStr(Var s; Var offset: Word; len: Word);
- Var st : EnvArray Absolute s;
- begin
- move(st[1],NewEnv^[offset],len);
- inc(offset,len+1);
- end;
-
- begin
- OldEnv := ptr(MemW[PrefixSeg:$2C],0);
- { this gets the actual starting segment of the current Program's env }
-
- EnvSize := MemW[seg(OldEnv^)-1:3] shl 4;
- { Find the size of the current environment }
-
- if MaxAvail < (EnvSize+256) then begin
- Writeln('Insufficient memory');
- halt;
- end;
-
- GetMem(NewEnv, EnvSize + $100);
- if ofs(NewEnv^) <> 0 then begin
- inc(LongInt(NewEnv),$10000 + ($10000 * (LongInt(NewEnv) div 16)));
- LongInt(NewEnv) := LongInt(NewEnv) and $ffff0000;
- end;
- FillChar(NewEnv^,EnvSize + $100,0);
- { Allocate heap memory For the new environment adding enough to allow }
- { alignment to a paraGraph boundary or a longer prompt than the default }
- { and initialise to nuls }
- EnvPos := 0;
-
- AddEnvStr(Nprompt,EnvPos,length(Nprompt));
- For x := 1 to EnvCount do begin
- TempStr := EnvStr(x);
- if TempStr <> GetEnv('PROMPT') then
- AddEnvStr(TempStr,EnvPos,length(TempStr));
- end; { For }
- inc(EnvPos);
- { Transfer old env Strings except the prompt to new environment }
-
- if lo(DosVersion) > 2 then
- AddEnvStr(OldEnv^[MainEnvSize + 2],EnvPos,EnvSize-(MainEnvSize + 2));
- { Add the rest of the environment }
-
- MemW[PrefixSeg:$2C] := seg(NewEnv^);
- { let the Program know where the new environment is }
- end; { ChangeShellPrompt }
-
- end. { prompt }
-