home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / extra18 / bufstrm / bufstrea.exe / SAFEHEAP.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1991-12-04  |  2.1 KB  |  86 lines

  1. (* ------------------------------------------------- *)
  2. (*                  SAFEHEAP.PAS                     *)
  3. (*    (c) 1991 Jeanette Winzenburg & DMV-Verlag      *)
  4. (* ------------------------------------------------- *)
  5. UNIT SafeHeap;
  6.  
  7. {$F+,O+}
  8.  
  9. INTERFACE
  10.  
  11.   FUNCTION SichererHeap : LONGINT;
  12.             (* verfügbarer Heap oberhalb von HeapPtr *)
  13.   FUNCTION MaxSichererBlock : LONGINT;
  14.             (* größter freier Block am Heap          *)
  15.  
  16. IMPLEMENTATION
  17.  
  18. USES Memory;
  19.  
  20. TYPE
  21.   pFreeRec = ^tFreeRec;
  22.   tFreeRec = RECORD
  23.                     (* Eintrag in die ersten 8 Bytes *)
  24.                     (* der Fragmente                 *)
  25.                Next : pFreeRec;
  26.                Wert : Pointer;
  27.              END;
  28.  
  29.   PtrRec = RECORD
  30.              Lo, Hi : WORD;
  31.            END;
  32.  
  33.   FUNCTION ZeigerWert(Wert : Pointer) : LONGINT;
  34.   BEGIN
  35.     ZeigerWert := LONGINT(PtrRec(Wert).Hi) SHL 4 +
  36.                           PtrRec(Wert).Lo;
  37.   END;
  38.  
  39.   FUNCTION ZeigerVergleich(P1, P2 : Pointer) : INTEGER;
  40.   BEGIN
  41.     IF P1 = P2 THEN BEGIN
  42.       ZeigerVergleich := 0;
  43.       Exit;
  44.     END;
  45.     IF ZeigerWert(P1) - ZeigerWert(P2) > 0 THEN
  46.       ZeigerVergleich := +1
  47.     ELSE
  48.       ZeigerVergleich := -1;
  49.   END;
  50.  
  51.   FUNCTION SichererHeap : LONGINT;
  52.   VAR
  53.     Wert : LONGINT;
  54.   BEGIN
  55.     Wert := ZeigerWert(HeapEnd) - ZeigerWert(HeapPtr) -
  56.             LowMemSize SHL 4;
  57.     IF Wert < 0 THEN
  58.       SichererHeap := 0
  59.     ELSE
  60.       SichererHeap := Wert;
  61.   END;
  62.  
  63.   FUNCTION MaxSichererBlock : LONGINT;
  64.   VAR
  65.     P         : pFreeRec;
  66.     Wert, Max : LONGINT;
  67.   BEGIN
  68.     P := FreeList;
  69.     Max := 0;
  70.     WHILE (ZeigerVergleich(P, HeapPtr) = -1) DO BEGIN
  71.       Wert := ZeigerWert(P^.Wert);
  72.       IF Max < Wert THEN Max := Wert;
  73.       P := P^.Next;
  74.     END;
  75.     IF (P <> HeapPtr) THEN RunError(255);
  76.     IF Max < SichererHeap THEN
  77.       MaxSichererBlock := SichererHeap
  78.     ELSE
  79.       MaxSichererBlock := Max;
  80.   END;
  81.  
  82. BEGIN
  83. END.
  84. (* ------------------------------------------------- *)
  85. (*                  SAFEHEAP.PAS                     *)
  86.