DEFINITION MODULE UtilityD; (*$Implementation:=FALSE*)
(* 30-May-1993/bp *)

FROM SYSTEM IMPORT ADDRESS,LONGSET;

FROM ExecD IMPORT
 Library,MinNode;

IMPORT
 R;

(* utility.h *)
CONST
  utilityName="utility.library";

TYPE
  UtilityBase=RECORD
    libNode:Library;
    language:SHORTCARD;
    reserved:SHORTCARD;
  END;
  UtilityBasePtr=POINTER TO UtilityBase;

(* tagitem.h *)
TYPE
  Tag=LONGCARD;
  TagItem=RECORD
    tag:Tag;
    CASE :INTEGER OF
    | 0: data:LONGCARD; (* BPTR immer via data!! *)
    | 1: lidata:LONGINT; (* zur Vereinfachung *)
    END;
  END;

  TagPtr=POINTER TO Tag;
  TagItemPtr=POINTER TO TagItem;
(*
 Genaugenommen zeigen TagPtr und TagItemPtr meist auf eine Folge von
 Tag bzw. Tagitem.
*)

CONST
  tagDone=Tag(0); tagEnd=tagDone;
  tagIgnore=Tag(1);
  tagMore=Tag(2);
  tagSkip=Tag(3);

  tagUser=Tag(80000000H);

  tagFilterAND=0;
  tagFilterNOT=1;

  (* für MapTags(): *)
  mapRemoveNotFound=0;
  mapKeepNotFound=1;

  (* für MergeTagItems(): (NICHT DEFINIERT!!!!) *)
  mergeOrList1=0;
  mergeOrList2=1;
  mergeAndList1=2;
  mergeAndList2=3;
  mergeNotList1=4;
  mergeNotList2=5;
  mergeXor=6;

(* date.h *)
TYPE
  ClockData=RECORD
    sec,min,hour:CARDINAL;
    mday,month,year:CARDINAL;
    wday:CARDINAL;
  END;
  ClockDataPtr=POINTER TO ClockData;

(* hooks.h *)
TYPE
  HookPtr=POINTER TO Hook;
  HookProc=PROCEDURE(HookPtr{R.A0},
                     (*object*)ADDRESS{R.A2},
                     (*message*)ADDRESS{R.A1}):ADDRESS;
  Hook=RECORD
    node:MinNode;
    entry:HookProc;
    subEntry:ADDRESS;
    data:ADDRESS;
  END;
(*
 "entry" ist die Prozedur die tatsächlich aufgerufen wird. Bei
 Hochsprachen, die keine Registervariabeln kennen, würde "entry" eine
 Assemblerprozedur enthalten, dass die Register auf den Stack lädt,
 und dann die in "subEntry" eingetragene Prozedur aufruft.

 Da M2Amiga eine Parameterübergabe in den Registern erlaubt, kann
 eine korrekt deklarierte Prozedur direkt in "entry" eingetragen
 werden.
 (siehe auch AmigaLib.def!)
*)

(* name.h *)
TYPE
  (*39*)NamedObject=RECORD
         object:ADDRESS;
        END;
        NamedObjectPtr=POINTER TO NamedObject;
CONST
  (* Tags für AllocNamedObjectA(): *)
  anoNameSpace=4000;
  anoUserSpace=4001;
  anoPriority =4002;
  anoFlags    =4003;

  (* Flag-Bitnummern für anoXXX Tags *)
  nsNoDups=0;
  nsCase=1;

(* pack.h *)
  (* Deklarationen für [Unpack]PackStructureTags(): *)
TYPE
  (* Dies Langwort besteht aus Bitfeldern *)
  PackEntry=RECORD
    CASE :INTEGER OF
    |0: lc:LONGCARD;
    |1: li:LONGINT;
    |2: tagOffset, dataOffset:CARDINAL;
    |3: ls:LONGSET;
    END;
  END;
  PackEntryPtr=POINTER TO PackEntry;

CONST
  pstSigned=31;
  pstUnpack=30;
  pstPack=29;
  pstExists=26;

  pkctrlPackUnpack=LONGSET{};
  pkctrlPackOnly  =LONGSET{30};
  pkctrlUnpackOnly=LONGSET{29};

  pkctrlByte      =LONGSET{31};
  pkctrlWord      =LONGSET{31,27};
  pkctrlLong      =LONGSET{31,28};

  pkctrlUByte     =LONGSET{};
  pkctrlUWord     =LONGSET{27};
  pkctrlULong     =LONGSET{28};

  pkctrlBit       =LONGSET{28,27};
  pkctrlFlipBit   =LONGSET{31,28,27};

END UtilityD.noimp
