CoreDirectoryImpl.mesa
Copyright © 1986 by Xerox Corporation. All rights reversed.
Created by Christian Jacobi, July 14, 1986 9:50:03 am PDT
Last Edited by: Jacobi July 15, 1986 9:53:01 am PDT
DIRECTORY
Core USING [CellType],
CoreDirectory,
HashTable,
Rope USING [ROPE, FromRefText];
CoreDirectoryImpl:
CEDAR
PROGRAM
IMPORTS HashTable, Rope
EXPORTS CoreDirectory =
BEGIN
OPEN CoreDirectory;
LibraryNotFound: PUBLIC SIGNAL [name: ROPE] = CODE;
libraries: HashTable.Table ~ HashTable.Create[equal: HashTable.RopeEqual, hash: HashTable.HashRope];
The global name space of library names
RegisterLibrary:
PUBLIC
PROC [library: Library, name:
ROPE]
RETURNS [sameLibrary: Library] = {
sameLibrary ← library;
[] ← HashTable.Store[table: libraries, key: name, value: sameLibrary];
};
FetchLibrary:
PUBLIC PROC [name:
ROPE]
RETURNS [library: Library] = {
WITH HashTable.Fetch[libraries, name].value
SELECT
FROM
lib: Library => RETURN [lib];
ENDCASE => NULL;
SIGNAL LibraryNotFound[name];
};
ForgetLibrary:
PUBLIC PROC [name:
ROPE] = {
[] ← HashTable.Delete[libraries, name];
};
CreateLibrary:
PUBLIC
PROC []
RETURNS [library: Library] = {
library ← HashTable.Create[equal: HashTable.RopeEqual, hash: HashTable.HashRope];
};
GetLib:
PROC [library:
REF]
RETURNS [lib: Library ←
NIL] =
INLINE {
Internal proc to converts Library union ROPE to Library
Either returns good Library or SIGNALS and returns NIL
WITH library
SELECT
FROM
lb: Library => RETURN [lb];
r:
ROPE => {
WITH HashTable.Fetch[libraries, r].value
SELECT
FROM
lb: Library => RETURN [lb];
ENDCASE => SIGNAL LibraryNotFound[r];
};
rt:
REF
TEXT =>
WITH HashTable.Fetch[libraries, Rope.FromRefText[rt]].value
SELECT
FROM
lb: Library => RETURN [lb];
ENDCASE => SIGNAL LibraryNotFound[Rope.FromRefText[rt]];
ENDCASE =>
IF library=NIL THEN SIGNAL LibraryNotFound[NIL] ELSE ERROR;
};
Fetch:
PUBLIC
PROC [library:
REF, key:
ROPE]
RETURNS [ct: CellType ←
NIL] = {
lib: Library ~ GetLib[library];
IF lib#NIL THEN ct ← NARROW [HashTable.Fetch[lib, key].value];
};
Insert:
PUBLIC
PROC [library: Library, key:
ROPE, ct: CellType, overWrite:
BOOL ←
FALSE]
RETURNS [first:
BOOL ←
FALSE] = {
IF library=NIL THEN ERROR;
IF overWrite
THEN {
IF ct#NIL THEN first ← HashTable.Store[library, key, ct]
ELSE first ← HashTable.Delete[library, key]
}
ELSE IF ct#NIL THEN first ← HashTable.Insert[library, key, ct]
};
END.