<> <> <> <> <> <> <> <> <> DIRECTORY Commander USING [CommandObject, CommandProc, CommandProcHandle, CommandProcObject, Handle, Lookup, Register], CommandTool USING [AddProcToList, ArgumentVector, DoCommand, Failed, GetProp, Parse, RemoveProcFromList], FileNames USING [ConvertToSlashFormat, CurrentWorkingDirectory, ResolveRelativePath, StripVersionNumber], FS USING [Close, Create, EnumerateForNames, Error, ExpandName, NameProc, OpenFile, StreamOpen], IO USING [Close, EndOf, EndOfStream, Error, GetBlock, GetLine, PutBlock, PutChar, PutF, PutF1, PutFR, PutRope, STREAM], Rope USING [Cat, Concat, Equal, Find, IsEmpty, Match, ROPE, Run, Size, Substr], RopeList USING [DReverse], TiogaMenuOps USING [Open, OpenImpl], ViewerClasses USING [Column, Viewer]; QueryCommandsImpl: CEDAR MONITOR IMPORTS Commander, CommandTool, FileNames, FS, IO, Rope, RopeList, TiogaMenuOps = BEGIN ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; ColumnFromSwitch: PROC [switchArg: ROPE, default: ViewerClasses.Column] RETURNS [column: ViewerClasses.Column _ left] ~ { MatchPrefix: PROC [s: ROPE] RETURNS [BOOL] ~ { RETURN [Rope.Run[s1: switchArg, s2: s, case: FALSE] = Rope.Size[switchArg]]; }; SELECT TRUE FROM MatchPrefix["-right"] => column _ right; MatchPrefix["-left"] => column _ left; MatchPrefix["-color"] => column _ color; ENDCASE => column _ default; }; Open: Commander.CommandProc = { argv: CommandTool.ArgumentVector _ CommandTool.Parse[cmd ! CommandTool.Failed => {msg _ errorMsg; GO TO oops}]; column: ViewerClasses.Column _ left; noFiles: BOOL _ TRUE; FOR i: NAT IN [1..argv.argc) DO argi: ROPE ~ argv[i]; IF Rope.Match["-*", argi] THEN { column _ ColumnFromSwitch[argi, column] } ELSE { list: LIST OF ROPE _ ExpandStar[argi]; WHILE list # NIL DO name: ROPE _ FileNames.ResolveRelativePath[list.first]; OpenViewer[name, cmd.out, column]; list _ list.rest; ENDLOOP; noFiles _ FALSE; }; ENDLOOP; IF noFiles THEN OpenViewer[NIL, cmd.out, column]; EXITS oops => result _ $Failure; }; ExpandStar: PROC [token: ROPE] RETURNS [LIST OF ROPE] = { IF Rope.Find[token, "*"] # -1 THEN { stripVersion: BOOL; listOfTokens: LIST OF ROPE _ NIL; ConsProc: FS.NameProc = { fullFName _ FileNames.ConvertToSlashFormat[fullFName]; IF stripVersion THEN fullFName _ FileNames.StripVersionNumber[fullFName]; listOfTokens _ CONS[fullFName, listOfTokens]; -- on front of list RETURN[TRUE]; }; IF token.Find["!"] = -1 THEN token _ Rope.Concat[token, "!H"]; stripVersion _ token.Find["!H", 0, FALSE] # -1; FS.EnumerateForNames[pattern: FileNames.ResolveRelativePath[token], proc: ConsProc ! FS.Error => IF error.group # bug THEN CONTINUE]; RETURN[RopeList.DReverse[listOfTokens]]; } ELSE RETURN[LIST[token]]; }; OpenViewer: PROC [name: ROPE, out: STREAM, column: ViewerClasses.Column] = { viewer: ViewerClasses.Viewer; IF Rope.IsEmpty[name] THEN name _ FileNames.CurrentWorkingDirectory[]; viewer _ TiogaMenuOps.Open[fileName: name, column: column]; IF viewer = NIL THEN out.PutF1["\tViewer file not found: %g\n", [rope[name]]] ELSE out.PutF1["\tCreated Viewer: %g\n", [rope[viewer.name]]]; }; Init: PROC = { Register: PROC [name: ROPE, proc: Commander.CommandProc, doc: ROPE, data: REF _ NIL, un: BOOL _ FALSE] = { <> Commander.Register[name, proc, doc, data, NOT un]; }; Register["QOpen", Open, "QOpen [-left | -right | -color ] fileName - open a viewer"]; }; Init[]; END. April 4, 1983 4:42 pm, Stewart, Created April 20, 1983 7:10 pm, Stewart, add commandfile arguments and auto commandfiles September 7, 1983 11:10 am, Stewart, Cedar 5 October 24, 1983 9:42 am, Stewart, New CommandTool November 3, 1983 9:37 am, Stewart, Bulletproofing November 3, 1983 9:37 am, Stewart, add Checkpoint and Rollback January 14, 1984 8:18 pm, Stewart, new Open January 9, 1987 3:41:40 pm PST, Spreitzer, added OpenImpl and made New create files