DIRECTORY Commander USING [CommandProc, Handle, Register], CommandTool USING [ArgumentVector, Parse, Failed], Convert USING [RealFromRope], FS USING [Error], Imager USING [Context, DoSave, ScaleT, TranslateT], ImagerInterpress USING [Close, Create, DoPage, Ref ], Interpress USING [DoPage, LogProc, Master, Open ], IO USING [PutF, STREAM], Rope USING [ ROPE, Fetch, Equal, Length, Substr ]; InterpressPageUp: CEDAR PROGRAM IMPORTS Commander, CommandTool, Convert, FS, Imager, ImagerInterpress, Interpress, IO, Rope ~ { ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; paperWidth: REAL _ 0.01 * 2.54 * 8.5; -- meters paperHight: REAL _ 0.01 * 2.54 * 11.0; -- meters margin: REAL _ 0.01 * 1.0; -- one centimeter margin defaultScaleFactor: REAL = 0.455; -- enough to leave 2 centimeters free across whole page scaleFactor: REAL _ defaultScaleFactor; scaleIt: BOOL _ TRUE; input: ROPE; output: ROPE; PageUp: PROC [output, input: ROPE, logProc: Interpress.LogProc, ms: STREAM] ~ { ref: ImagerInterpress.Ref ~ ImagerInterpress.Create[fileName: output]; master: Interpress.Master ~ Interpress.Open[fileName: input, log: logProc]; inPages: INT = master.pages; outPages: INT = (inPages+3)/4; outPage: INT _ 1; lowPage: INT _ 1; highPage: INT _ outPages * 4; WriteSide: PROC [context: Imager.Context] ~ { Page1: PROC ~ { IF lowPage > inPages THEN RETURN; Imager.TranslateT[context, [margin, paperHight/2.0]]; IF scaleIt THEN Imager.ScaleT[context, scaleFactor]; Interpress.DoPage[master: master, page: lowPage, context: context, log: logProc]; lowPage _ lowPage + 1; }; Page2: PROC ~ { IF lowPage > inPages THEN RETURN; Imager.TranslateT[context, [(paperWidth/2.0), paperHight/2.0]]; IF scaleIt THEN Imager.ScaleT[context, scaleFactor]; Interpress.DoPage[master: master, page: lowPage, context: context, log: logProc]; lowPage _ lowPage + 1; }; Page3: PROC ~ { IF lowPage > inPages THEN RETURN; Imager.TranslateT[context, [margin, margin]]; IF scaleIt THEN Imager.ScaleT[context, scaleFactor]; Interpress.DoPage[master: master, page: lowPage, context: context, log: logProc]; lowPage _ lowPage + 1; }; Page4: PROC ~ { IF lowPage > inPages THEN RETURN; Imager.TranslateT[context, [(paperWidth/2.0), margin]]; IF scaleIt THEN Imager.ScaleT[context, scaleFactor]; Interpress.DoPage[master: master, page: lowPage, context: context, log: logProc]; lowPage _ lowPage + 1; }; Imager.DoSave[context, Page1]; Imager.DoSave[context, Page2]; Imager.DoSave[context, Page3]; Imager.DoSave[context, Page4]; }; ms.PutF["Making new interpress file %g (%g pages) from %g (%g input pages) ... ", [rope[output]], [integer[outPages]], [rope[input]], [integer[inPages]]]; WHILE lowPage <= inPages DO ms.PutF["[%g", [integer[outPage]]]; ImagerInterpress.DoPage[self: ref, action: WriteSide]; ms.PutF["] "]; outPage _ outPage + 1; ENDLOOP; ImagerInterpress.Close[self: ref]; ms.PutF["\n%g written.\n", [rope[output]]]; }; ProcessArgs: PROC [cmd: Commander.Handle, argv: CommandTool.ArgumentVector] RETURNS [msg: ROPE _ NIL] ~ { i: INT _ 1; arrowSpecified: BOOL _ FALSE; input _ NIL; output _ NIL; scaleFactor _ defaultScaleFactor; scaleIt _ TRUE; WHILE i < argv.argc DO len: INT ~ Rope.Length[argv[i]]; IF len = 0 THEN { msg _ "Null argument"; GOTO Bad }; IF Rope.Fetch[argv[i], 0] = '- THEN { IF len = 1 THEN { msg _ "Missing option"; GOTO Bad }; SELECT Rope.Fetch[argv[i], 1] FROM 'b => scaleIt _ FALSE; -- booklet style, no scaling 'f => scaleIt _ TRUE; -- fit a "standard" 8.5 x 11 's => { -- use an arbitrary scaleing factor scaleIt _ TRUE; scaleFactor _ Convert.RealFromRope[Rope.Substr[argv[i], 2]]; }; ENDCASE => { msg _ "Invalid option"; GOTO Bad }; } ELSE { SELECT TRUE FROM Rope.Equal[argv[i], "_"] => { IF input = NIL THEN { msg _ "No output file specified"; GOTO Bad }; arrowSpecified _ TRUE; }; input = NIL => input _ argv[i]; (output = NIL) AND arrowSpecified => { output _ input; input _ argv[i]; }; ENDCASE => { IF arrowSpecified THEN msg _ "Too much in command line" ELSE msg _ "Missing \"_\""; GOTO Bad; }; }; i _ i.SUCC; ENDLOOP; IF input = NIL OR output = NIL THEN { msg _ "File name missing"; GOTO Bad }; EXITS Bad => NULL; }; PageUpLogProc: Interpress.LogProc ~ { -- doesn't do anything! }; PageUpCmd: Commander.CommandProc ~ { ENABLE { FS.Error => { result _ $Failure; msg _ error.explanation; GOTO Failure; }; }; argv: CommandTool.ArgumentVector _ CommandTool.Parse[cmd ! CommandTool.Failed => { msg _ errorMsg; result _ $Failure; GOTO Failure }]; IF argv = NIL THEN RETURN; msg _ ProcessArgs[cmd, argv]; IF msg # NIL THEN { result _ $Failure; RETURN }; PageUp[output, input, PageUpLogProc, cmd.out]; EXITS Failure => {}; }; doc: ROPE _ "Create a new IP master that has 4 pages per page."; Commander.Register["InterpressPageUp", PageUpCmd, doc]; Commander.Register["IPPageUp", PageUpCmd, doc]; }. ψInterpressPageUp.mesa Copyright c 1987 by Xerox Corporation. All rights reserved. Mark Weiser, November 15, 1988 4:43:59 pm PST Wes Irish, December 3, 1987 4:14:02 pm PST InterpressPageUp PROC [class: INT, code: ATOM, explanation: ROPE]; Κδ˜codešœ™Kšœ Οmœ_™jKšœ*™*—K˜K™K™K™šΟk ˜ Kšœ žœ!˜0Kšœ žœ!˜2Kšœžœ˜Kšžœžœ ˜Kšœžœ'˜3Kšœžœ˜5Kšœ žœ"˜2Kšžœžœžœ˜Kšœžœžœ!˜2—K˜KšΟbœžœž˜šžœ"žœ(žœ ˜_K˜Kšžœžœžœ˜Kšžœžœžœžœ˜K˜Kšœ žœΟc ˜/Kšœ žœ  ˜0Kšœžœ ˜3Kšœžœ  7˜YK˜Kšœ žœ˜'Kšœ žœžœ˜K˜Kšœžœ˜ Kšœžœ˜ K˜šΟnœžœžœ#žœ˜OK•StartOfExpansion([fileName: ROPE, header: ROPE _ NIL]˜FK–K[fileName: ROPE, logProc: Interpress.LogProc, logData: REF ANY _ NIL]šœK˜KKšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜code2–I[self: ImagerInterpress.Ref, action: PROC [...], scale: REAL _ 1.0]šΠbn œžœ˜-š‘œžœ˜Kšžœžœžœ˜!Kšœ5˜5Kšžœ žœ%˜4K–I[master: Interpress.OpenMaster, page: INT, context: Imager.Context]šœQ˜QK˜Kšœ˜—š‘œžœ˜Kšžœžœžœ˜!Kšœ?˜?Kšžœ žœ%˜4K–I[master: Interpress.OpenMaster, page: INT, context: Imager.Context]šœQ˜QK˜Kšœ˜—š‘œžœ˜Kšžœžœžœ˜!Kšœ-˜-Kšžœ žœ%˜4K–I[master: Interpress.OpenMaster, page: INT, context: Imager.Context]šœQ˜QK˜Kšœ˜—š‘œžœ˜Kšžœžœžœ˜!Kšœ7˜7Kšžœ žœ%˜4K–I[master: Interpress.OpenMaster, page: INT, context: Imager.Context]šœQ˜QK˜Kšœ˜—Kšœ˜Kšœ˜Kšœ˜Kšœ˜K˜—L–I[self: ImagerInterpress.Ref, action: PROC [...], scale: REAL _ 1.0]˜šœQ˜QKšœ˜Kšœ˜Kšœ˜Kšœ˜—šžœž˜K˜#K˜6K˜K˜Kšžœ˜—K–[self: ImagerInterpress.Ref]˜"K˜+K˜K˜—š ‘ œžœ;žœžœžœ˜iKšœžœ˜ Kšœžœžœ˜Kšœžœ˜ Kšœ žœ˜ Kšœ!˜!Kšœ žœ˜šžœž˜Kšœžœ˜ Kšžœ žœžœ˜4šžœ˜šžœ˜Kšžœ žœžœ˜5šžœž˜"Kšœžœ ˜4Kšœžœ ˜4šœ  #˜,Kšœ žœ˜Kšœ<˜