home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------- *)
- (* SAFEHEAP.PAS *)
- (* (c) 1991 Jeanette Winzenburg & DMV-Verlag *)
- (* ------------------------------------------------- *)
- UNIT SafeHeap;
-
- {$F+,O+}
-
- INTERFACE
-
- FUNCTION SichererHeap : LONGINT;
- (* verfügbarer Heap oberhalb von HeapPtr *)
- FUNCTION MaxSichererBlock : LONGINT;
- (* größter freier Block am Heap *)
-
- IMPLEMENTATION
-
- USES Memory;
-
- TYPE
- pFreeRec = ^tFreeRec;
- tFreeRec = RECORD
- (* Eintrag in die ersten 8 Bytes *)
- (* der Fragmente *)
- Next : pFreeRec;
- Wert : Pointer;
- END;
-
- PtrRec = RECORD
- Lo, Hi : WORD;
- END;
-
- FUNCTION ZeigerWert(Wert : Pointer) : LONGINT;
- BEGIN
- ZeigerWert := LONGINT(PtrRec(Wert).Hi) SHL 4 +
- PtrRec(Wert).Lo;
- END;
-
- FUNCTION ZeigerVergleich(P1, P2 : Pointer) : INTEGER;
- BEGIN
- IF P1 = P2 THEN BEGIN
- ZeigerVergleich := 0;
- Exit;
- END;
- IF ZeigerWert(P1) - ZeigerWert(P2) > 0 THEN
- ZeigerVergleich := +1
- ELSE
- ZeigerVergleich := -1;
- END;
-
- FUNCTION SichererHeap : LONGINT;
- VAR
- Wert : LONGINT;
- BEGIN
- Wert := ZeigerWert(HeapEnd) - ZeigerWert(HeapPtr) -
- LowMemSize SHL 4;
- IF Wert < 0 THEN
- SichererHeap := 0
- ELSE
- SichererHeap := Wert;
- END;
-
- FUNCTION MaxSichererBlock : LONGINT;
- VAR
- P : pFreeRec;
- Wert, Max : LONGINT;
- BEGIN
- P := FreeList;
- Max := 0;
- WHILE (ZeigerVergleich(P, HeapPtr) = -1) DO BEGIN
- Wert := ZeigerWert(P^.Wert);
- IF Max < Wert THEN Max := Wert;
- P := P^.Next;
- END;
- IF (P <> HeapPtr) THEN RunError(255);
- IF Max < SichererHeap THEN
- MaxSichererBlock := SichererHeap
- ELSE
- MaxSichererBlock := Max;
- END;
-
- BEGIN
- END.
- (* ------------------------------------------------- *)
- (* SAFEHEAP.PAS *)
-