-- 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;
};
}.