DIRECTORY CedarBaseType USING [TypeIndex, PrintTypeIndex, OrdinalValue, PrintOrdinalValue], CedarBaseValue USING [], IO USING [STREAM, PutF]; CedarBaseValueImpl: CEDAR PROGRAM IMPORTS IO, CedarBaseType EXPORTS CedarBaseValue ~ { OPEN CedarBaseType, IO, CedarBaseType; Value: TYPE ~ REF ValueRep; ValueRep: PUBLIC TYPE ~ RECORD [ typeIndex: TypeIndex, variant: SELECT kind: * FROM var => [], simple => [ordinalValue: OrdinalValue], structure => [valueList: LIST OF Value] ENDCASE ]; SimpleValue: TYPE ~ REF simple ValueRep; StructureValue: TYPE ~ REF structure ValueRep; VarValue: TYPE ~ REF var ValueRep; BuildSimpleValue: PUBLIC PROC [typeIndex: TypeIndex, ordinalValue: OrdinalValue] RETURNS [Value] ~ { RETURN [NEW[ValueRep _ [typeIndex, simple[ordinalValue]] ]]; }; BuildVarValue: PUBLIC PROC [typeIndex: TypeIndex] RETURNS [Value] ~ { RETURN [NEW[ValueRep _ [typeIndex, var[]] ]]; }; IsSimpleValue: PUBLIC PROC [value: Value] RETURNS [BOOLEAN] ~ { RETURN [( value.kind = simple )]; }; IsVarValue: PUBLIC PROC [value: Value] RETURNS [BOOLEAN] ~ { RETURN [( value.kind = var )]; }; PrintSimpleValue: PROC [value: SimpleValue, s: STREAM] ~ { PutF[s, "simple["]; [] _ PrintOrdinalValue[value.ordinalValue, s]; PutF[s, "]"]; }; PrintStructureValue: PROC [value: StructureValue, s: STREAM] ~ { valueList: LIST OF Value _ value.valueList; PutF[s, "structure["]; FOR valueList _ value.valueList, valueList.rest WHILE ( valueList # NIL ) DO IF ( valueList # value.valueList ) THEN PutF[s, ", "]; PrintValue[valueList.first, s]; ENDLOOP; PutF[s, "]"]; }; PrintValue: PUBLIC PROC [value: Value, s: STREAM] ~ { PutF[s, "[type: "]; [] _ PrintTypeIndex[value.typeIndex, s]; PutF[s, " data: "]; WITH value SELECT FROM value: SimpleValue => PrintSimpleValue[value, s]; value: StructureValue => PrintStructureValue[value, s]; value: VarValue => PrintVarValue[value, s]; ENDCASE => ERROR; PutF[s, "]"]; }; PrintVarValue: PROC [value: VarValue, s: STREAM] ~ { PutF[s, "var"]; }; ValueGetOrdinal: PUBLIC PROC [value: Value] RETURNS [OrdinalValue] ~ { WITH value SELECT FROM value: SimpleValue => RETURN [value.ordinalValue]; ENDCASE => ERROR; }; ValueGetType: PUBLIC PROC [value: Value] RETURNS [TypeIndex] ~ { RETURN [value.typeIndex]; }; }... ΈCedarBaseValueImpl.Mesa Copyright Σ 1987 by Xerox Corporation. All rights reserved. Shoup, August 8, 1986 11:10:00 am PDT Bill Jackson (bj) April 11, 1987 1:29:58 am PDT Value Κi– "cedar" style˜codešœ™K™˜QKšœœ˜Kšœœœ˜—K˜šΟnœœ˜!Kšœœ˜Kšœ˜Kšœœ˜&headšœ™Kšœœœ ˜šœ œœœ˜ K˜šœ œ ˜K˜ K˜'Kšœœœ˜'—Kš˜K˜—K˜Kšœ œœ˜(Kšœœœ˜.Kšœ œœ˜"K˜šžœœœ3œ ˜dKšœœ1˜