-- File: ArpaAddressCacheImpl.mesa - last edit: -- JAV 25-Feb-87 14:32:10 -- Copyright (C) 1985, 1986, 1987 by Xerox Corporation. All rights reserved. DIRECTORY ArpaAddressCache USING [], ArpaRouter USING [InternetAddress, unknownInternetAddress], Heap USING [Create], String USING [Compare, CopyToNewString]; ArpaAddressCacheImpl: MONITOR IMPORTS ArpaRouter, Heap, String EXPORTS ArpaAddressCache = { Handle: TYPE = LONG POINTER TO Object; Object: TYPE = RECORD[ name: LONG STRING ¬ NIL, addr: ArpaRouter.InternetAddress ¬ ArpaRouter.unknownInternetAddress, next: Handle ¬ NIL]; root, lastEntry: Handle ¬ NIL; zone: UNCOUNTED ZONE ¬ Heap.Create[ initial: 5, increment: 5, largeNodeThreshold: 256]; Flush: PUBLIC ENTRY PROC = { this: Handle ¬ NIL; FOR this ¬ root, root UNTIL this = NIL DO root ¬ this.next; zone.FREE[@this.name]; zone.FREE[@this]; ENDLOOP; root ¬ lastEntry ¬ NIL; }; AddEntry: PUBLIC ENTRY PROC[name: LONG STRING, addr: ArpaRouter.InternetAddress] = { IF lastEntry = NIL THEN root ¬ lastEntry ¬ zone.NEW[Object ¬ [ name: String.CopyToNewString[name, zone], addr: addr, next: NIL]] ELSE { lastEntry.next ¬ zone.NEW[Object ¬ [ name: String.CopyToNewString[name, zone], addr: addr, next: NIL]]; lastEntry ¬ lastEntry.next}; }; Enumerate: PUBLIC PROC[ proc: PROC[name: LONG STRING, addr: ArpaRouter.InternetAddress]] = { FOR i: Handle ¬ root, i.next UNTIL i = NIL DO proc[i.name, i.addr]; ENDLOOP; }; Lookup: PUBLIC PROC[name: LONG STRING] RETURNS [addr: ArpaRouter.InternetAddress, hit: BOOLEAN] = { hit ¬ FALSE; addr ¬ ArpaRouter.unknownInternetAddress; FOR i: Handle ¬ root, i.next UNTIL i = NIL DO IF (String.Compare[name, i.name, TRUE] = 0) THEN RETURN[i.addr, TRUE]; ENDLOOP; }; LookupAddr: PUBLIC PROCEDURE [addr: ArpaRouter.InternetAddress] RETURNS [name: LONG STRING ¬ NIL] = { FOR i: Handle ¬ root, i.next UNTIL i = NIL DO IF addr = i.addr THEN RETURN[i.name]; ENDLOOP; }; }.