<> <> <> <> <<>> FilingAttributes: PROGRAM 10 VERSION 5 = BEGIN DEPENDS UPON CHName (2) VERSION 0, Time(15) VERSION 2; <> AttributeType: TYPE = LONG CARDINAL; Attribute: TYPE = RECORD [type: AttributeType, value: AttributeValue]; AttributeSequence: TYPE = SEQUENCE OF Attribute; AttributeValue: TYPE = SEQUENCE OF UNSPECIFIED; Time: TYPE = Time.Time; -- seconds User: TYPE = CHName.Name; AccessSequence: TYPE = SEQUENCE 5 OF AccessType; AccessType: TYPE = { read(0), write(1), owner(2), -- all files add(3), remove(4), -- directories only fullAccess(177777B) }; AccessEntrySequence: TYPE = SEQUENCE OF AccessEntry; Interpretation: TYPE = { interpretationNone(0), boolean(1), cardinal(2), longCardinal(3), time(4), integer(5), longInteger(6), string(7) }; <> InterpretedAttributeType: TYPE = { checksum(0), childrenUniquelyNamed(1), createdBy(2), createdOn(3), fileID(4), isDirectory(5), isTemporary(6), modifiedBy(7), modifiedOn(8), name(9), numberOfChildren(10), ordering(11), parentID(12), position(13), readBy(14), readOn(15), dataSize(16), type(17), version(18), accessList(19), defaultAccessList(20), pathname(21), unused22(22), unused23(23), unused24(24), unused25(25), storedSize(26), subtreeSize(27), subtreeSizeLimit(28) }; InterpretedAttribute: TYPE = CHOICE InterpretedAttributeType OF { checksum => Checksum, -- (0), childrenUniquelyNamed => ChildrenUniquelyNamed, -- (1), createdBy => CreatedBy, -- (2), createdOn => CreatedOn, -- (3), fileID => FileID, -- (4), isDirectory => IsDirectory, -- (5), isTemporary => IsTemporary, -- (6), modifiedBy => ModifiedBy, -- (7), modifiedOn => ModifiedOn, -- (8), name => Name, -- (9), numberOfChildren => NumberOfChildren, -- (10), ordering => Ordering, -- (11), parentID => ParentID, -- (12), position => Position, -- (13), readBy => ReadBy, -- (14), readOn => ReadOn, -- (15), dataSize => DataSize, -- (16), type => Type, -- (17), version => Version, -- (18), accessList => AccessList, -- (19), defaultAccessList => DefaultAccessList, -- (20), pathname => Pathname, -- (21), unused22 => Unused, -- (22), unused23 => Unused, -- (23), unused24 => Unused, -- (24), unused25 => Unused, -- (25), storedSize => StoredSize, -- (26), subtreeSize => SubtreeSize, -- (27), subtreeSizeLimit => SubtreeSizeLimit -- (28) }; <> AccessEntry: TYPE = RECORD [key: User, access: AccessSequence]; AccessList: TYPE = RECORD [entries: AccessEntrySequence, defaulted: BOOLEAN]; <> Checksum: TYPE = CARDINAL; unknownChecksum: Checksum = 177777B; <> ChildrenUniquelyNamed: TYPE = BOOLEAN; <> CreatedBy: TYPE = User; <> CreatedOn: TYPE = Time; <> DataSize: TYPE = LONG CARDINAL; <> DefaultAccessList: TYPE = AccessList; <> FileID: TYPE = ARRAY 5 OF UNSPECIFIED; nullFileID: FileID = [0, 0, 0, 0, 0]; <> IsDirectory: TYPE = BOOLEAN; <> IsTemporary: TYPE = BOOLEAN; <> ModifiedBy: TYPE = User; <> ModifiedOn: TYPE = Time; name: AttributeType = 9; -- name relative to parent Name: TYPE = STRING; -- must not exceed 100 bytes <> NumberOfChildren: TYPE = CARDINAL; <> Ordering: TYPE = RECORD [key: AttributeType, ascending: BOOLEAN, interpretation: Interpretation]; defaultOrdering: Ordering = [key: name, ascending: TRUE, interpretation: string]; byAscendingPosition: Ordering = [key: position, ascending: TRUE, interpretation: interpretationNone]; byDescendingPosition: Ordering = [key: position, ascending: FALSE, interpretation: interpretationNone]; <> ParentID: TYPE = FileID; <> Pathname: TYPE = STRING; position: AttributeType = 13; Position: TYPE = SEQUENCE 100 OF UNSPECIFIED; firstPosition: Position = [0]; lastPosition: Position = [177777B]; <> ReadBy: TYPE = User; <> ReadOn: TYPE = Time; <> StoredSize: TYPE = LONG CARDINAL; <> SubtreeSize: TYPE = LONG CARDINAL; nullSubtreeSizeLimit: SubtreeSizeLimit = 37777777777B; <> SubtreeSizeLimit: TYPE = LONG CARDINAL; <> Type: TYPE = LONG CARDINAL; <> Unused: TYPE = LONG CARDINAL; WellKnownType: TYPE = { tUnspecified(0), tDirectory(1), tText(2), tSerialized(3), tEmpty(4), tAscii(6), tAsciiText(7) }; <> <> <> <> <> <> <> <> Version: TYPE = CARDINAL; lowestVersion: Version = 0; highestVersion: Version = 177777B; <> <> SerializedFile: TYPE = RECORD [version: LONG CARDINAL, file: SerializedTree]; currentVersion: LONG CARDINAL = 3; StreamOfUnspecified: TYPE = SEQUENCE OF UNSPECIFIED; SerializedContentBytes: TYPE = RECORD [ data: StreamOfUnspecified, lastByteIsSignificant: BOOLEAN ]; SerializedTreeSequence: TYPE = SEQUENCE OF SerializedTree; SerializedTree: TYPE = RECORD [ attributes: AttributeSequence, content: SerializedContentBytes <> ]; <> StreamKind: TYPE = { nextSegment(0), lastSegment(1) }; AttributeSequenceSequence: TYPE = SEQUENCE OF AttributeSequence; AttributeSequenceList: TYPE = RECORD [ segment: AttributeSequenceSequence <> ]; StreamOfAttributeSequence: TYPE = CHOICE StreamKind OF { nextSegment => AttributeSequenceList, -- (0) lastSegment => AttributeSequenceSequence -- (1) }; <> StringStreamKind: TYPE = { nextLine(0), lastLine(1) }; StreamOfAsciiText: TYPE = CHOICE StringStreamKind OF { nextLine => AsciiStringList, -- (0) lastLine => AsciiString -- (1) }; AsciiStringList: TYPE = RECORD [ line: AsciiString <> ]; BytePairSequence: TYPE = SEQUENCE OF UNSPECIFIED; AsciiString: TYPE = RECORD [ lastByteIsSignificant: BOOLEAN, data: BytePairSequence ]; END.