home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 09_10 / tricks / environ.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-06-06  |  6.1 KB  |  219 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     ENVIRON.PAS                        *)
  3. (*             Manipulationen am Environment              *)
  4. (*          (c) 1991 Norbert Klimpel & TOOLBOX            *)
  5. (* ------------------------------------------------------ *)
  6. UNIT Environ;
  7.  
  8. {$R-,S-,I-,F-,O-,A-,V-,B-,N-,E-,D-,L-}
  9.  
  10. INTERFACE
  11.  
  12. USES Dos;
  13.  
  14. VAR
  15.   ComspecSeg    : WORD ABSOLUTE $0000:$00BA;
  16.   MasterEnvSeg  : WORD;
  17.   MasterEnvSize : WORD;
  18.  
  19.  
  20.   FUNCTION  GetEnvSize     : WORD;
  21.   FUNCTION  MasterEnvUsed  : WORD;
  22.   FUNCTION  MasterEnvFree  : WORD;
  23.   FUNCTION  MasterEnvCount : WORD;
  24.   FUNCTION  MasterEnvStr(Index  : WORD)   : STRING;
  25.   FUNCTION  GetMasterEnv(EnvVar : STRING) : STRING;
  26.   FUNCTION  SetMasterEnv(EnvVar, NewStr : STRING) : BOOLEAN;
  27.   PROCEDURE SaveMasterEnv;
  28.   PROCEDURE RestoreMasterEnv;
  29.  
  30.  
  31. IMPLEMENTATION
  32.  
  33. CONST
  34.   LastEnvPos  : WORD    = 0;
  35.   EnvPosSaved : BOOLEAN = FALSE;
  36.   EnvBuffer   : POINTER = NIL;
  37.  
  38.  
  39.   FUNCTION UpString(Txt : STRING) : STRING;
  40.   VAR
  41.     i : BYTE;
  42.   BEGIN
  43.     FOR i := 1 TO Length(Txt) DO
  44.       UpString[i] := UpCase(Txt[i]);
  45.     UpString[0] := Txt[0];
  46.   END;
  47.  
  48.   FUNCTION GetEnvSize : WORD;
  49.     (* Größe des Programm-Environments in Byte *)
  50.   VAR
  51.     EnvSeg : WORD;
  52.   BEGIN
  53.     EnvSeg     := MemW[PREFIXSEG:$2C];
  54.     GetEnvSize := MemW[EnvSeg-1:3]*16;
  55.   END;
  56.  
  57.   FUNCTION MasterEnvUsed : WORD;
  58.     (* Belegung des Master-Environments in Byte *)
  59.   VAR
  60.     EnvOfs : WORD;
  61.   BEGIN
  62.     EnvOfs := 0;
  63.     WHILE MemW[MasterEnvSeg:EnvOfs] <> 0 DO INC(EnvOfs);
  64.     MasterEnvUsed := EnvOfs;
  65.   END;
  66.  
  67.   FUNCTION MasterEnvFree : WORD;
  68.   BEGIN
  69.     MasterEnvFree := MasterEnvSize-MasterEnvUsed-4;
  70.   END;
  71.  
  72.   FUNCTION MasterEnvCount : WORD;
  73.     (* Anzahl der Environmentvariablen *)
  74.   VAR
  75.     Count, EnvOfs : WORD;
  76.   BEGIN
  77.     Count := 0;
  78.     FOR EnvOfs := 1 TO MasterEnvUsed DO
  79.       IF MEM[MasterEnvSeg:EnvOfs] = 0 THEN INC(Count);
  80.     MasterEnvCount := Count;
  81.   END;
  82.  
  83.   FUNCTION MasterEnvStr(Index : WORD) : STRING;
  84.    (* Variablenname und -inhalt an der Position Index *)
  85.   VAR
  86.     Count, EnvOfs : WORD;
  87.     ch            : CHAR;
  88.   BEGIN
  89.     MasterEnvStr := '';
  90.     IF Index > 0 THEN BEGIN
  91.       IF EnvPosSaved THEN
  92.         EnvOfs := LastEnvPos
  93.       ELSE BEGIN
  94.         EnvOfs := 0;  Count := 1;
  95.         WHILE Index > Count DO BEGIN
  96.           IF Mem[MasterEnvSeg:EnvOfs] = 0 THEN INC(Count);
  97.           INC(EnvOfs);
  98.         END;
  99.       END;
  100.       Count := 0;  ch := #0;
  101.       REPEAT
  102.         MasterEnvStr[Count] := ch;
  103.         ch := Chr(Mem[MasterEnvSeg:EnvOfs]);
  104.         INC(EnvOfs);  INC(Count);
  105.       UNTIL ch = #0;
  106.       LastEnvPos := EnvOfs;
  107.       MasterEnvStr[0] := Chr(Pred(Count));
  108.     END;
  109.   END;
  110.  
  111.   FUNCTION GetMasterEnv(EnvVar : STRING) : STRING;
  112.     (* Liefert den Inhalt der Variablen EnvVar *)
  113.   VAR
  114.     PosEqu        : BYTE;
  115.     Count, EnvCnt : WORD;
  116.     EnvStr        : STRING;
  117.   BEGIN
  118.     GetMasterEnv := '';
  119.     Count        := 0;
  120.     EnvCnt       := MasterEnvCount;
  121.     EnvVar       := UpString(EnvVar);
  122.     LastEnvPos   := 0;
  123.     EnvPosSaved  := TRUE;
  124.     REPEAT
  125.       INC(Count);
  126.       EnvStr := MasterEnvStr(Count);
  127.       PosEqu := Pos('=', EnvStr);
  128.     UNTIL (Count > EnvCnt) OR
  129.           (Copy(EnvStr, 1, Pred(PosEqu)) = EnvVar);
  130.     EnvPosSaved := FALSE;
  131.     IF Count <= EnvCnt THEN BEGIN
  132.       Delete(EnvStr, 1, PosEqu);
  133.       GetMasterEnv := EnvStr;
  134.     END;
  135.   END;
  136.  
  137.   FUNCTION SetMasterEnv(EnvVar, NewStr : STRING) : BOOLEAN;
  138.     (* Variablen ändern, löschen oder hinzufügen *)
  139.   VAR
  140.     OldStr      : STRING;
  141.     EnvOfs, Len : WORD;
  142.     EnvBuffer   : POINTER;
  143.   BEGIN
  144.     SetMasterEnv := TRUE;
  145.     EnvOfs       := Succ(MasterEnvUsed);
  146.     EnvVar       := UpString(EnvVar);
  147.     OldStr       := GetMasterEnv(EnvVar);
  148.     IF OldStr = '' THEN BEGIN
  149.         (* ----- Neue Variable einfügen ----- *)
  150.       IF NewStr <> '' THEN BEGIN
  151.         NewStr := EnvVar + '=' + NewStr;
  152.         IF (EnvOfs+Length(NewStr)+4) >
  153.                                     MasterEnvSize THEN BEGIN
  154.           SetMasterEnv := FALSE;
  155.           Exit;
  156.         END;
  157.         Move(NewStr[1], Mem[MasterEnvSeg:EnvOfs],
  158.              Length(NewStr));
  159.         INC(EnvOfs, Length(NewStr));
  160.       END;
  161.     END ELSE BEGIN
  162.         (* ----- Existierende Variable ändern ----- *)
  163.       Len := EnvOfs-LastEnvPos;
  164.       GetMem(EnvBuffer, Len);
  165.       Move(Mem[MasterEnvSeg:LastEnvPos], EnvBuffer^, Len);
  166.       EnvOfs := LastEnvPos-
  167.                 (Length(OldStr)+Length(EnvVar)+2);
  168.       IF NewStr <> '' THEN BEGIN
  169.           (* Bei NewStr = '' wird die Variable gelöscht *)
  170.         NewStr := EnvVar + '=' + NewStr;
  171.         IF (EnvOfs+Length(NewStr)+Len+4) >
  172.                                     MasterEnvSize THEN BEGIN
  173.           SetMasterEnv := FALSE;
  174.           Dispose(EnvBuffer);
  175.           Exit;
  176.         END;
  177.         Move(NewStr[1], Mem[MasterEnvSeg:EnvOfs],
  178.              Length(NewStr));
  179.         INC(EnvOfs, Length(NewStr));
  180.         Mem[MasterEnvSeg:EnvOfs] := 0;
  181.         INC(EnvOfs);
  182.       END;
  183.       Move(EnvBuffer^, Mem[MasterEnvSeg:EnvOfs], Len);
  184.       Dispose(EnvBuffer);
  185.       INC(EnvOfs, Len);
  186.     END;
  187.     MemW[MasterEnvSeg:EnvOfs] := 0; { Ende-Kennung }
  188.       { Wer's genau machen will, ersetzt die obige Zeile }
  189.       { durch:  MemL[MasterEnvSeg:EnvOfs] := $00010000;  }
  190.       { Ist jedoch nicht unbedingt notwendig, da DOS     }
  191.       { diesen Wert selbst nachträgt.                    }
  192.   END;
  193.  
  194.   PROCEDURE SaveMasterEnv;
  195.     (* bei vorübergehender Änderung vom Environment *)
  196.   BEGIN
  197.     IF EnvBuffer = NIL THEN BEGIN
  198.       GetMem(EnvBuffer, MasterEnvSize);
  199.       Move(Mem[MasterEnvSeg:0], EnvBuffer^, MasterEnvSize);
  200.     END;
  201.   END;
  202.  
  203.   PROCEDURE RestoreMasterEnv;
  204.   BEGIN
  205.     IF EnvBuffer <> NIL THEN BEGIN
  206.       Move(EnvBuffer^, Mem[MasterEnvSeg:0], MasterEnvSize);
  207.       Dispose(EnvBuffer);
  208.       EnvBuffer := NIL;
  209.     END;
  210.   END;
  211.  
  212. BEGIN
  213.   MasterEnvSeg  := MemW[ComspecSeg:$2C];
  214.   MasterEnvSize := MemW[MasterEnvSeg-1:3]*16;
  215. END.
  216. (* ------------------------------------------------------ *)
  217. (*              Ende von ENVIRON.PAS                      *)
  218.  
  219.