home *** CD-ROM | disk | FTP | other *** search
- {
- > Who has PTENV.PAS
-
- Here is how it works:
- }
- UNIT SetEnvir;
-
- INTERFACE
-
-
- USES
- DOS;
-
-
- TYPE
- EnvSize = 0..16383;
-
-
- PROCEDURE SetEnv(EnvVar, Value : STRING);
-
- {-----------------------------------------------------------------------
- This procedure may be used to setup or change environment variables
- in the environment of the resident copy of COMMAND.COM or 4DOS.COM
-
- Note that this will be the ACTIVE copy of the command interpreter, NOT
- the primary copy!
-
- This unit is not tested under DR-DOS.
-
- Any call of SetEnv must be followed by checking ioresult. The procedure
- may return error 8 (out of memory) on too less space in te environment.
- -----------------------------------------------------------------------}
-
- IMPLEMENTATION
-
- PROCEDURE SetEnv(EnvVar, Value : STRING);
- VAR
- Link,
- PrevLink,
- EnvirP : word;
- Size,
- Scan,
- Where,
- Dif : integer;
- NewVar,
- OldVar,
- Test : STRING;
-
- FUNCTION CheckSpace(Wanted : integer) : boolean;
- BEGIN
- IF wanted + Scan > Size THEN
- inoutres := 8;
- CheckSpace := inoutres = 0;
- END;
-
- BEGIN
- IF inoutres >0 THEN
- Exit;
- FOR Scan := 1 TO Length(EnvVar) DO
- EnvVar[Scan] := UpCase(EnvVar[Scan]);
- EnvVar := EnvVar + '=';
- NewVar := EnvVar + Value + #0;
- link := PrefixSeg;
-
- REPEAT
- PrevLink := Link;
- Link := memw [link : $16];
- UNTIL Link = prevlink;
-
- EnvirP := memw [Link : $2C];
- Size := memw [Envirp - 1 : $03] * 16;
- Scan := 0;
- Where := -1;
- WHILE mem[EnvirP : Scan] <> 0 DO
- BEGIN
- move(mem[EnvirP : scan], Test[1], 255);
- Test[0] := #255;
- Test[0] := chr(pos(#0, Test));
- IF pos(EnvVar, Test) = 1 THEN
- BEGIN
- Where := Scan;
- OldVar := Test;
- END;
- Scan := Scan + Length(Test);
- END;
-
- IF Where = -1 THEN
- BEGIN
- Where := Scan;
- NewVar := NewVar + #0#0#0;
- IF NOT CheckSpace(Length(NewVar)) THEN
- Exit;
- END
- ELSE
- BEGIN
- Dif := Length(NewVar) - Length(OldVar);
- IF Dif > 0 THEN
- BEGIN
- IF NOT CheckSpace(Dif) THEN
- Exit;
- move(mem[EnvirP : Where], mem[EnvirP : Where + Dif], Scan - Where + 3);
- END
- ELSE
- IF Dif < 0 THEN
- move(mem[EnvirP : Where - Dif], mem[EnvirP : Where], Size - Where + Dif);
- END;
-
- move(NewVar[1], mem[EnvirP : Where], Length(NewVar));
- END;
-
- END.
-