@database UtilityD
@node Main "UtilityD"

Konstanten

   @{" tagDone " link Modul 28}                     @{" tagEnd " link Modul 29}                      @{" tagFilterAND " link Modul 36}
   @{" tagFilterNOT " link Modul 37}                @{" tagIgnore " link Modul 30}                   @{" tagMore " link Modul 31}
   @{" tagSkip " link Modul 32}                     @{" tagUser " link Modul 34}                     @{" utilityName " link Modul 11}


Typ-Deklarationen

   @{" ClockData " link Modul 39}                   @{" ClockDataPtr " link Modul 45}                @{" Hook " link Modul 51}
   @{" HookProc " link Modul 48}                    @{" HookPtr " link Modul 47}                     @{" Tag " link Modul 14}
   @{" TagItem " link Modul 16}                     @{" TagItemPtr " link Modul 22}                  @{" TagPtr " link Modul 21}


@endnode
@node Modul "TMP:Modula-2/UtilityD.def"
DEFINITION MODULE UtilityD; (*$Implementation:=FALSE*)
(* 26-Feb-1992/cn *)

FROM SYSTEM IMPORT ADDRESS;

FROM ExecD IMPORT
 @{" MinNode " link ExecD/Modul 26};

IMPORT
 R;

CONST
 utilityName="utility.library";

TYPE
 @{" Tag " link UtilityD/Modul 14}=LONGCARD;
 @{" TagItem " link UtilityD/Modul 16}=RECORD
  tag:@{" Tag " link UtilityD/Modul 14};
  data:LONGCARD;
 END;

 @{" TagPtr " link UtilityD/Modul 21}=POINTER TO @{" Tag " link UtilityD/Modul 14};
 @{" TagItemPtr " link UtilityD/Modul 22}=POINTER TO @{" TagItem " link UtilityD/Modul 16};
(*
 Genaugenommen zeigen TagPtr und TagItemPtr meist auf eine Folge von
 Tag bzw. Tagitem.
*)

CONST
 tagDone=@{" Tag " link UtilityD/Modul 14}(0); tagEnd=tagDone;
 tagIgnore=@{" Tag " link UtilityD/Modul 14}(1);
 tagMore=@{" Tag " link UtilityD/Modul 14}(2);
 tagSkip=@{" Tag " link UtilityD/Modul 14}(3);

 tagUser=@{" Tag " link UtilityD/Modul 14}(80000000H);

 tagFilterAND=0;
 tagFilterNOT=1;

TYPE
 @{" ClockData " link UtilityD/Modul 39}=RECORD
  sec,min,hour:CARDINAL;
  mday,month,year:CARDINAL;
  wday:CARDINAL;
 END;
 @{" ClockDataPtr " link UtilityD/Modul 45}=POINTER TO @{" ClockData " link UtilityD/Modul 39};

 @{" HookPtr " link UtilityD/Modul 47}=POINTER TO @{" Hook " link UtilityD/Modul 51};
 @{" HookProc " link UtilityD/Modul 48}=PROCEDURE(HookPtr{R.A0},
                    (*object*)ADDRESS{R.A2},
                    (*message*)ADDRESS{R.A1}):ADDRESS;
 @{" Hook " link UtilityD/Modul 51}=RECORD
  node:@{" MinNode " link ExecD/Modul 26};
  entry:@{" HookProc " link UtilityD/Modul 48};
  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.
*)

END UtilityD.noimp

@endnode
