DIRECTORY FS USING [StreamOpen], IO USING [atom, Close, int, PutF, PutFR, STREAM], IPBasic USING [Op, Rational, Version, version], IPWriter USING [Class, ClassRep, ErrorCode, Writer, WriterRep], Rope USING [ROPE]; IPWriterImpl: CEDAR MONITOR IMPORTS FS, IO EXPORTS IPWriter ~ BEGIN OPEN IPWriter, IPBasic; ROPE: TYPE ~ Rope.ROPE; STREAM: TYPE ~ IO.STREAM; Error: PUBLIC ERROR[code: ErrorCode, explanation: ROPE _ NIL] ~ CODE; classList: LIST OF Class _ NIL; -- monitored data Register: PUBLIC ENTRY PROC[class: Class] ~ { classList _ CONS[class, classList]; }; ClassList: ENTRY PROC RETURNS[LIST OF Class] ~ { RETURN[classList]; }; GetClass: PROC[encoding: ATOM] RETURNS[Class] = { FOR list: LIST OF Class _ ClassList[], list.rest UNTIL list=NIL DO class: Class ~ list.first; IF class.encoding=encoding THEN RETURN[class]; ENDLOOP; ERROR Error[$unknownEncoding, IO.PutFR["\"%g\" is an unrecognized encoding type.", IO.atom[encoding]]]; }; Open: PUBLIC PROC[name: ROPE, encoding: ATOM] RETURNS[Writer] ~ { stream: STREAM ~ FS.StreamOpen[name, $create]; writer: Writer ~ Create[stream, encoding]; PutHeader[writer]; RETURN[writer]; }; Create: PUBLIC PROC[stream: STREAM, encoding: ATOM] RETURNS[Writer] ~ { class: Class ~ GetClass[encoding]; RETURN[NEW[WriterRep _ [class: class, stream: stream]]]; }; PutHeader: PUBLIC PROC[writer: Writer] ~ { stream: STREAM ~ writer.stream; encoding: ATOM ~ writer.class.encoding; version: Version ~ IPBasic.version; stream.PutF["Interpress/%g/%g.%g ", IO.atom[encoding], IO.int[version.major], IO.int[version.minor]]; }; closedClass: Class ~ NEW[ClassRep _ [encoding: $Closed, putOp: ClosedPutOp, putInt: ClosedPutInt, putReal: ClosedPutReal, putRational: ClosedPutRational, putIdentifier: ClosedPutIdentifier, putString: ClosedPutString, putInsertfile: ClosedPutInsertfile, putComment: ClosedPutComment, putAnnotation: ClosedPutAnnotation]]; closedExplanation: ROPE ~ "Tried to use a Writer that has been closed."; ClosedPutOp: PROC[writer: Writer, op: Op] ~ { ERROR Error[$closed, closedExplanation]; }; ClosedPutInt: PROC[writer: Writer, value: INT] ~ { ERROR Error[$closed, closedExplanation]; }; ClosedPutReal: PROC[writer: Writer, value: REAL] ~ { ERROR Error[$closed, closedExplanation]; }; ClosedPutRational: PROC[writer: Writer, value: Rational] ~ { ERROR Error[$closed, closedExplanation]; }; ClosedPutIdentifier: PROC[writer: Writer, rope: ROPE] ~ { ERROR Error[$closed, closedExplanation]; }; ClosedPutString: PROC[writer: Writer, rope: ROPE] ~ { ERROR Error[$closed, closedExplanation]; }; ClosedPutComment: PROC[writer: Writer, rope: ROPE] ~ { ERROR Error[$closed, closedExplanation]; }; ClosedPutAnnotation: PROC[writer: Writer, rope: ROPE] ~ { ERROR Error[$closed, closedExplanation]; }; ClosedPutInsertfile: PROC[writer: Writer, rope: ROPE] ~ { ERROR Error[$closed, closedExplanation]; }; Close: PUBLIC PROC[writer: Writer] ~ { stream: STREAM ~ writer.stream; writer.class _ closedClass; writer.stream _ NIL; stream.Close[]; }; END. TIPWriterImpl.mesa Last edited by: Doug Wyatt, March 12, 1984 1:14:19 pm PST ʘJšœ™J™šœ™Jšœ)™)J˜—šÏk ˜ Jšœœ˜Jšœœ!œ˜1Jšœœ"˜/Jšœ œ1˜?Jšœœœ˜J˜—Jšœœ˜Jšœœ˜Jšœ ˜Jšœœœ˜J˜Jšœœœ˜Jšœœœœ˜J˜š œœœœœœ˜EJ˜—šœ œœ œÏc˜1J˜—šÏnœœœœ˜-Jšœ œ˜#J˜J˜—š Ÿ œœœœœœ ˜0Jšœ ˜J˜J˜—šŸœœ œœ ˜1š œœœ œœ˜BJ˜Jšœœœ˜.Jšœ˜—šœ˜Jšœ3œ˜I—J˜J˜—š Ÿœœœœ œœ ˜AJšœœœ˜.J˜*J˜Jšœ ˜J˜J˜—š Ÿœœœ œ œœ ˜GJšœ"˜"Jšœœ.˜8J˜J˜—šŸ œœœ˜*Jšœœ˜Jšœ œ˜'J˜#šœ#˜#Jšœœœ˜A—J˜J˜—Jšœœ©˜ÁJ˜Jšœœ1˜HJ˜šŸ œœ˜-Jšœ#˜(J˜—šŸ œœœ˜2Jšœ#˜(J˜—šŸ œœœ˜4Jšœ#˜(J˜—šŸœœ%˜