home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / oberon / loader / terminator.mod < prev    next >
Text File  |  1977-12-31  |  2KB  |  111 lines

  1. IMPLEMENTATION MODULE Terminator;
  2.  
  3. FROM SYSTEM IMPORT ADDRESS;
  4.  
  5. IMPORT Heap;
  6.  
  7. TYPE
  8.  ProcNodePtr=POINTER TO ProcNode;
  9.  ProcNode=RECORD
  10.   tp:TermProc;
  11.   ud:UserData;
  12.   next:ProcNodePtr;
  13.  END;
  14.  ReferenceInfo=RECORD
  15.   next:Reference;
  16.   procedures:ProcNodePtr;
  17.  END;
  18.  Reference=POINTER TO ReferenceInfo;
  19.  
  20. VAR
  21.  cleanupList:Reference;
  22.  
  23. PROCEDURE Add(tp:TermProc; ud:UserData; ref:Reference):Reference;
  24. VAR
  25.  node:ProcNodePtr;
  26. BEGIN
  27.  Heap.Allocate(node,SIZE(ProcNode));
  28.  IF node=NIL THEN
  29.   RETURN newReference;
  30.  ELSE
  31.   node^.tp:=tp;
  32.   node^.ud:=ud;
  33.   IF ref=newReference THEN
  34.    Heap.Allocate(ref,SIZE(ReferenceInfo));
  35.    IF ref=NIL THEN
  36.     Heap.Deallocate(node);
  37.     RETURN newReference;
  38.    ELSE
  39.     ref^.next:=cleanupList;
  40.     ref^.procedures:=NIL;
  41.     cleanupList:=ref;
  42.    END;
  43.   END;
  44.   node^.next:=ref^.procedures;
  45.   ref^.procedures:=node;
  46.  END;
  47.  RETURN ref;
  48. END Add;
  49.  
  50. PROCEDURE Remove(VAR ref:Reference);
  51. VAR
  52.  pre:Reference;
  53.  node,next:ProcNodePtr;
  54. BEGIN
  55.  IF ref#NIL THEN
  56.   IF ref=cleanupList THEN
  57.    cleanupList:=ref^.next;
  58.   ELSE
  59.    pre:=cleanupList;
  60.    WHILE (pre#NIL) & (pre^.next#ref) DO pre:=pre^.next; END;
  61.    IF pre#NIL THEN
  62.     pre^.next:=ref^.next;
  63.    END;
  64.   END;
  65.   node:=ref^.procedures;
  66.   Heap.Deallocate(ref);
  67.   ref:=newReference;
  68.   WHILE node#NIL DO
  69.    next:=node^.next;
  70.    Heap.Deallocate(node);
  71.    node:=next;
  72.   END;
  73.  END;
  74. END Remove;
  75.  
  76. PROCEDURE Use(VAR ref:Reference);
  77. VAR
  78.  pre:Reference;
  79.  node,next:ProcNodePtr;
  80. BEGIN
  81.  IF ref#NIL THEN
  82.   IF ref=cleanupList THEN
  83.    cleanupList:=ref^.next;
  84.   ELSE
  85.    pre:=cleanupList;
  86.    WHILE (pre#NIL) & (pre^.next#ref) DO pre:=pre^.next; END;
  87.    IF pre#NIL THEN
  88.     pre^.next:=ref^.next;
  89.    END;
  90.   END;
  91.   node:=ref^.procedures;
  92.   Heap.Deallocate(ref);
  93.   ref:=newReference;
  94.   WHILE node#NIL DO
  95.    node^.tp(node^.ud);
  96.    next:=node^.next;
  97.    Heap.Deallocate(node);
  98.    node:=next;
  99.   END;
  100.  END;
  101. END Use;
  102.  
  103. VAR
  104.  ref:Reference;
  105. BEGIN
  106.  cleanupList:=NIL;
  107. CLOSE
  108.  WHILE cleanupList#NIL DO ref:=cleanupList; Use(ref); END;
  109. END Terminator.
  110.  
  111.