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 ôQueryCommandsImpl.mesa Copyright Ó 1984, 1985, 1986, 1987 by Xerox Corporation. All rights reserved. created by L. Stewart Mike Spreitzer January 9, 1987 5:35:31 pm PST Russ Atkinson (RRA) January 27, 1987 5:45:50 pm PST Doug Wyatt, January 28, 1987 4:16:53 pm PST Michael Plass, March 2, 1987 6:36:03 pm PST Doug Terry, April 9, 1987 1:34:30 pm PDT Taken from InitialCommandsImpl.mesa by removing all but Open command and renaming "Open" to "QOpen". name _ Rope.Concat["///Commands/", name]; ʵ˜codešœ™KšœN™NK™K™-K™3K™+K™+K™(—K˜Kšœd™d˜šÏk ˜ Kšœ œ^˜mKšœ œX˜iKšœ œZ˜iKšœœW˜_Kšœœgœ˜wKšœœ,œ˜OKšœ œ ˜Kšœ œ˜$Kšœœ˜%——K˜šÏnœœ˜ Kšœ$œœ˜OKšœ˜K˜Kšœœœ˜Kšœœœœ˜—K˜šžœœ œ!œ*˜yš ž œœœœœ˜.K•StartOfExpansionO[s1: ROPE, pos1: INT _ 0, s2: ROPE, pos2: INT _ 0, case: BOOL _ TRUE]šœ'œ˜LKšœ˜—šœœ˜Kšœ(˜(Kšœ&˜&Kšœ(˜(Kšœ˜—Kšœ˜K˜—šžœ˜šœ8˜8Kšœ)œœ˜6—K˜$Kšœ œœ˜šœœœ˜Kšœœ ˜šœ˜Kšœ,˜0šœ˜Kšœœœœ˜&šœœ˜Kšœœ-˜7Kšœ"˜"K˜Kšœ˜—Kšœ œ˜Kšœ˜——Kšœ˜—Kšœ œ œ˜1Kšœ˜ K˜K˜—šž œœ œœœœœ˜9šœœ˜$Kšœœ˜Kš œœœœœ˜!šœ œ ˜Kšœ6˜6Kšœœ5˜IKšœœÏc˜BKšœœ˜ K˜—Kšœœ"˜>Kšœ#œ˜/šœP˜RKš œœ œœœ˜2—Kšœ"˜(K˜—Kšœœœ ˜K˜K˜—šž œœœœ%˜NKšœ˜Kšœœ,˜FKšœ;˜;Kšœ œœ9˜MKšœ:˜>K˜—K˜šžœœ˜šžœœœ$œœœœœ˜jKšœ)™)Kšœ*œ˜2K˜—K˜K˜UK˜—K˜K˜K˜Kšœ˜K˜'K˜PK˜,K˜2K˜1Kšœ>˜>Kšœ+˜+K˜SK˜K˜K˜K˜—…—Ò{