<> <> <> <> <<>> 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]; <> 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 { <> <> 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.