<<>> <> <> <> <> <<>> <> <<>> <> <<>> <> <<>> <> <<>> <> <<>> UnsafePropList: CEDAR DEFINITIONS ~ BEGIN PropListAddr: TYPE = LONG POINTER <>; <> PropListContainer: TYPE = REF ¬ NIL; --Applications may use their own types instead; all which is required is that the type used by the application has the same size, and, initializes to NIL. GetProp: PROC [listAddr: PropListAddr, key: REF] RETURNS [REF]; <> PutProp: PROC [listAddr: PropListAddr, key, val: REF] RETURNS [REF]; <> <> RemProp: PROC [listAddr: PropListAddr, key: REF] RETURNS [REF]; <> ConditionalPutProp: PROC [listAddr: PropListAddr, key, expect, new: REF] RETURNS [val: REF, done: BOOL]; <> InitializeProcType: TYPE ~ PROC [data: REF, key: REF] RETURNS [val: REF ¬ $x]; <> GetPropOrInit: PROC [listAddr: PropListAddr, key: REF, init: InitializeProcType, data: REF ¬ NIL] RETURNS [val: REF, done: BOOL]; <> <> <> EachPropProc: TYPE = PROC [data: REF, key, val: REF] RETURNS [quit: BOOL ¬ FALSE]; <> Enumerate: PROC [listAddr: PropListAddr, map: EachPropProc, data: REF ¬ NIL] RETURNS [quit: BOOL ¬ FALSE]; <> <> TrustedAddNewProp: PROC [listAddr: PropListAddr, key, val: REF]; <> <<1) key was just created with NEW.>> <<2) listAddr­ was just created with NEW and it is initialized by copying another property list using Enumerate.>> <> <<>> NiloutPropList: PROC [listAddr: PropListAddr]; <> CopyPropList: PROC [destAddr, sourceAddr: PropListAddr]; <> <<>> END.