<> <> <> <> RCMap: DEFINITIONS = BEGIN <> Base: TYPE = LONG BASE POINTER; Limit: CARDINAL = 40000B; -- plenty ? Object: TYPE = RECORD [ map: SELECT type: * FROM <> null => [], ref => [], controlLink => [], oneRef => [ offset: [0..componentLength) _ 0], simple => [ length: [0..simpleLength] _ 0, refs: PACKED ARRAY [0..simpleLength) OF BOOL _ ALL[FALSE]], nonVariant => [ complete: BOOL _ FALSE, nComponents: [0..componentLength/2) _ 0, components: ARRAY [0..0) OF RCField], variant => [ <> complete: BOOL _ FALSE, nVariants: [0..componentLength/2) _ 0, fdTag: FieldDescriptor _ [], variants: ARRAY [0..0) OF Index -- indexed by tag value ], array => [ wordsPerElement: [0..componentLength) _ 0, nElements: CARDINAL _ 0, rcmi: Index _ nullIndex ], sequence => [ wordsPerElement: [0..componentLength) _ 0, fdLength: FieldDescriptor _ [], -- actual number of elements is stored here commonPart: Index _ nullIndex, dataOffset: CARDINAL _ 0, -- actual data begins here rcmi: Index _ nullIndex ], ENDCASE]; RCField: TYPE = RECORD [ <> wordOffset: CARDINAL _ 0|NULL, rcmi: Index _ nullIndex|NULL ]; FieldDescriptor: TYPE = RECORD [ wordOffset: INTEGER _ 0, bitFirst: [0..15] _ 0, -- 4 bits bitCount: [1..32] _ 1, -- 5 bits fill: [0..177B] _ 0 -- 7 bits ]; Index: TYPE = Base RELATIVE POINTER [0..Limit) TO Object; VIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO variant Object; NVIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO nonVariant Object; AIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO array Object; SeqIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO sequence Object; SimpIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO simple Object; OneRefIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO oneRef Object; NullIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO null Object; RefIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO ref Object; ControlLinkIndex: TYPE = Base RELATIVE POINTER [0..Limit) TO controlLink Object; <> componentMaxIndex: CARDINAL = LAST[CARDINAL]/16; <> componentLength: CARDINAL = componentMaxIndex+1; simpleMaxIndex: CARDINAL = 7; -- 4 bits for Object.type, 4 for length, 8 BOOLEANs simpleLength: CARDINAL = simpleMaxIndex+1; invalidIndex: Index = LAST[Index]; -- guaranteed to be an invalid Index nullIndex: NullIndex = LOOPHOLE[0]; -- always at index 0 in the Base refIndex: RefIndex = LOOPHOLE[1]; -- always at index 1 in the Base controlLinkIndex: ControlLinkIndex = LOOPHOLE[2]; -- always at index 2 in the Base END.