[comp.lang.pascal] setting the prompt

pilgrimk@lafcol.UUCP (Kenwyn A. Pilgrim) (05/16/89)

Some time ago in the dark ages I posted a request for a solution
to setting the prompt in DOS. I've come up with something but 
I'm not sure whether it's foolproof, but it has worked in every
instance I've used it so far. 

Basically what I did was modify the environment which the CALLING
program inherited from DOS (in this case, the prompt string.)
Then, when a child process is called, it would then inherit the 
modified environment of the calling program.

Thought I'd share this with you all:

---------------------- CUT HERE -------------------------------
{$M 8092,0,0}
uses Dos;
var
 EnvAddr: word;
 i : byte;
 Ch : char;

function GetStr(i: byte): string;
 {I think this function is available in TP50.                 }
 {It's used here only to be nice, i.e. reset the prompt to    }
 {its original value. I'm not even sure that this is necessary}
 var
  EnvAddr: word;
  NumMark: byte;
  Index  : integer;
  S: string;
 begin
  Move(Ptr(PrefixSeg,$2C)^,EnvAddr,SizeOf(word));
  Index := 0; NumMark := 0;
  repeat
   Move(Ptr(EnvAddr,Index)^,Ch,1);
   Inc(Index);
   if Ch=#0 then Inc(NumMark)
  until NumMark=i;
  S := '';
  if i=0 then Dec(Index);
  repeat
   Move(Ptr(EnvAddr,Index)^,Ch,1);
   S := S+Ch;
   Inc(Index);
  until Ch=#0;
  GetStr := S
 end;

procedure ModifyPrompt(S: String);
 var NumMark: byte;
  EnvAddr: word; Index: integer;
 begin
  S := S + #0; {zero-byte terminates string}
  Move(Ptr(PrefixSeg,$2C)^,EnvAddr,SizeOf(word));
  {$2C is the offset at which the environment address is found}
  NumMark := 0; Index := 0;
  repeat
   Move(Ptr(EnvAddr,Index)^,Ch,1);
   Inc(Index);
   if Ch=#0 then Inc(NumMark)
  until NumMark=2;
  {I assume that the prompt string is the 3rd string.}
  Move(S[1],Ptr(EnvAddr,Index)^,Length(S))
  {S[0] contains length and should not be included}
 end;
var
 OrigPrompt: string;
begin
 OrigPrompt := GetStr(2);
 ModifyPrompt('PROMPT=type Exit to return to MENU $_'+Copy(OrigPrompt,8,Length(OrigPrompt)));
 Exec('c:\command.com','');
 ModifyPrompt(OrigPrompt);
end.

{------------------------ cut here too ----------------}

Possible problems:

If the prompt string isn't the last string in the environment and 
it's length is increased, other important info may be destroyed.

Also if (as I assumed) the prompt is not the third string in the 
environment, this will not work. If anyone has another solution,
please post, since I am in need of a truly-known bug free
ModifyPrompt procedure (mine relies on too many assumptions).

(Is any of this code necessary or is it already part of TP50?)

Thanks
-Kenwyn