DIRECTORY FS USING [StreamOpen], IO USING [STREAM], IPBasic USING [ImagerVariable, Op, StrokeEnd], IPWriter USING [Close, Create, PutHeader, PutIdentifier, PutInt, PutOp, PutReal, PutString, Writer], IPOutput USING [Master, MasterRep], Rope USING [Index, ROPE, Size, Substr]; IPOutputImpl: CEDAR PROGRAM IMPORTS FS, IPWriter, Rope EXPORTS IPOutput ~ BEGIN ROPE: TYPE ~ Rope.ROPE; STREAM: TYPE ~ IO.STREAM; Writer: TYPE ~ IPWriter.Writer; Op: TYPE ~ IPBasic.Op; Master: TYPE ~ IPOutput.Master; Error: PUBLIC ERROR[explanation: ROPE] ~ CODE; OpenMaster: PUBLIC PROC[fileName: ROPE, encoding: ATOM _ NIL] RETURNS[Master] ~ { stream: STREAM ~ FS.StreamOpen[fileName, $create]; RETURN[OpenMasterFromStream[stream, encoding]]; }; OpenMasterFromStream: PUBLIC PROC[stream: STREAM, encoding: ATOM _ NIL] RETURNS[Master] ~ { writer: IPWriter.Writer ~ IPWriter.Create[stream, IF encoding=NIL THEN $Xerox ELSE encoding]; writer.PutHeader[]; writer.PutOp[$beginBlock]; RETURN[NEW[IPOutput.MasterRep _ [writer: writer, state: new, page: 0]]]; }; BeginPreamble: PUBLIC PROC[self: Master] ~ { IF self.state=new THEN { self.writer.PutOp[$beginBody]; self.state _ begin; } ELSE ERROR Error["BeginPreamble out of sequence."]; }; EndPreamble: PUBLIC PROC[self: Master] ~ { IF self.state=begin AND self.page=0 THEN { self.writer.PutOp[$endBody]; self.state _ end; } ELSE ERROR Error["EndPreamble out of sequence."]; }; BeginPage: PUBLIC PROC[self: Master] ~ { IF self.state=end THEN { self.writer.PutOp[$beginBody]; self.state _ begin; self.page _ self.page+1; } ELSE ERROR Error["BeginPage out of sequence."]; }; EndPage: PUBLIC PROC[self: Master] ~ { IF self.state=begin AND self.page>0 THEN { self.writer.PutOp[$endBody]; self.state _ end; } ELSE ERROR Error["EndPage out of sequence."]; }; Close: PUBLIC PROC[self: Master] ~ { IF self.state=end AND self.page>0 THEN { self.writer.PutOp[$endBlock]; self.writer.Close[]; self.state _ closed; } ELSE ERROR Error["Close out of sequence."]; }; PutOp: PUBLIC PROC[self: Master, op: Op] ~ { self.writer.PutOp[op]; }; PutInt: PUBLIC PROC[self: Master, int: INT] ~ { self.writer.PutInt[int]; }; PutReal: PUBLIC PROC[self: Master, real: REAL] ~ { self.writer.PutReal[real]; }; PutIdentifier: PUBLIC PROC[self: Master, identifier: ROPE] ~ { self.writer.PutIdentifier[identifier]; }; PutName: PUBLIC PROC[self: Master, name: ROPE] ~ { size: INT ~ name.Size[]; start: INT _ 0; n: INT _ 0; DO stop: INT ~ name.Index[pos1: start, s2: "/"]; id: ROPE ~ name.Substr[start: start, len: stop-start]; self.writer.PutIdentifier[id]; n _ n+1; IF stop˜HJ˜—J˜šŸ œžœžœ˜,šžœžœ˜Jšœ˜Jšœ˜Jšœ˜—Jšžœžœ)˜3J˜—šŸ œžœžœ˜*šžœžœ žœ˜*Jšœ˜Jšœ˜Jšœ˜—Jšžœžœ'˜1J˜—J˜šŸ œžœžœ˜(šžœžœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšžœžœ%˜/J˜—šŸœžœžœ˜&šžœžœ žœ˜*Jšœ˜Jšœ˜Jšœ˜—Jšžœžœ#˜-J˜—J˜šŸœžœžœ˜$šžœžœ žœ˜(Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšžœžœ!˜+J˜—J˜šŸœžœžœ˜,Jšœ˜Jšœ˜—šŸœžœžœžœ˜/Jšœ˜Jšœ˜—šŸœžœžœžœ˜2Jšœ˜Jšœ˜—šŸ œžœžœžœ˜>Jšœ&˜&Jšœ˜—šŸœžœžœžœ˜2Jšœžœ˜Jšœžœ˜Jšœžœ˜ šž˜Jšœžœ$˜-Jšœžœ.˜6Jšœ'˜'Jšžœ žœžœžœ˜+Jšžœ˜—J˜J˜Jšœ˜—šŸœžœžœžœ˜6Jšžœ˜Jšœ˜—š Ÿœžœžœžœžœ˜CJšœ/˜/Jšœ˜—šŸœžœžœžœžœžœžœ˜PJšžœ˜Jšœ˜—J˜šŸœžœžœžœ˜*J˜Jšœ%˜%Jšœ˜—šŸ œžœžœžœ˜3J˜Jšœ=˜=Jšœ˜—šŸœžœžœžœ˜.J˜Jšœ)˜)Jšœ˜—šŸœžœžœ˜$J˜Jšœ˜Jšœ˜—šŸœžœžœ˜&J˜Jšœ˜Jšœ˜—šŸœžœžœžœ˜0J˜Jšœ1˜1Jšœ˜—šŸœžœžœžœ˜-J˜Jšœ.˜.Jšœ˜—šŸ œžœžœ˜(J˜Jšœ˜Jšœ˜—J˜šŸœžœžœ˜$J˜Jšœ˜Jšœ˜—šŸœžœžœžœ˜+J˜Jšœ&˜&Jšœ˜—šŸœžœžœžœ˜+J˜Jšœ&˜&Jšœ˜—šŸœžœžœ˜%J˜Jšœ˜Jšœ˜—šŸœžœžœ˜#J˜Jšœ˜Jšœ˜—šŸœžœžœžœ˜+J˜Jšœ&˜&Jšœ˜—šŸœžœžœžœ˜+J˜Jšœ&˜&Jšœ˜—šŸœžœžœ˜"J˜Jšœ˜Jšœ˜—J˜šŸœžœžœ˜'J˜Jšœ˜Jšœ˜—šŸœžœžœ˜%J˜Jšœ˜Jšœ˜—J˜šŸœžœžœ˜2J˜Jšœžœžœ˜Jšžœžœ˜ J˜J˜Jšœ˜Jšžœžœžœ˜$J˜—J˜šŸœžœžœžœ˜1J˜Jšœ˜—šŸ œžœžœžœ˜7Jšœ"˜"Jšœ˜—J˜šŸœžœžœ˜!J˜Jšœ˜Jšœ˜—šŸœžœžœ˜%J˜Jšœ˜Jšœ˜—šŸ œžœžœ˜(J˜Jšœ˜Jšœ˜—J˜šŸœžœžœžœ˜1Jšœ˜Jšœ˜—šŸ œžœžœžœ˜5Jšœ ˜ Jšœ˜—šŸ œžœžœžœ˜8Jšœ#˜#Jšœ˜—šŸœžœžœžœ˜;Jšœ&˜&Jšœ˜—J˜šŸœžœžœ˜"J˜Jšœ˜Jšœ˜—šŸœžœžœžœ˜/J˜Jšœ*˜*Jšœ˜—šŸœžœžœ˜"J˜Jšœ˜Jšœ˜—šŸœžœžœ!žœ˜:J˜JšœD˜DJšœ˜—šŸœžœžœ˜#J˜Jšœ˜Jšœ˜—šŸœžœžœžœ˜+J˜Jšœ&˜&Jšœ˜—šŸœžœžœžœ˜-J˜Jšœ(˜(Jšœ˜—šŸœžœžœ˜&J˜Jšœ˜Jšœ˜—šŸœžœžœ˜$J˜Jšœ˜Jšœ˜—J˜šŸœžœžœžœ˜-J˜Jšœ˜—šŸœžœžœžœ˜1J˜Jšœ˜—šŸœžœžœžœ˜1J˜Jšœ˜—J˜šŸœžœžœ/˜@J˜Jšœžœ˜,Jšœ˜—šŸœžœžœ/˜@J˜Jšœžœ˜,Jšœ˜—J˜šŸœžœžœ"žœ˜LJ˜Jšœžœžœžœ$˜RJšœ˜—šŸœžœžœžœ˜@J˜Jšœ6˜6Jšœ˜—šŸ œžœžœ0˜IJ˜Jšœžœ˜5Jšœ˜—šŸœžœžœžœ˜BJ˜Jšœ8˜8Jšœ˜—šŸœžœžœžœ˜DJ˜Jšœ:˜:Jšœ˜—J˜šŸœžœžœ!žœ˜˜>Jšœ˜—šŸœžœžœ˜%J˜Jšœ˜Jšœ˜—J˜šŸœžœžœ˜&J˜Jšœ˜Jšœ˜—šŸ œžœžœžœ˜5J˜Jšœ?˜?Jšœ˜Jšœ˜—šŸœžœžœžœ˜/J˜Jšœ)˜)Jšœ˜Jšœ˜—šŸœžœžœžœ˜.J˜Jšœ(˜(Jšœ˜Jšœ˜—šŸœžœžœžœ˜4J˜Jšœ>˜>Jšœ˜Jšœ˜—šŸœžœžœ˜#J˜Jšœ˜Jšœ˜—šŸœžœžœ˜$J˜Jšœ˜Jšœ˜—J˜šŸœžœžœžœ˜1J˜Jšœ.˜.Jšœ˜—šŸ œžœžœžœ˜8J˜Jšœ5˜5Jšœ˜—J˜šŸœžœžœžœ˜0J˜Jšœ;˜;Jšœ˜—šŸœžœžœžœ˜3J˜Jšœ>˜>Jšœ˜—šŸœžœžœžœ˜/J˜Jšœ*˜*Jšœ˜—šŸœžœžœžœ˜/J˜Jšœ*˜*Jšœ˜—J˜šŸœžœžœžœ˜0J˜Jšœ+˜+Jšœ˜—šŸ œžœžœžœ˜4J˜Jšœ.˜.Jšœ˜—šŸœžœžœžœ˜J˜Jšœ%˜%Jšœ%˜%Jšœ˜Jšœ˜—šŸœžœžœ˜-J˜Jšœ˜Jšœ˜—šŸ œžœžœžœ˜9J˜JšœD˜DJšœ˜—J˜šŸœžœžœžœ˜3J˜Jšœ-˜-Jšœ˜—šŸ œžœžœ˜)J˜Jšœ˜Jšœ˜—š Ÿ œžœžœžœžœ žœ˜IJ˜Jšœ-˜-JšœG˜GJšœ&˜&Jšœ˜—šŸœžœžœžœ˜.J˜Jšœ)˜)Jšœ˜—J˜šŸ œžœžœ˜*J˜Jšœ˜Jšœ˜—šŸ œžœžœžœ˜7J˜JšœB˜BJšœ˜—šŸœžœžœžœ˜2J˜Jšœ˜—šŸœžœžœžœ˜J˜JšœI˜IJšœ˜—šŸœžœžœžœ˜-J˜Jšœ(˜(Jšœ˜—J˜Jšžœ˜—…—;HOÿ