DIRECTORY Commander USING [CommandProc, Handle, Register], FS USING [Error, StreamOpen], GetTree USING [ReadIndent], InterFile USING [ToFile], IO USING [Close, EndOfStream, Error, GetIndex, GetRefAny, PutChar, PutRope, RIS, SetLength, STREAM], List USING [Nconc1], Process USING [CheckForAbort], PutGet USING [FromFile, ToFile, WriteFilePlain, WriteMesaFilePlain], Rope USING [Concat, Fetch, Find, Length, ROPE, Size], TEditDocument USING [Selection], TEditInput USING [FreeTree, Interpret, ReadTipTables], TEditMesaOps USING [SetSpanMesaLooks], TEditOps USING [GetSelData], TEditProfile USING [GetToken], TEditSelection USING [LockSel, UnlockSel], TextNode USING [Forward, LastWithin, MakeNodeSpan, NarrowToTextNode, Ref, RefTextNode], UserProfile USING [Number]; TiogaExecCommands: CEDAR PROGRAM IMPORTS FS, Commander, GetTree, IO, InterFile, List, Process, PutGet, Rope, TEditMesaOps, TEditInput, TEditOps, TEditProfile, TEditSelection, TextNode, UserProfile = BEGIN TiogaMesaLooks: Commander.CommandProc = { DoTiogaMesa[cmd, FALSE, TRUE]; }; TiogaMesa: Commander.CommandProc = { DoTiogaMesa[cmd, TRUE, TRUE]; }; ReadIndent: Commander.CommandProc = { DoTiogaMesa[cmd, TRUE, FALSE]; }; Get: PROC [name: Rope.ROPE, log: IO.STREAM, tree: BOOL _ FALSE] RETURNS [root: TextNode.Ref, filename: Rope.ROPE] = { failed: BOOL _ FALSE; filename _ name; { ENABLE FS.Error => { IF ~failed AND Rope.Find[filename,"."] = -1 THEN { -- add .mesa extension filename _ Rope.Concat[filename,".mesa"]; failed _ TRUE; RETRY; }; log.PutRope[error.explanation]; log.PutRope["\n"]; GOTO Quit; }; root _ IF tree THEN GetTree.ReadIndent[filename, tabIndent] ELSE PutGet.FromFile[filename]; }; EXITS Quit => RETURN [NIL, NIL] }; tabIndent: NAT _ 8; DoTiogaMesa: PROC [cmd: Commander.Handle, tree, mesaLooks: BOOL] = { Writer: DoWriteProc = { IF mesaLooks THEN [] _ TEditMesaOps.SetSpanMesaLooks[ TextNode.MakeNodeSpan[root,TextNode.LastWithin[root]],NIL]; [] _ PutGet.ToFile[filename, root] }; tabIndent _ 8; Dudley[Writer, cmd, tree]; }; ReadTiogaTipTables: Commander.CommandProc = { TEditInput.ReadTipTables[]; }; WriteMesaPlain: Commander.CommandProc = { Writer: DoWriteProc = { PutGet.WriteMesaFilePlain[filename, root] }; Dudley[Writer, cmd]; }; WritePlain: Commander.CommandProc = { Writer: DoWriteProc = { PutGet.WriteFilePlain[filename, root] }; Dudley[Writer, cmd]; }; WriteInterFile: Commander.CommandProc = { Writer: DoWriteProc = { [] _ InterFile.ToFile[filename, root] }; Dudley[Writer, cmd]; }; WriteAscii: Commander.CommandProc = { Writer: DoWriteProc = { WriteFileAscii[filename, root] }; Dudley[Writer, cmd]; }; WriteFileAscii: PUBLIC PROC [fileName: Rope.ROPE, root: TextNode.Ref] = { h: IO.STREAM _ FS.StreamOpen[fileName: fileName, accessOptions: $create, keep: UserProfile.Number["Tioga.defaultKeep", 2]]; DoWriteAscii[h, root]; IO.Close[h]; }; DoWriteAscii: PROC [h: IO.STREAM, root: TextNode.Ref, restoreDashes: BOOL _ FALSE] = { node: TextNode.Ref _ root; level: INTEGER _ 0; levelDelta: INTEGER; first: BOOL _ TRUE; DO text: TextNode.RefTextNode; [node, levelDelta] _ TextNode.Forward[node]; IF node=NIL THEN EXIT; level _ level+levelDelta; text _ TextNode.NarrowToTextNode[node]; IF text = NIL THEN LOOP; IF Rope.Length[text.rope] = 0 THEN LOOP; IF first THEN first _ FALSE ELSE IO.PutRope[h, "\n\n"]; -- carriage returns between nodes SELECT text.formatName FROM $body => IO.PutChar[h, '\t]; $equation => IO.PutRope[h, "\t\t\t"]; $display => NULL; ENDCASE; IO.PutRope[h, text.rope]; ENDLOOP; { ENABLE IO.Error => IF ec = NotImplementedForThisStream THEN GOTO Exit; IO.SetLength[h, IO.GetIndex[h]] } EXITS Exit => RETURN }; DoWriteProc: TYPE = PROC [filename: Rope.ROPE, root: TextNode.Ref]; Dudley: PROC [writer: DoWriteProc, cmd: Commander.Handle, tree: BOOL _ FALSE] = { offset: INT _ 0; out: IO.STREAM _ cmd.out; DO root: TextNode.Ref; filename: Rope.ROPE; [filename,offset] _ TEditProfile.GetToken[cmd.commandLine, offset]; IF Rope.Size[filename]=0 THEN EXIT; IF Rope.Size[filename]=1 AND Rope.Fetch[filename,0] IN ['1..'9] THEN { tabIndent _ LOOPHOLE[Rope.Fetch[filename,0]-'1]; LOOP }; [root, filename] _ Get[filename, out, tree]; IF root=NIL THEN LOOP; IO.PutRope[out, " "]; IO.PutRope[out, filename]; IO.PutRope[out, " "]; Process.CheckForAbort[]; writer[filename, root]; TEditInput.FreeTree[root]; IO.PutRope[out, "\n"]; ENDLOOP; }; DoTiogaOps: Commander.CommandProc = { pSel: TEditDocument.Selection _ TEditOps.GetSelData[]; rope: Rope.ROPE _ cmd.commandLine; h: IO.STREAM _ IO.RIS[rope]; item: REF ANY; list: LIST OF REF ANY; DO item _ IO.GetRefAny[h ! IO.EndOfStream => { item _ NIL; CONTINUE}]; IF item = NIL THEN EXIT; list _ List.Nconc1[list, item]; ENDLOOP; TEditSelection.LockSel[primary, "DoTiogaOps"]; -- IF pSel.viewer # NIL THEN -- TEditInput.Interpret[pSel.viewer, list ! UNWIND => TEditSelection.UnlockSel[primary]]; TEditSelection.UnlockSel[primary]; }; Commander.Register["TiogaMesa", TiogaMesa, "Convert Mesa files to Tioga tree format. Number in line gives spaces/tab -- must be in [1..9]; default is 8"]; Commander.Register["ReadTiogaTipTables", ReadTiogaTipTables, "Have Tioga read its TIP tables again."]; Commander.Register["ReadIndent", ReadIndent, "Convert to tree structure based on indenting."]; Commander.Register["WritePlain", WritePlain, "Convert Tioga file to unformatted file."]; Commander.Register["WriteMesaPlain", WriteMesaPlain, "Convert Tioga file to unformatted file.\n\tRestores dashes before comments if necessary."]; Commander.Register["WriteInterFile", WriteInterFile, "Convert Tioga file to pseudo InterScript format."]; Commander.Register["WriteAscii", WriteAscii, "Convert Tioga file to unformatted ASCII "]; Commander.Register["DoTiogaOps", DoTiogaOps, "Like EditTool Do Operations command."]; END. ξTiogaExecCommands.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Paxton, October 26, 1982 10:12 am Maxwell, January 14, 1983 8:46 am Plass, April 20, 1983 9:26 am Russ Atkinson, September 29, 1983 11:17 am Doug Wyatt, March 4, 1985 10:30:58 am PST Michael Plass, November 1, 1985 12:25:41 pm PST [cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL] [cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL] [cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL] [cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL] [cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL] [cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL] [cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL] [cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL] THROUGH [1..level) DO IO.PutChar[h, '\t]; ENDLOOP; -- output level-1 tabs process each file in command line [cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL] ΚŠ˜codešœ™Kšœ Οmœ1™˜DK˜K˜K˜—š  œ˜%Kšœ?™?Kš œ:˜@K˜K˜K˜—š œ˜)Kšœ?™?Kš œ:˜@K˜K˜K˜—š  œ˜%Kšœ?™?Kš œ3˜9K˜K˜K˜—š œžœžœžœ˜IKšœžœžœžœj˜{Kšœ˜Kšžœ ˜ K˜K˜—š   œžœžœžœ%žœžœ˜VK˜Kšœžœ˜Kšœ žœ˜Kšœžœžœ˜šž˜K˜K˜,Kšžœžœžœžœ˜K˜Kšœ'˜'Kšžœžœžœžœ˜Kšžœžœžœ˜(šžœžœ ž˜Kšžœžœ‘!˜=—Kš žœ žœžœžœ‘™Išžœž˜Kšœ žœ˜Kšœ žœ˜%Kšœ žœ˜Kšžœ˜—Kšžœ˜Kšžœ˜—š œžœžœ žœ"žœžœ˜HKšžœžœ˜ K˜—Kšžœ žœ˜K˜K˜—K˜K˜Kšœ žœžœžœ˜CK˜š œžœ4žœžœ˜QKšœžœ˜Kšœžœžœ ˜šž˜Kšœ!™!K˜Kšœžœ˜KšœC˜CKšžœžœžœ˜#šžœžœžœ žœ˜FKšœ žœ˜0Kšž˜Kšœ˜—Kšœ,˜,Kšžœžœžœžœ˜Kšžœ˜Kšžœ˜Kšžœ˜Kšœ˜Kšœ˜K˜Kšžœ˜Kšžœ˜—Kšœ˜K˜—K˜š  œ˜%Kšœ?™?Kšœ6˜6Kšœ žœ˜"Kš œžœžœžœžœ˜Kšœžœžœ˜Kš œžœžœžœžœ˜šž˜Kš œžœžœžœžœ˜CKšžœžœžœžœ˜K˜Kšžœ˜—K˜.Kš‘œ*žœ'˜vKšœ"˜"Kšœ˜—K˜šœT˜TKšœ ‘%˜E—K˜šœf˜fK˜—Kšœ^˜^K˜KšœX˜XK˜Kšœ‘˜‘K˜Kšœi˜iKšœY˜YK˜KšœU˜UK˜Kšžœ˜K˜K˜—…— "