-- JaMFnsImpl.mesa -- Last changed by Doug Wyatt, 20-Jan-82 16:40:30 DIRECTORY JaMBasic USING [Object], JaMFns USING [], JaMInternal USING [Frame, FrameRecord], JaMOps USING [defaultFrame, Error, Execute, GetAbort, GetStream, MakeStream, MakeString, Pop, PopBoolean, PopInteger, PopReal, PopStream, PopString, Push, PushBoolean, PushInteger, PushReal, rangechk, RegisterExplicit, SetAbort, StringText], Inline USING [LowHalf], StreamDefs USING [StreamHandle]; JaMFnsImpl: PROGRAM IMPORTS JaMOps, Inline EXPORTS JaMFns = { OPEN JaMInternal, JaMBasic; StreamHandle: TYPE = StreamDefs.StreamHandle; FrameObject: PUBLIC TYPE = FrameRecord; -- exported TYPE for JaMFns GetFrame: PROC[f: Frame] RETURNS[Frame] = INLINE { RETURN[IF f=NIL THEN JaMOps.defaultFrame ELSE f] }; Register: PUBLIC PROC[string: LONG STRING, proc: PROC[Frame], f: Frame] = { frame: Frame ← GetFrame[f]; JaMOps.RegisterExplicit[frame,string,proc]; }; Execute: PUBLIC PROC[string: LONG STRING, f: Frame] = { frame: Frame ← GetFrame[f]; ob: string Object ← JaMOps.MakeString[string]; ob.tag ← X; JaMOps.Execute[frame, ob]; }; PushInteger: PUBLIC PROC[i: INTEGER, f: Frame] = { frame: Frame ← GetFrame[f]; JaMOps.PushInteger[frame.opstk,i]; }; PopInteger: PUBLIC PROC[f: Frame] RETURNS[INTEGER] = { frame: Frame ← GetFrame[f]; i: LONG INTEGER ← JaMOps.PopInteger[frame.opstk]; IF i IN[FIRST[INTEGER]..LAST[INTEGER]] THEN RETURN[Inline.LowHalf[i]] ELSE ERROR JaMOps.Error[JaMOps.rangechk]; }; PushLongInteger: PUBLIC PROC[i: LONG INTEGER, f: Frame] = { frame: Frame ← GetFrame[f]; JaMOps.PushInteger[frame.opstk,i]; }; PopLongInteger,GetLongInteger: PUBLIC PROC[f: Frame] RETURNS[LONG INTEGER] = { frame: Frame ← GetFrame[f]; RETURN[JaMOps.PopInteger[frame.opstk]]; }; PushReal: PUBLIC PROC[r: REAL, f: Frame] = { frame: Frame ← GetFrame[f]; JaMOps.PushReal[frame.opstk,r]; }; PopReal,GetReal: PUBLIC PROC[f: Frame] RETURNS[REAL] = { frame: Frame ← GetFrame[f]; RETURN[JaMOps.PopReal[frame.opstk]]; }; PushBoolean: PUBLIC PROC[b: BOOLEAN, f: Frame] = { frame: Frame ← GetFrame[f]; JaMOps.PushBoolean[frame.opstk,b]; }; PopBoolean: PUBLIC PROC[f: Frame] RETURNS[BOOLEAN] = { frame: Frame ← GetFrame[f]; RETURN[JaMOps.PopBoolean[frame.opstk]]; }; PushString: PUBLIC PROC[s: LONG STRING, f: Frame] = { frame: Frame ← GetFrame[f]; ob: string Object ← JaMOps.MakeString[s]; JaMOps.Push[frame.opstk,ob]; }; PopString: PUBLIC PROC[s: LONG STRING, f: Frame] = { frame: Frame ← GetFrame[f]; ob: string Object ← JaMOps.PopString[frame.opstk]; WHILE s.maxlength<ob.length DO s ← SIGNAL StringOverflow[s] ENDLOOP; JaMOps.StringText[ob,s]; }; StringOverflow: PUBLIC SIGNAL[s: LONG STRING] RETURNS[ns: LONG STRING] = CODE; PushStream: PUBLIC PROC[s: StreamHandle, f: Frame] = { frame: Frame ← GetFrame[f]; ob: stream Object ← JaMOps.MakeStream[s]; JaMOps.Push[frame.opstk,ob]; }; PopStream: PUBLIC PROC[f: Frame] RETURNS[StreamHandle] = { frame: Frame ← GetFrame[f]; ob: stream Object ← JaMOps.PopStream[frame.opstk]; RETURN[JaMOps.GetStream[ob]]; }; Pop: PUBLIC PROC[f: Frame] = { frame: Frame ← GetFrame[f]; [] ← JaMOps.Pop[frame.opstk]; }; GetJaMBreak: PUBLIC PROC[f: Frame] RETURNS[BOOLEAN] = { frame: Frame ← GetFrame[f]; RETURN[JaMOps.GetAbort[frame]]; }; SetJaMBreak: PUBLIC PROC[flag: BOOLEAN ← TRUE, f: Frame] = { frame: Frame ← GetFrame[f]; JaMOps.SetAbort[frame,flag]; }; }.