<> <> <> <> <> <> <> <<>> DIRECTORY Commander USING [CommandProc, Handle, Register], FS USING [Error], GetTree USING [ReadIndent], InterFile USING [ToFile], IO USING [EndOfStream, GetRefAny, PutRope, RIS, STREAM], List USING [Nconc1], Process USING [CheckForAbort], PutGet USING [FromFile, ToFile, WriteFilePlain, WriteMesaFilePlain], Rope USING [Concat, Fetch, Find, 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 [LastWithin, MakeNodeSpan, Ref]; TiogaExecCommands: CEDAR PROGRAM IMPORTS FS, Commander, GetTree, IO, InterFile, List, Process, PutGet, Rope, TEditMesaOps, TEditInput, TEditOps, TEditProfile, TEditSelection, TextNode = BEGIN TiogaMesaLooks: Commander.CommandProc = { <<[cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL]>> DoTiogaMesa[cmd, FALSE, TRUE]; }; TiogaMesa: Commander.CommandProc = { <<[cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL]>> DoTiogaMesa[cmd, TRUE, TRUE]; }; ReadIndent: Commander.CommandProc = { <<[cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL]>> 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 = { <<[cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL]>> TEditInput.ReadTipTables[]; }; WriteMesaPlain: Commander.CommandProc = { <<[cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL]>> Writer: DoWriteProc = { PutGet.WriteMesaFilePlain[filename, root] }; Dudley[Writer, cmd]; }; WritePlain: Commander.CommandProc = { <<[cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL]>> Writer: DoWriteProc = { PutGet.WriteFilePlain[filename, root] }; Dudley[Writer, cmd]; }; WriteInterFile: Commander.CommandProc = { <<[cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL]>> Writer: DoWriteProc = { [] _ InterFile.ToFile[filename, root] }; Dudley[Writer, cmd]; }; 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 = { <<[cmd: Handle] RETURNS [result: REF _ NIL, msg: Rope.ROPE _ NIL]>> 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]; 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["DoTiogaOps", DoTiogaOps, "Like EditTool Do Operations command."]; END.