home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / oberon / oephone.mod < prev    next >
Text File  |  1991-02-24  |  2KB  |  86 lines

  1. (* Phone number recording   
  2.    (Oberon Example) (c) Copyright E. R. Videki 1991 *)
  3. MODULE OEPhone ;
  4.     IMPORT OETree , OEIO ;
  5.  
  6.  
  7. (* this module is structured much like OENames.Mod, which has more comments
  8. about what is going on *)
  9.  
  10.  
  11. CONST MaxPhone * = 20 ;    
  12.  
  13.       PrtPhone * = 1 ;    (* command we will handle in our record nodes *)
  14.  
  15.  
  16. TYPE    PhoneData * = ARRAY MaxPhone OF CHAR ;
  17.     PhonePtr * = POINTER TO Phone ;
  18.     Phone * =     
  19.         RECORD(OETree.Apple)
  20.             phone *  : PhoneData 
  21.         END ;
  22.  
  23.  
  24. VAR PhoneTree *  : PhonePtr ;
  25.     refnode : PhonePtr ;
  26.  
  27.  
  28. PROCEDURE * Handler ( p : OETree.ApplePtr ;  cmd : INTEGER );
  29. BEGIN
  30.     IF cmd = PrtPhone THEN
  31.         OEIO.WriteString(   p(PhonePtr).phone  )
  32.     END
  33. END Handler;
  34.  
  35.  
  36.  
  37. PROCEDURE * PhoneSearch(p,ref:OETree.ApplePtr;  VAR result:INTEGER); 
  38. VAR i:INTEGER;
  39. BEGIN
  40.     IF p IS PhonePtr THEN
  41.         WITH p : PhonePtr DO
  42.             WITH ref : PhonePtr DO
  43.                 i := 0 ;
  44.                 WHILE (i < MaxPhone) & (p.phone[i] # 0X) & 
  45.                     (p.phone[i] = ref.phone[i]) DO INC(i) END;
  46.                 result := ORD(ref.phone[i]) - ORD(p.phone[i])
  47.             END
  48.         END
  49.     ELSE result := -1 
  50.     END
  51. END PhoneSearch ;
  52.  
  53.  
  54.  
  55. PROCEDURE NewPhone * ( p : PhonePtr ;  VAR result : INTEGER) ;
  56. BEGIN
  57.     p.method := Handler ;
  58.     OETree.AddNew( PhoneTree, p , result, PhoneSearch) 
  59. END NewPhone;
  60.  
  61.  
  62. PROCEDURE FindPhone * (VAR ph : PhoneData ;  VAR result:INTEGER;  VAR p : PhonePtr );
  63. VAR p1 : OETree.ApplePtr ;
  64. BEGIN
  65.     refnode.phone := ph ;
  66.     OETree.Search( PhoneTree, refnode, p1, result, PhoneSearch);
  67.     IF result = 0 THEN p := p1(PhonePtr)
  68.         (* expand scope for caller, from that of OETree's result *)
  69.     ELSE p := NIL
  70.     END
  71. END FindPhone;
  72.  
  73.  
  74. PROCEDURE Init;
  75. VAR result : INTEGER;
  76. BEGIN
  77.     NEW(refnode);  refnode.phone[0] := 0X ;
  78.     NEW(PhoneTree); PhoneTree.phone[0] := 0X;
  79.     PhoneTree.refptr := NIL;   PhoneTree.method := Handler ;
  80.     OETree.AddNew(NIL,PhoneTree,result,PhoneSearch)    (*set links in OETree's private flds*)
  81. END Init;
  82.  
  83. BEGIN Init
  84. END OEPhone.
  85.  
  86.