CoreProperties.mesa 
Copyright © 1985 by Xerox Corporation. All rights reversed.
Barth, October 2, 1985 11:30:37 am PDT
Spreitzer, August 12, 1985 6:05:07 pm PDT
Bertrand Serlet November 8, 1985 6:43:12 pm PST
DIRECTORY Core, CoreClasses;
CoreProperties: CEDAR DEFINITIONS = BEGIN OPEN Core;
Theory
This interface deals with properties.
Operations
GetProp: PROC [from: Properties, prop: ATOM] RETURNS [value: REF ANYNIL];
If value is NIL then no such property.
PutProp: PROC [on: Properties, prop: ATOM, value: REF ANYNIL] RETURNS [new: Properties];
If value is NIL then the property is deleted.
CopyProps: PROC [propList: Properties] RETURNS [copy: Properties];
Uses the property-property propCopy to copy each item.
AppendProps: PROC [winner, loser: Properties] RETURNS [copy: Properties];
Uses the property-property propCopy to copy each item.
Enumerate: PROC [props: Properties, consume: PROC [prop: ATOM, val: REF ANYNIL]];
PrintProperties: PROC [props: Properties, out: STREAM, depth: NAT ← 0];
Uses the property-property propPrettyPrint to print each item.
Registration
RegisterProperty: PROC [prop: ATOM, properties: Properties ← NIL] RETURNS [sameProp: ATOM];
Should be called by every tool which uses a property. Sets the properties proterties as given in the second argument. Returns the argument so that definition and registration can occur in the same line of Cedar code.
StoreProperties: PROC [prop: ATOM, properties: Properties];
To store properties on properties.
FetchProperties: PROC [prop: ATOM] RETURNS [properties: Properties];
To fetch properties on properties.
propPrint, propCopy, propCompare: ATOM;
Values should be REFs to procs of the appropriate TYPEs.
No PropCompareProc means pointer comparison.
No PropCopyProc means don't copy the property.
No PropWriteProc means don't write the property.
PropCompareProc: TYPE = PROC [prop: ATOM, value1, value2: REF ANY] RETURNS [equal: BOOLFALSE];
PropCopyProc: TYPE = PROC [prop: ATOM, value: REF ANY] RETURNS [valCopy: REF ANY];
If valCopy is NIL then don't copy.
PropPrintProc: TYPE = PROC [to: STREAM, prop: ATOM, val: REF ANY, depth: NAT];
PropDoCopy: REF PropCopyProc; -- Copy of the value; trivial procedure;
PropDontPrint: REF PropPrintProc; -- Does not print anything
PropRopeCompare: REF PropCompareProc;
PropIntCompare: REF PropCompareProc;
Short Cuts
PropertyLiteral: TYPE = RECORD [key: ATOM, val: REF ANYNIL];
Props: PROC [lit1, lit2, lit3, lit4, lit5, lit6: PropertyLiteral ← []] RETURNS [properties: Properties];
GetWireProp: PROC [from: Wire, prop: ATOM] RETURNS [value: REF ANYNIL];
PutWireProp: PROC [on: Wire, prop: ATOM, value: REF ANYNIL];
GetCellTypeProp: PROC [from: CellType, prop: ATOM] RETURNS [value: REF ANYNIL];
PutCellTypeProp: PROC [on: CellType, prop: ATOM, value: REF ANYNIL];
GetCellInstanceProp: PROC [from: CoreClasses.CellInstance, prop: ATOM] RETURNS [value: REF ANYNIL];
PutCellInstanceProp: PROC [on: CoreClasses.CellInstance, prop: ATOM, value: REF ANYNIL];
END.