DIRECTORY IO USING [STREAM], IPBasic USING [Index, PrimitiveOrSymbol, Rational], Rope USING [ROPE], RopeReader USING [Ref]; IPEncoding: CEDAR DEFINITIONS = BEGIN OPEN IPBasic; ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; Version: TYPE = RECORD[major, minor: CARDINAL]; TokenType: TYPE = {nil, op, -- value is token.op number, -- value is token.number int, rational, real, -- value from GetInt, GetRational, GetReal identifier, comment, insertFile, -- value from GetRope string, largeVec, eof -- end of file }; Token: TYPE = RECORD[ index: Index, -- starting index in the master for this token next: Index, -- use this index to get the next token type: TokenType, -- what kind of token op: PrimitiveOrSymbol, -- primitive or symbol, if type=op (nil otherwise) number: INTEGER, -- short number value, if type=number length: INT -- number of data bytes, if applicable ]; nullToken: Token = [index: 0, next: 0, type: nil, op: nil, number: 0, length: 0]; Error: ERROR[message: ROPE]; Reader: TYPE = REF ReaderRep; ReaderRep: TYPE = RECORD[ procs: REF READONLY ReaderProcs, ropeReader: RopeReader.Ref, buffer: REF TEXT, bytesRemaining: INT, startingIndex: INT ]; ReaderProcs: TYPE = RECORD[ GetToken: PROC[self: Reader, index: INT] RETURNS[Token], GetInt: PROC[self: Reader, token: Token] RETURNS[INT], GetRational: PROC[self: Reader, token: Token] RETURNS[Rational], GetReal: PROC[self: Reader, token: Token] RETURNS[REAL], GetRope: PROC[self: Reader, token: Token] RETURNS[ROPE] ]; OpenReader: PROC[fileName: ROPE] RETURNS[reader: Reader]; CreateReader: PROC[encoding: ROPE, ropeReader: RopeReader.Ref] RETURNS[Reader]; GetStartingIndex: PROC[self: Reader] RETURNS[INT] = INLINE { RETURN[self.startingIndex] }; GetToken: PROC[self: Reader, index: INT] RETURNS[Token] = INLINE { RETURN[self.procs.GetToken[self, index]] }; GetInt: PROC[self: Reader, token: Token] RETURNS[INT] = INLINE { RETURN[self.procs.GetInt[self, token]] }; GetRational: PROC[self: Reader, token: Token] RETURNS[Rational] = INLINE { RETURN[self.procs.GetRational[self, token]] }; GetReal: PROC[self: Reader, token: Token] RETURNS[REAL] = INLINE { RETURN[self.procs.GetReal[self, token]] }; GetRope: PROC[self: Reader, token: Token] RETURNS[ROPE] = INLINE { RETURN[self.procs.GetRope[self, token]] }; CloseReader: PROC[self: Reader]; Writer: TYPE = REF WriterRep; WriterRep: TYPE = RECORD[procs: REF READONLY WriterProcs, stream: STREAM]; WriterProcs: TYPE = RECORD[ PutOp: PROC[self: Writer, op: PrimitiveOrSymbol], PutInt: PROC[self: Writer, i: INT], PutRational: PROC[self: Writer, r: Rational], PutReal: PROC[self: Writer, r: REAL], PutRope: PROC[self: Writer, type: TokenType, text: ROPE] ]; OpenWriter: PROC[name: ROPE, encoding: ROPE] RETURNS[Writer]; CreateWriter: PROC[encoding: ROPE, stream: STREAM] RETURNS[Writer]; PutOp: PROC[self: Writer, op: PrimitiveOrSymbol] = INLINE { self.procs.PutOp[self, op] }; PutInt: PROC[self: Writer, i: INT] = INLINE { self.procs.PutInt[self, i] }; PutRational: PROC[self: Writer, r: Rational] = INLINE { self.procs.PutRational[self, r] }; PutReal: PROC[self: Writer, r: REAL] = INLINE { self.procs.PutReal[self, r] }; PutRope: PROC[self: Writer, type: TokenType, text: ROPE] = INLINE { self.procs.PutRope[self, type, text] }; CloseWriter: PROC[self: Writer]; ReadProc: TYPE = PROC[ropeReader: RopeReader.Ref] RETURNS[Reader]; WriteProc: TYPE = PROC[stream: STREAM] RETURNS[Writer]; Register: PROC[encoding: ROPE, version: Version, read: ReadProc, write: WriteProc]; END. nIPEncoding.mesa The token-level interface to an encoded Interpress master Last edited by: Doug Wyatt, April 28, 1983 6:22 pm Types Reading Prepare to read an Interpress master with the given file name. Parse the header, and return a reader appropriate for the encoding type. Create a reader for a specified encoding. Use ropeReader.GetIndex[] for startingIndex. Writing Prepare to write an Interpress master with the given file name. Write the header and return a writer for the given encoding. Open a writer for a specified encoding; start writing wherever the stream is positioned. Registering encoding types Κž˜headšœ™Jšœ9™9J˜šœ™Jšœ"™"—J™šΟk ˜ Jšœœœ˜Jšœœ&˜3Jšœœœ˜Jšœ œ˜—J˜—šœ œ ˜Jšœœœ ˜J™™J˜Jšœœœ˜Jšœœœœ˜J˜Jšœ œœœ˜/J˜šœ œ˜JšœΟc˜Jšœž˜ Jšœž*˜?Jšœ!ž˜6Jšœ˜Jšœž˜Jšœ˜—J˜šœœœ˜Jšœž.˜™>JšœH™H—J˜šŸ œœ œœ ˜OJšœ)™)J™,—J˜šŸœœœœ˜1Jšœœœ˜(—šŸœœœœ˜7Jšœœœ%˜6—šŸœœœœ˜5Jšœœœ#˜4—šŸ œœœ ˜?Jšœœœ(˜9—šŸœœœœ˜7Jšœœœ$˜5—šŸœœœœ˜7Jšœœœ$˜5—J˜JšŸ œœ˜ —J™™J˜Jšœœœ ˜Jš œ œœœœœ˜Jšœ œœ˜JšŸœœ&˜1JšŸœœœ˜#JšŸ œœ˜-JšŸœœœ˜%JšŸœœ&œ˜8J˜—J˜š Ÿ œœœ œœ ˜=Jšœ?™?Jšœ<™<—J˜š Ÿ œœ œ œœ ˜CJšœX™X—J˜šŸœœ%˜0Jšœœ ˜(—šŸœœœ˜"Jšœœ ˜(—šŸ œœ˜,Jšœœ%˜-—šŸœœœ˜$Jšœœ!˜)—šŸœœ&œ˜8Jšœœ*˜2—J˜JšŸ œœ˜ —J™šœ™J˜JšŸœœœœ ˜BJš Ÿ œœœ œœ ˜7J˜JšŸœœ œ6˜S—J˜Jšœ˜——…— ΆΒ