{ From: RUUD UPHOFF Refer#: NONE Subj: TPENV.PAS Conf: (1221) F-PASCAL --------------------------------------------------------------------------- } 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.