DIRECTORY Commander, CommanderOps, Convert, FS, Imager, ImagerInterpress, InterpressInterpreter, IO, Rope; InterpressPageUp: CEDAR PROGRAM IMPORTS Commander, CommanderOps, Convert, FS, Imager, ImagerInterpress, InterpressInterpreter, 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: InterpressInterpreter.LogProc, ms: STREAM] ~ { ref: ImagerInterpress.Ref ~ ImagerInterpress.Create[fileName: output]; master: InterpressInterpreter.Master ~ InterpressInterpreter.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]; InterpressInterpreter.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]; InterpressInterpreter.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]; InterpressInterpreter.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]; InterpressInterpreter.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.PutFL["Making new interpress file %g (%g pages) from %g (%g input pages) ... ", LIST[ [rope[output]], [integer[outPages]], [rope[input]], [integer[inPages]]]]; WHILE lowPage <= inPages DO ms.PutF1["[%g", [integer[outPage]]]; ImagerInterpress.DoPage[self: ref, action: WriteSide]; ms.PutRope["] "]; outPage ¬ outPage + 1; ENDLOOP; ImagerInterpress.Close[self: ref]; ms.PutF1["\n%g written.\n", [rope[output]]]; }; ProcessArgs: PROC [cmd: Commander.Handle, argv: CommanderOps.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: InterpressInterpreter.LogProc ~ { -- doesn't do anything! }; PageUpCmd: Commander.CommandProc ~ { ENABLE { FS.Error => { result ¬ $Failure; msg ¬ error.explanation; GOTO Failure; }; }; argv: CommanderOps.ArgumentVector ¬ CommanderOps.Parse[cmd ! CommanderOps.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 Σ 1987, 1992 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 Michael Plass, April 15, 1992 3:39 pm PDT InterpressPageUp PROC [class: INT, code: ATOM, explanation: ROPE]; Κ–(cedarcode) style•NewlineDelimiter ™code™Kšœ Οeœd™pK™*K™)—K˜K™K™K™KšΟk œ#žœ3žœ˜jK˜KšΟbœžœž˜šžœ#žœ3žœ ˜kK˜Kšžœžœžœ˜Kšžœžœžœžœ˜K˜Kšœ žœΟc ˜/Kšœ žœ  ˜0Kšœžœ ˜3Kšœžœ  7˜YK˜Kšœ žœ˜'Kšœ žœžœ˜K˜Kšœžœ˜ Kšœžœ˜ K˜šΟnœžœžœ.žœ˜ZK•StartOfExpansion([fileName: ROPE, header: ROPE _ NIL]˜FK–K[fileName: ROPE, logProc: Interpress.LogProc, logData: REF ANY _ NIL]˜aKšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜Kšœ žœ˜code2–I[self: ImagerInterpress.Ref, action: PROC [...], scale: REAL _ 1.0]šΠbn œžœ˜-š‘œžœ˜Kšžœžœžœ˜!K˜5Kšžœ žœ%˜4K–I[master: Interpress.OpenMaster, page: INT, context: Imager.Context]˜\K˜K˜—š‘œžœ˜Kšžœžœžœ˜!K˜?Kšžœ žœ%˜4K–I[master: Interpress.OpenMaster, page: INT, context: Imager.Context]˜\K˜K˜—š‘œžœ˜Kšžœžœžœ˜!K˜-Kšžœ žœ%˜4K–I[master: Interpress.OpenMaster, page: INT, context: Imager.Context]˜\K˜K˜—š‘œžœ˜Kšžœžœžœ˜!K˜7Kšžœ žœ%˜4K–I[master: Interpress.OpenMaster, page: INT, context: Imager.Context]˜\K˜K˜—K˜K˜K˜K˜K˜—L–I[self: ImagerInterpress.Ref, action: PROC [...], scale: REAL _ 1.0]˜šœSžœ˜XK˜K˜K˜K˜—šžœž˜K˜$K˜6K˜K˜Kšžœ˜—K–[self: ImagerInterpress.Ref]˜"K˜,K˜K˜—š ‘ œžœ<žœžœžœ˜jKšœžœ˜ Kšœžœžœ˜Kšœžœ˜ Kšœ žœ˜ K˜!Kšœ žœ˜šžœž˜Kšœžœ˜ Kšžœ žœžœ˜4šžœ˜šžœ˜Kšžœ žœžœ˜5šžœž˜"Kšœžœ ˜4Kšœžœ ˜4šœ  #˜,Kšœ žœ˜K˜žœ ˜N—Kšžœžœžœžœ˜K˜Kšžœžœžœžœ˜0K˜.šž˜K˜—K˜——˜Kšœžœ7˜@K˜7K˜/—K˜—…— a