<> <> <> <<>> <> <<>> DIRECTORY Basics USING [bytesPerWord], CommBuffer USING [Overhead], Endian USING [BYTE, bytesPerFWord, bytesPerHWord, FWORD, HWORD], XNSBuf USING[Hdr, maxBodyBytes]; XNSEchoBuf: CEDAR DEFINITIONS ~ BEGIN BYTE: TYPE ~ Endian.BYTE; HWORD: TYPE ~ Endian.HWORD; FWORD: TYPE ~ Endian.FWORD; maxBytes: CARDINAL ~ XNSBuf.maxBodyBytes; <
> Type: TYPE ~ MACHINE DEPENDENT { request(1), reply(2), (LAST[BYTE]) }; <<>> Hdr: TYPE ~ MACHINE DEPENDENT RECORD [ filler: BYTE, type: Type]; hdrBytes: CARDINAL ~ SIZE[Hdr] * Basics.bytesPerWord; -- Should be BYTES[Hdr]? <> Body: TYPE ~ MACHINE DEPENDENT RECORD [ SELECT OVERLAID * FROM bytes => [bytes: PACKED ARRAY [0..maxBodyBytes) OF BYTE], chars => [chars: PACKED ARRAY [0..maxBodyChars) OF CHAR], hWords => [hWords: PACKED ARRAY [0..maxBodyHWords) OF HWORD], fWords => [fWords: PACKED ARRAY [0..maxBodyFWords) OF FWORD] ENDCASE ]; maxBodyBytes: CARDINAL ~ maxBytes - hdrBytes; maxBodyChars: CARDINAL ~ maxBodyBytes; maxBodyHWords: CARDINAL ~ maxBodyBytes/Endian.bytesPerHWord; maxBodyFWords: CARDINAL ~ maxBodyBytes/Endian.bytesPerFWord; <> Packet: TYPE ~ REF PacketObject; PacketObject: TYPE ~ MACHINE DEPENDENT RECORD [ hdr: Hdr, body: Body]; <> <> <<>> Buffer: TYPE ~ REF BufferObject; BufferObject: TYPE ~ MACHINE DEPENDENT RECORD [ ovh: CommBuffer.Overhead, hdr1: XNSBuf.Hdr, hdr2: Hdr, body: Body]; <<>> END.