<> <> <> <> <> <> <<>> DIRECTORY Core USING [CellType], CoreDirectory, Rope USING [ROPE, FromRefText], SymTab; CoreDirectoryImpl: CEDAR PROGRAM IMPORTS SymTab, Rope EXPORTS CoreDirectory = BEGIN OPEN CoreDirectory; <> libraries: SymTab.Ref ~ SymTab.Create[case: TRUE]; <> <> RegisterLibrary: PUBLIC PROC [library: Library, name: ROPE] RETURNS [sameLibrary: Library] = { sameLibrary _ library; [] _ SymTab.Store[x: libraries, key: name, val: sameLibrary]; }; ForgetLibrary: PUBLIC PROC [name: ROPE] = { [] _ SymTab.Delete[libraries, name]; }; <<>> FetchLibrary: PUBLIC PROC [name: ROPE] RETURNS [library: Library] = { library _ NARROW [SymTab.Fetch[libraries, name].val]; }; <> LibraryNotFound: PUBLIC SIGNAL [name: ROPE] = CODE; CreateLibrary: PUBLIC PROC [] RETURNS [library: Library] = { library _ SymTab.Create[case: TRUE]; }; <> <> GetLib: PROC [library: REF] RETURNS [lib: Library _ NIL] = INLINE { WITH library SELECT FROM lb: Library => RETURN [lb]; r: ROPE => { WITH SymTab.Fetch[libraries, r].val SELECT FROM lb: Library => RETURN [lb]; ENDCASE => SIGNAL LibraryNotFound[r]; }; rt: REF TEXT => WITH SymTab.Fetch[libraries, Rope.FromRefText[rt]].val 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 [SymTab.Fetch[lib, key].val]; }; 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 _ SymTab.Store[library, key, ct] ELSE first _ SymTab.Delete[library, key] } ELSE IF ct#NIL THEN first _ SymTab.Insert[library, key, ct] }; END.