-- PLImpl.mesa, Last Modified On 6-Nov-81 13:47:56, JHM DIRECTORY Disp: TYPE USING [ClearScreen, DispReset, DispSetup, Print, PrintString, ToggleMore], IO: TYPE USING [Handle, PutF, PutFR, rope, ROPE, time], PL: TYPE USING [BlessString, Dist, EndDisplay, Eval, GetSpecialNodes, Insert, Interrupt, Node, NodeType, ParseSetup, PBug, RErr, rSTR, SErr, SetCurrentNode, SN, StoreSetup, SupSetup, Symbol], PString: TYPE USING [StringToFile, Sub, SubString], Rope: TYPE USING [Concat, Equal, Length, ROPE], Route: TYPE USING [KeyRoutine, Route1Setup, Route2Setup], SafeStorage: TYPE USING [NewZone], WindowProcInt: TYPE USING [StartWindowProc]; PLImpl: CEDAR PROGRAM IMPORTS D1:Disp, S: PString, P:PL, Route, SafeStorage, IO, Rope, WindowProcInt EXPORTS PL = BEGIN OPEN Rope, IO, P; -- IS, OS, ES: PUBLIC Handle; NodeType: TYPE = PL.NodeType; Node: TYPE = PL.Node; Symbol: TYPE = PL.Symbol; -- edfile: STRING ← [30]; IMax: CARDINAL = 2; IStack: ARRAY[1..IMax] OF Node ← ALL[NIL]; Abort: BOOLEAN ← FALSE; MTSt,Fail,Nail: Node; Z: PUBLIC ZONE; DayTimeRoutine: PROC[Node] RETURNS[Node] = { RETURN[P.SN[IO.PutFR["%t", IO.time[]]]]; }; --SetMaxDataQuantaRoutine: PROC[n1: Node] RETURNS[Node] = --BEGIN --n: CARDINAL = VM.Cardinal[S.MakeInteger[P.BlessString[n1]]]; --nn: LONG INTEGER = RTStorageOps.SetMaxDataQuanta[n]; --RETURN[P.SN[S.MakeNUM[nn]]]; --END; PrintTop: PROC = BEGIN D1.ClearScreen[]; [] ← D1.ToggleMore[]; WITH IStack[1] SELECT FROM x: rSTR => BEGIN D1.PrintString[x.str]; OS.PutF["\n"]; END ENDCASE => D1.Print[IStack[1]]; [] ← D1.ToggleMore[]; END; PushI: PROC[n: Node] = BEGIN i: CARDINAL; FOR i DECREASING IN [1..IMax) DO IStack[i+1] ← IStack[i]; ENDLOOP; IStack[1] ← n; -- this is the top of stack END; PopI: PROC = BEGIN i: CARDINAL; FOR i IN [2..IMax] DO IStack[i-1] ← IStack[i]; ENDLOOP; IStack[IMax] ← Nail; END; Setup: PROC = BEGIN -- []←RTStorageOps.SetMaxDataQuanta[200]; P.StoreSetup[]; -- inserts don't work till this is done P.ParseSetup[]; P.SupSetup[]; Route.Route1Setup[]; Route.Route2Setup[]; D1.DispSetup[]; [] ← P.Insert["daytime",[,,ZARY[DayTimeRoutine]]]; END; n: Node; prog: ROPE; PoplarProcess: PROC [in, out, error: IO.Handle]= { IS ← in; OS ← out; ES ← error; [Fail,MTSt, Nail] ← P.GetSpecialNodes[]; Setup[]; FOR i: CARDINAL IN [1.. IMax] DO IStack[i] ← Nail; ENDLOOP; DO ENABLE BEGIN UNWIND, ABORTED => BEGIN OS.PutF["XXX\n"]; RETRY END; P.EndDisplay => RETRY; P.Interrupt => BEGIN OS.PutF["**** Interrupt ****\n"]; RETRY; END; P.PBug => BEGIN OS.PutF["Poplar Bug!! - %g\n", rope[est]]; RETRY; END; P.RErr => BEGIN OS.PutF["Runtime Error - %g\n", rope[est]]; RETRY; END; P.SErr => RETRY; --ANY => BEGIN -- OS.PutF["Mysterious Poplar Bug!!!\n"]; -- RETRY; -- END END; D1.DispReset[]; n ← Route.KeyRoutine[MTSt]; IF n.Type = FAIL THEN LOOP; prog ← P.BlessString[n]; IF Rope.Length[prog]=0 THEN LOOP ELSE IF Rope.Equal[prog,"un", FALSE] THEN BEGIN PopI[]; PrintTop; END ELSE IF Rope.Equal[prog,"q",FALSE] OR Rope.Equal[prog,"quit",FALSE] THEN EXIT ELSE IF Rope.Equal[prog,"more",FALSE] THEN BEGIN [] ← D1.ToggleMore[]; PrintTop; [] ← D1.ToggleMore[]; END ELSE IF S.Sub[prog,0] = '$ THEN BEGIN prog ← S.StringToFile[Rope.Concat[S.SubString[prog, 1, Rope.Length[prog]], ".pl"]]; IF prog = NIL THEN { OS.PutF["Not found!\n"]} ELSE [] ← P.Eval[P.Dist[prog], NIL] END ELSE {P.SetCurrentNode[IStack[1]]; {tt:Node = P.Dist[prog]; IF tt.Type=ASS THEN []←P.Eval[tt,NIL] ELSE {PushI[P.Eval[tt,NIL]];PrintTop}}} ENDLOOP; }; Z ← SafeStorage.NewZone[quantized]; WindowProcInt.StartWindowProc["Poplar0.9", PoplarProcess]; END.