(* ------------------------------------------------------------------------
  :Program.       NoFragLib
  :Contents.      Interface to Jan van den Baard's Library
  :Author.        Kai Bolay [kai]
  :Address.       Snail-Mail:              E-Mail:
  :Address.       Hoffmannstraße 168       UUCP: kai@amokle.tynet.sub.org
  :Address.       D-7250 Leonberg 1        FIDO: 2:247/706.3
  :History.       v1.0 [kai] 15-Feb-91 (translated from C)
  :Copyright.     FD
  :Language.      Oberon
  :Translator.    AMIGA OBERON v2.25d
------------------------------------------------------------------------ *)

MODULE NoFragLib;

IMPORT
  Exec, Intuition, SYSTEM;

CONST
  NoFragVersion = 2;
  NoFragRevision = 1;
  NoFragName* = "nofrag.library";

TYPE
  NoFragBasePtr = UNTRACED POINTER TO NoFragBase;
  NoFragBase = STRUCT (libNode: Exec.Library) END;

(*
 * ALL structures following are PRIVATE! DO NOT USE THEM!
 *)

  MemoryBlockPtr = UNTRACED POINTER TO MemoryBlock;
  MemoryBlock = STRUCT
    next, previous: MemoryBlockPtr;
    requirements: LONGSET;
    bytesUsed: LONGINT;
  END;

  MemoryItemPtr = UNTRACED POINTER TO MemoryItem;
  MemoryItem = STRUCT
    next, previous: MemoryItemPtr;
    block: MemoryBlockPtr;
    size: LONGINT;
  END;

  BlockListPtr = UNTRACED POINTER TO BlockList;
  BlockList = STRUCT
    first, end, last: MemoryBlockPtr;
  END;

  ItemListPtr = UNTRACED POINTER TO ItemList;
  ItemList = STRUCT
    first, end, last: MemoryItemPtr;
  END;

(*
 * This structure may only be used to pass on to the library routines!
 * It may ONLY be obtained by a call to "GetMemoryChain()"
 *)

  MemoryChainPtr = UNTRACED POINTER TO MemoryChain;
  MemoryChain = STRUCT
    block: BlockList;
    items: ItemList;
    blockSize: LONGINT;
  END;

CONST
  MinAlloc = SYSTEM.SIZE (MemoryItem);

VAR
  base: NoFragBasePtr;


PROCEDURE GetMemoryChain {base, -30} (blocksize{0}: LONGINT): MemoryChainPtr;
PROCEDURE AllocItem {base, -36} (chain{8}: MemoryChainPtr; size{0}: LONGINT;
                                 requirements{1}: LONGSET): Exec.ADDRESS;
PROCEDURE FreeItem {base, -42} (chain{8}: MemoryChainPtr;
                                memptr{9}: Exec.ADDRESS; size{0}: LONGINT);
PROCEDURE FreeMemoryChain {base, -48} (chain{8}: MemoryChainPtr;
                                       all{0}: BOOLEAN);
PROCEDURE AllocVecItem {base, -54} (chain{8}: MemoryChainPtr; size{0}: LONGINT;
                                    requirements{1}: LONGSET): Exec.ADDRESS;
PROCEDURE FreeVecItem {base, -60} (chain{8}: MemoryChainPtr;
                                   memptr{9}: Exec.ADDRESS);

BEGIN
  base := Exec.OpenLibrary (NoFragName, NoFragVersion);
  IF base = NIL THEN
    IF Intuition.DisplayAlert (Intuition.recoveryAlert,
         "\x00\x64\x14missing nofrag.library v2\o\o", 50) THEN END;
    HALT (20)
  END; (* IF *)
CLOSE
  IF base # NIL THEN
    Exec.CloseLibrary (base);
    base := NIL;
  END; (* IF *)
END NoFragLib.
