-- JaMLiteral.mesa
-- Written by: John Warnock, January, 1979
-- Last changed by Doug Wyatt, March 29, 1980 7:12 PM

DIRECTORY
JaMLiteralDefs: FROM "JaMLiteralDefs",
JaMMasterDefs: FROM "JaMMasterDefs" USING [
Object, Stack],
JaMStackDefs: FROM "JaMStackDefs" USING [
Push],
JaMVMDefs: FROM "JaMVMDefs" USING [
AllocateCharsVM, PutCharsVM],
StreamDefs: FROM "StreamDefs" USING [
StreamHandle];

JaMLiteral: PROGRAM
IMPORTS JaMStackDefs, JaMVMDefs
EXPORTS JaMLiteralDefs =
BEGIN OPEN JaMMasterDefs;

-- The following routines implement a set of literal building routines.
-- The resulting constructed literal is pushed on the operand stack.

IntegerLit: PUBLIC PROCEDURE [i:INTEGER,s:Stack] =
BEGIN
JaMStackDefs.Push[Object[lit,IntegerType[i]],s];
END;

LongIntegerLit: PUBLIC PROCEDURE [l:LONG INTEGER,s:Stack] =
BEGIN
JaMStackDefs.Push[Object[lit,LongIntegerType[l]],s];
END;

RealLit: PUBLIC PROCEDURE [r:REAL,s:Stack] =
BEGIN
JaMStackDefs.Push[Object[lit,RealType[r]],s];
END;

BooleanLit: PUBLIC PROCEDURE [b:BOOLEAN,s:Stack] =
BEGIN
JaMStackDefs.Push[Object[lit,BooleanType[BooleanVal:b]],s];
END;

StringLit: PUBLIC PROCEDURE [string:STRING,s:Stack] =
BEGIN
st:StringType Object ← MakeStringObject[string];
st.litflag ← lit;
JaMStackDefs.Push[st,s];
END;

UserLit: PUBLIC PROCEDURE [type:INTEGER,address:LONG POINTER,s:Stack] =
BEGIN
us:UserType Object ←[lit,UserType[type,address]];
JaMStackDefs.Push[us,s];
END;

MakeStringObject: PUBLIC PROCEDURE [string:STRING]
RETURNS [ob:StringType Object] =
BEGIN
ob← [nolit,StringType[,,]];
[ob.Address,ob.Offset]←JaMVMDefs.AllocateCharsVM[string.length];
ob.Length←string.length;
JaMVMDefs.PutCharsVM[ob.Address,ob.Offset,
@string.text,0,string.length];
END;

StreamLit: PUBLIC PROCEDURE[stream:StreamDefs.StreamHandle,s:Stack] =
BEGIN
JaMStackDefs.Push[Object[lit,StreamType[stream]],s];
END;

END.