DIRECTORY PropList, UnsafePropList; PropListImpl: CEDAR PROGRAM IMPORTS UnsafePropList EXPORTS PropList ~ BEGIN OPEN PropList; ListContainer: PUBLIC TYPE = UnsafePropList.PropListContainer; IsPropList: PUBLIC PROC [x: REF] RETURNS [BOOL] = { RETURN [ISTYPE[x, REF ListContainer]] }; NarrowPropList: PUBLIC PROC [x: REF] RETURNS [List] = { RETURN [NARROW[x, REF ListContainer]] }; NewPropList: PUBLIC PROC [] RETURNS [List] = { RETURN [NEW[ListContainer]]; }; GetProp: PUBLIC PROC [list: List, key: REF] RETURNS [REF] = { RETURN [UnsafePropList.GetProp[LOOPHOLE[list], key]] }; PutProp: PUBLIC PROC [list: List, key, val: REF] RETURNS [old: REF] = { old ¬ UnsafePropList.PutProp[LOOPHOLE[list], key, val]; }; RemProp: PUBLIC PROC [list: List, key: REF] RETURNS [old: REF] = { old ¬ UnsafePropList.RemProp[LOOPHOLE[list], key]; }; TrustedAddNewProp: PUBLIC PROC [list: List, key, val: REF] = { UnsafePropList.TrustedAddNewProp[LOOPHOLE[list], key, val]; }; ConditionalPutProp: PUBLIC PROC [list: List, key, expect, new: REF] RETURNS [val: REF, done: BOOL] = { [val, done] _ UnsafePropList.ConditionalPutProp[LOOPHOLE[list], key, expect, new]; }; NiloutPropList: PUBLIC PROC [list: List] = { IF list#NIL THEN UnsafePropList.NiloutPropList[LOOPHOLE[list]]; }; GetPropOrInit: PUBLIC PROC [list: List, key: REF, init: InitializeProcType, data: REF ¬ NIL] RETURNS [val: REF, done: BOOL] = { [val, done] ¬ UnsafePropList.GetPropOrInit[LOOPHOLE[list], key, init, data]; }; Enumerate: PUBLIC PROC [list: List, map: EachPropProc, data: REF] RETURNS [quit: BOOL ¬ FALSE] = { RETURN [UnsafePropList.Enumerate[LOOPHOLE[list], map, data] ]; }; NewCopy: PUBLIC PROC [list: List] RETURNS [copy: List ¬ NEW[ListContainer]] = { IF list#NIL THEN UnsafePropList.CopyPropList[LOOPHOLE[copy], LOOPHOLE[list]]; }; END. Ζ PropListImpl.mesa Copyright Σ 1992 by Xerox Corporation. All rights reserved. Created by Christian Jacobi, April 9, 1992 11:48:58 am PDT Christian Jacobi, April 15, 1992 3:25 pm PDT Copy1: UnsafePropList.EachPropProc = { UnsafePropList.TrustedAddNewProp[LOOPHOLE[data], key, val]; }; NewCopy: PUBLIC PROC [list: List] RETURNS [copy: List ¬ NEW[ListContainer]] = { IF list#NIL THEN [] ¬ UnsafePropList.Enumerate[LOOPHOLE[list], Copy1, copy]; }; Κ[–(cedarcode) style•NewlineDelimiter ™codešœ™Kšœ Οeœ1™K˜—š Ÿ œžœžœžœžœžœ˜3Kšžœžœžœ˜%K˜—š Ÿœžœžœžœžœ ˜7Kšžœžœžœ˜%K˜—šŸ œž œžœ ˜.Kšžœžœ˜K˜—š Ÿœžœžœžœžœžœ˜=Kšžœžœ ˜4K˜—š Ÿœžœžœžœžœžœ˜HKšœžœ˜7Kšœ˜—š Ÿœžœžœžœžœžœ˜BKšœžœ ˜2K˜—šŸœžœžœžœ˜?Kšœ!žœ˜;Kšœ˜—šŸœžœžœ žœžœžœžœ˜fKšœ0žœ˜RK˜—šŸœžœžœ˜,Kšžœžœžœžœ˜?K˜—šŸ œžœžœžœ"žœžœžœžœžœ˜Kšœ+žœ˜LK˜—šŸ œžœžœ'žœžœžœžœ˜bKšžœžœ˜>K˜K˜—šŸœ!™&Kšœ!žœ™;K™—šŸœž œžœžœ™Ošžœžœž™Kšœžœ™;—Kšœ™K™—š Ÿœžœžœžœžœ˜OKš žœžœžœžœžœ˜MKšœ˜—K˜Kšžœ˜K˜—…— -