DIRECTORY Ascii USING [NUL], Inline USING [LowHalf, DBITAND, DBITOR, DBITXOR, DBITNOT, DBITSHIFT]; CRunTimeDefs: DEFINITIONS IMPORTS Inline = { -- INTERFACE CONSTANTS -- NUL: INTEGER = Ascii.NUL-0C; -- INTERFACE PROCEDURES -- -- First we define all the value-producing assignments -- which produce a value but also (as a side effect) -- assign a value to a variable PostInc: PROCEDURE [x: LONG POINTER TO LONG UNSPECIFIED, amount: INTEGER] RETURNS [LONG UNSPECIFIED] = INLINE { temp: LONG UNSPECIFIED _ x^; x^ _ x^ + LONG[amount]; RETURN [temp] }; PostIncPtr: PROCEDURE [x: LONG POINTER TO LONG POINTER, amount: INTEGER] RETURNS [LONG POINTER] = INLINE { temp: LONG POINTER _ x^; x^ _ x^ + LONG[amount]; RETURN [temp] }; PostDec: PROCEDURE [x: LONG POINTER TO LONG UNSPECIFIED, amount: INTEGER] RETURNS [LONG UNSPECIFIED] = INLINE { temp: LONG UNSPECIFIED _ x^; x^ _ x^ - LONG[amount]; RETURN [temp] }; PostDecPtr: PROCEDURE [x: LONG POINTER TO LONG POINTER, amount: INTEGER] RETURNS [LONG POINTER] = INLINE { temp: LONG POINTER _ x^; x^ _ x^ - LONG[amount]; RETURN [temp] }; PlusAssign: PROCEDURE [x: LONG POINTER TO LONG UNSPECIFIED, y: LONG INTEGER] RETURNS [LONG UNSPECIFIED] = INLINE { RETURN [x^ _ x^ + y]; }; PlusAssignPtr: PROCEDURE [x: LONG POINTER TO LONG POINTER, y: LONG INTEGER] RETURNS [LONG POINTER] = INLINE { RETURN [x^ _ x^ + y]; }; MinusAssign: PROCEDURE [x: LONG POINTER TO LONG UNSPECIFIED, y: LONG INTEGER] RETURNS [LONG UNSPECIFIED] = INLINE { RETURN [x^ _ x^ - y]; }; MinusAssignPtr: PROCEDURE [x: LONG POINTER TO LONG POINTER, y: LONG INTEGER] RETURNS [LONG POINTER] = INLINE { RETURN [x^ _ x^ - y]; }; MultiplyAssign: PROCEDURE [x: LONG POINTER TO LONG INTEGER, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [x^ _ x^ * y]; }; DivideAssign: PROCEDURE [x: LONG POINTER TO LONG INTEGER, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [x^ _ x^ / y]; }; ModulusAssign: PROCEDURE [x: LONG POINTER TO LONG INTEGER, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [x^ _ x^ MOD y]; }; ShiftLeftAssign: PROCEDURE [x: LONG POINTER TO LONG INTEGER, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [x^ _ ShiftLeft[x^, y]]; }; ShiftRightAssign: PROCEDURE [x: LONG POINTER TO LONG INTEGER, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [x^ _ ShiftRight[x^, y]]; }; BitAndAssign: PROCEDURE [x: LONG POINTER TO LONG INTEGER, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [x^ _ BitAnd[x^, y]]; }; BitOrAssign: PROCEDURE [x: LONG POINTER TO LONG INTEGER, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [x^ _ BitOr[x^, y]]; }; BitXorAssign: PROCEDURE [x: LONG POINTER TO LONG INTEGER, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [x^ _ BitXor[x^, y]]; }; -- Now we define the support procedures that are not directly -- implemented in Mesa and so must be implemented by inline -- procedures which call other inline procedures provided -- in the Mesa/Tajo environment. BitAnd: PROCEDURE [x, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [Inline.DBITAND[x, y]] }; BitOr: PROCEDURE [x, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [Inline.DBITOR[x, y]] }; BitXor: PROCEDURE [x, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [Inline.DBITXOR[x, y]] }; BitNot: PROCEDURE [x: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [Inline.DBITNOT[x]] }; ShiftLeft: PROCEDURE [x, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [Inline.DBITSHIFT[x, Inline.LowHalf[y]]] }; ShiftRight: PROCEDURE [x, y: LONG INTEGER] RETURNS [LONG INTEGER] = INLINE { RETURN [Inline.DBITSHIFT[x, -Inline.LowHalf[y]]] }; StringToArray: PROCEDURE [s: LONG STRING] RETURNS [LONG POINTER TO INTEGER]; }.