DIRECTORY IO USING [STREAM, PutChar], Commander USING [Register, CommandProc], List USING [Append, Assoc, PutAssoc], Rope, JaM USING [Any, Create, Execute, ExecuteRope, LineComplete, Register, RopeToAtom, SetAbort, State, Store, Stop], ReadEvalPrint USING [ClientProc, CreateStreamEvaluator, Handle, MainLoop], Menus USING [MenuProc, InsertMenuEntry], MBQueue USING [Create, CreateMenuEntry], TypeScript USING [Create], ViewerIO USING [CreateViewerStreams], ViewerClasses USING [Viewer], ViewerOps USING [AddProp, ComputeColumn], ProcessProps USING [GetPropList], JaMTS USING [JaMData, JaMDataRec], Convert USING [RopeFromInt]; JaMTSImpl: CEDAR PROGRAM IMPORTS JaM, ReadEvalPrint, Rope, Convert, Commander, List, ProcessProps, IO, Menus, MBQueue, TypeScript, ViewerIO, ViewerOps EXPORTS JaMTS = BEGIN STREAM: TYPE = IO.STREAM; ROPE: TYPE = Rope.ROPE; DefaultPrompt: PROC[self: JaM.State] = { JaM.ExecuteRope[self, "(*) .print"]; }; prompt: ATOM = JaM.RopeToAtom[".prompt"]; JaMPromptProc: PROC[h: ReadEvalPrint.Handle] = { data: JaMTS.JaMData = NARROW[h.clientData]; JaM.Execute[data.state, prompt ! JaM.Stop => CONTINUE]; }; JaMClientProc: ReadEvalPrint.ClientProc = { data: JaMTS.JaMData = NARROW[h.clientData]; data.input ¬ Rope.Concat[data.input, command]; IF JaM.LineComplete[data.input] THEN {ENABLE UNWIND => {data.input ¬ NIL; CONTINUE}; JaM.ExecuteRope[data.state, data.input ! JaM.Stop => CONTINUE]; data.input ¬ NIL; } ELSE IO.PutChar[h.out,'*]; --indicates inside a string or array. }; lastHandle: ReadEvalPrint.Handle ¬ NIL; GetLastHandle: PUBLIC PROC RETURNS[ReadEvalPrint.Handle] = {RETURN[lastHandle]}; SetAbort: Menus.MenuProc = { data: JaMTS.JaMData = NARROW[clientData]; JaM.SetAbort[data.state, TRUE]; }; CreateJaMTS: PUBLIC PROC [name: Rope.ROPE, commandLine: Rope.ROPE, searchRules: LIST OF REF ANY] RETURNS[ReadEvalPrint.Handle]= { in, out: STREAM; h: ReadEvalPrint.Handle; state: JaM.State; wd: REF ANY ¬ List.Assoc[key: $WorkingDirectory, aList: ProcessProps.GetPropList[]]; viewer: ViewerClasses.Viewer ¬ TypeScript.Create[ info: [name: name, iconic: FALSE, column: right], paint: FALSE]; [in: in, out: out] ¬ ViewerIO.CreateViewerStreams[name: NIL, viewer: viewer, editedStream: TRUE]; h ¬ ReadEvalPrint.CreateStreamEvaluator[clientProc: JaMClientProc, prompt: "%l%l", in: in, out: out, topLevel: TRUE]; h.viewer ¬ viewer; state ¬ JaM.Create[h.out]; h.clientData ¬ NEW[JaMTS.JaMDataRec ¬ [state: state, input: NIL]]; h.promptProc ¬ JaMPromptProc; h.menuHitQueue ¬ MBQueue.Create[]; Menus.InsertMenuEntry [menu: NARROW[h.viewer, ViewerClasses.Viewer].menu, line: 0, entry: MBQueue.CreateMenuEntry[q: h.menuHitQueue, name: "ABORT!", proc: SetAbort, clientData: h.clientData]]; ViewerOps.ComputeColumn[column: right]; ViewerOps.AddProp[NARROW[h.viewer], $ReadEvalPrint, h]; -- NARROW added September 6, 1990, Bier JaM.Register[state, ".prompt", DefaultPrompt]; JaM.Store[self: state, key: JaM.RopeToAtom[".searchrules"],val: searchRules]; JaM.ExecuteRope[state, "(/Cedar/JaM/JaMBasics.jam) .run"]; JaM.ExecuteRope[state, commandLine]; ReadEvalPrint.MainLoop[h: h, forkAndDetach: TRUE, properties: List.PutAssoc[key: $WorkingDirectory, val: wd, aList: NIL]]; lastHandle ¬ h; RETURN[h]; }; called: INT ¬ 0; NewJaMTS: Commander.CommandProc = { name: Rope.ROPE ¬ "JaM"; rules: LIST OF REF ANY ¬ List.Append[NARROW[List.Assoc[key: $SearchRules, aList: cmd.propertyList]]]; IF called#0 THEN name ¬ Rope.Concat[name, Convert.RopeFromInt[from: called, showRadix: FALSE]]; result ¬ CreateJaMTS[name, cmd.commandLine, rules]; called ¬ called+1; }; Commander.Register[key: "JaM", proc: NewJaMTS, doc: "Start JaM and its typescript"]; END. X JaMTSImpl.mesa Copyright Σ 1985, 1992 by Xerox Corporation. All rights reserved. Maureen Stone March 2, 1985 2:20:09 pm PST Doug Wyatt, March 18, 1985 3:43:06 pm PST Rick Beach, May 21, 1985 9:47:29 pm PDT Bier, September 23, 1992 5:38 pm PDT [h: Handle, command: Rope.ROPE] RETURNS [result: Rope.ROPE _ NIL] until we get the problems with the commandtool worked out. [parent: REF, clientData: REF, mouseButton: MouseButton, shift, control: BOOL] the new viewer will have the ReadEvalPrint.Handle as the property $ReadEvalPrint the clientData in the ReadEvalPrint.Handle is a JaMTS.JamData Κυ•NewlineDelimiter –"cedarcode" style™codešœ™Kšœ Οeœ6™BK™*K™)K™'K™$K™—šΟk ˜ Kšžœžœžœ ˜Kšœ žœ˜(Kšœžœ˜%K˜Kšœžœg˜pKšœžœ7˜JKšœžœ˜(Kšœžœ˜(Kšœ žœ ˜Kšœ žœ˜%Kšœžœ ˜Kšœ žœ˜)Kšœ žœ˜!Kšœžœ˜"Kšœžœ˜—K˜KšΠbl œžœž˜KšžœCžœ1˜}Kšžœ˜ Kšœž˜K˜Kšžœžœžœžœ˜Kšžœžœžœ˜K˜šΟn œžœ˜(K˜$K˜K˜—Kšœžœ˜)K˜š  œžœ˜0Kšœžœ˜+Kšœ-žœ˜7K˜—K˜šœ+˜+KšœA™AKšœžœ˜+K˜.š žœžœžœžœžœžœ˜TKšœ5žœ˜?Kšœ žœ˜K˜—KšžœžœΟc%˜CK˜—K˜Kšœ#žœ˜'Kš   œžœžœžœžœ˜PKšœ:™:K˜šœ˜KšœN™NKšœžœ ˜)Kšœžœ˜Kšœ˜—K™š  œžœžœ žœžœžœžœžœžœžœ˜KšœP™PKšœ=™=Kšœ žœ˜Kšœ˜K˜KšœžœžœI˜T˜1Kšœžœžœ˜@—Kšœ8žœ žœ˜aKšœožœ˜uK˜K˜Kšœžœ*žœ˜BK˜K˜"šœ˜Kšœžœa˜nKšœ<˜<—Kšœ'˜'Kšœžœ ‘'˜_K˜.KšœM˜MK˜:Kšœ$˜$Kšœ,žœDžœ˜zK˜Kšžœ˜ K˜—K˜Kšœžœ˜˜#Kšœ žœ ˜Kš œžœžœžœžœžœ:˜eKšžœ žœGžœ˜_K˜3K˜K˜—K˜TK˜Kšžœ˜—…—RŸ