<<>> <> <> <> <> <<>> DIRECTORY Commander, CommanderOps, IO, PFS, RefText, Rope; CitingFilesImpl: CEDAR PROGRAM IMPORTS Commander, CommanderOps, IO, PFS, RefText, Rope ~ BEGIN ROPE: TYPE ~ Rope.ROPE; CitingFilesCommand: Commander.CommandProc = { ENABLE PFS.Error => IF error.group = user THEN ERROR CommanderOps.Failed[error.explanation]; argv: CommanderOps.ArgumentVector ~ CommanderOps.Parse[cmd]; target, prefix, suffix, xrefname: ROPE; xrefStream: IO.STREAM; scratch, tokBuff: REF TEXT; Break1: PROC [c: CHAR] RETURNS [IO.CharClass] ~ { RETURN[IF c <= ' THEN sepr ELSE other]}; Break2: PROC [c: CHAR] RETURNS [IO.CharClass] ~ { RETURN[SELECT c FROM IO.LF, IO.CR => break, <= ' => sepr, ENDCASE => other]}; SkipLine: PROC ~ { DO c: CHAR _ xrefStream.GetChar[]; IF c=IO.LF OR c=IO.CR THEN EXIT; ENDLOOP}; IF argv.argc NOT IN [2..5] THEN CommanderOps.Failed[IO.PutFR1["Usage: %g subject [suffix [prefix [xRefFileName]]]", [rope[argv[0]]] ]]; target _ argv[1].Concat[":"]; IF argv.argc>2 THEN suffix _ argv[2] ELSE suffix _ ".mesa"; IF argv.argc>3 THEN prefix _ argv[3] ELSE prefix _ "/r/"; IF argv.argc>4 THEN xrefname _ argv[4] ELSE xrefname _ "/r/Cedar.depends"; xrefStream _ PFS.StreamOpen[PFS.PathFromRope[xrefname]]; tokBuff _ scratch _ RefText.ObtainScratch[300]; {ENABLE IO.EndOfStream => { cmd.err.PutF["%g not defined in %g.\n", [rope[argv[1]]], [rope[xrefname]] ]; CONTINUE}; DO tokBuff _ xrefStream.GetToken[Break1, tokBuff].token; IF Rope.Equal[RefText.TrustTextAsRope[tokBuff], target] THEN { SkipLine[]; DO stem: ROPE _ xrefStream.GetTokenRope[Break2].token; IF stem.Equal["\r"] OR stem.Equal["\l"] THEN EXIT; cmd.out.PutF[" %g%g%g", [rope[prefix]], [rope[stem]], [rope[suffix]] ]; ENDLOOP; cmd.out.PutChar['\n]; EXIT} ELSE { IF tokBuff.length>0 AND tokBuff[tokBuff.length-1]=': THEN SkipLine[]; SkipLine[]; }; ENDLOOP; }; xrefStream.Close[]; RefText.ReleaseScratch[scratch]; RETURN }; Commander.Register[key: "CitingFiles", proc: CitingFilesCommand, doc: "subject [suffix [prefix [xRefFileName]]] --- lists for every that xRefFileName[/r/Cedar.depends] says depends on "]; END.