<<>> <> <> <> <> <> <> <> <> <> <<>> <<>> DIRECTORY AtomPrivate, ConvertUnsafe, RegisterRefLiteral, Rope, SafeStorage; RegisterRefLiteralImpl: CEDAR MONITOR IMPORTS AtomPrivate, ConvertUnsafe EXPORTS RegisterRefLiteral ~ BEGIN tab: LIST OF TypeCreator ¬ NIL; <> <<>> TypeCreator: TYPE = RECORD [ type: SafeStorage.Type, proc: RegisterRefLiteral.RegisteredProc ]; UnknownType: PUBLIC ERROR [type: SafeStorage.Type, string: LONG STRING] = CODE; Registrar: TYPE = PROC [p: RegisterRefLiteral.RegisteredProc, type: SafeStorage.Type]; ExternalNames: PROC = TRUSTED MACHINE CODE { "^ExternalNames\n"; "Create XR_GetRefLiteral\n"; "RegisterType XR_RegisterRefLiteralCreator\n"; }; RegisterType: PUBLIC ENTRY Registrar ~ { -- aka XR¬RegisterRefLiteralCreator <> <> <<>> FOR l: LIST OF TypeCreator ¬ tab, l.rest UNTIL l=NIL DO IF l.first.type = type THEN {l.first.proc ¬ p; RETURN}; ENDLOOP; tab ¬ CONS[[type: type, proc: p], tab]; }; Uninit: RegisterRefLiteral.RegisteredProc ~ { <> ERROR; }; LookupType: INTERNAL PROC [type: SafeStorage.Type] RETURNS [found: BOOL, p: RegisterRefLiteral.RegisteredProc] ~ { FOR l: LIST OF TypeCreator ¬ tab, l.rest UNTIL l=NIL DO IF l.first.type = type THEN {RETURN[TRUE, l.first.proc]}; ENDLOOP; RETURN[FALSE, Uninit]; }; Creator: TYPE = PROC [type: SafeStorage.Type, string: LONG STRING] RETURNS [REF]; Create: PUBLIC ENTRY Creator ~ { -- aka XR¬GetRefLiteral <> <<>> found: BOOL; p: RegisterRefLiteral.RegisteredProc; <> <> [found, p] ¬ LookupType[type]; IF found THEN RETURN p[string] ELSE { <> RETURN WITH ERROR UnknownType[type, string]; }; }; CreateTEXT: RegisterRefLiteral.RegisteredProc = TRUSTED { RETURN [IF string = NIL THEN NIL ELSE ConvertUnsafe.ToRefText[string]] }; CreateROPE: RegisterRefLiteral.RegisteredProc = TRUSTED { RETURN [IF string = NIL THEN NIL ELSE ConvertUnsafe.ToRope[string]] }; CreateATOM: RegisterRefLiteral.RegisteredProc = TRUSTED { RETURN [AtomPrivate.UnsafeMakeAtomFromString[string]] }; <<>> <<>> <> <<>> ExternalNames[]; RegisterType[CreateROPE, CODE[Rope.ROPE]]; RegisterType[CreateROPE, CODE[Rope.Text]]; RegisterType[CreateTEXT, CODE[REF TEXT]]; RegisterType[CreateATOM, CODE[ATOM]]; END.