<> <> <> DIRECTORY Atom, Commander, CommandTool, Convert, DefDWIM, DocCache, IO, PutGet, Rope, TextNode, TFS; TiogaDWIMCommands: CEDAR PROGRAM IMPORTS Atom, Commander, CommandTool, Convert, DefDWIM, DocCache, IO, PutGet, Rope, TextNode, TFS = BEGIN FindDefCommand: PROC [cmd: Commander.Handle] RETURNS [result: REF ANY _ NIL, msg: Rope.ROPE _ NIL] --Commander.CommandProc-- ~ { argv: CommandTool.ArgumentVector; fromDoc: TextNode.Ref _ NIL; fromPos: INT; searchOrder: DefDWIM.SearchOrder; deep, verbose: BOOL; fp: DefDWIM.FoundPlace; from: DefDWIM.Place; argv _ CommandTool.Parse[cmd !CommandTool.Failed => {msg _ errorMsg; GOTO Failed}]; IF argv.argc # 7 THEN RETURN [$Failure, "Usage: FindDef subject filename pos searchOrder deep verbose"]; fromDoc _ DocCache.GetDoc[argv[2] ! PutGet.FromFileError => {msg _ Rope.Cat["PutGet.FromFile[", argv[2], "] => FromFileError"]; GOTO Failed}; TFS.Error => {msg _ IO.PutFR["PutGet.FromFile[%g] => TFS.Error[%g, %g]", [rope[argv[2]]], [atom[error.code]], [rope[error.explanation]] ]; GOTO Failed}]; fromPos _ Convert.IntFromRope[argv[3] !Convert.Error => {msg _ "pos should be an INT literal"; GOTO Failed}]; SELECT Atom.MakeAtom[argv[4]] FROM $fb, $fwdThenBkwd => searchOrder _ fwdThenBkwd; $bf, $bkwdThenFwd => searchOrder _ bkwdThenFwd; $fs, $fromStart => searchOrder _ fromStart; ENDCASE => {msg _ "searchOrder should be one of: fb, fwdThenBkwd, bf, bkwdThenFwd, fs, fromStart"; GOTO Failed}; deep _ Convert.BoolFromRope[argv[5] !Convert.Error => {msg _ "deep should be a BOOLEAN literal"; GOTO Failed}]; verbose _ Convert.BoolFromRope[argv[6] !Convert.Error => {msg _ "verbose should be a BOOLEAN literal"; GOTO Failed}]; from _ [argv[2], TextNode.LocRelative[[fromDoc, 0], fromPos], searchOrder]; fp _ DefDWIM.FindDef[argv[1], from, deep, verbose !DefDWIM.Failure => {msg _ Rope.Cat["DefDWIM.Failre[", FmtPlace[where], ", ", why, "]"]; GOTO Failed}]; msg _ Rope.Cat["Found ", FmtPlace[fp.where]]; RETURN; EXITS Failed => result _ $Failure}; FmtPlace: PROC [place: DefDWIM.Place] RETURNS [Rope.ROPE] ~ { pos: INT _ TextNode.LocOffset[[TextNode.Root[place.loc.node], 0], place.loc]; RETURN IO.PutFR["%g|%g", [rope[place.fileName]], [integer[pos]]]}; Start: PROC = { Commander.Register["FindDef", FindDefCommand, " subject filename pos searchOrder deep verbose"]; }; Start[]; END.