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.