DIRECTORY Basics USING [LongNumber, LowHalf], Commander USING [Handle, CommandProc], IO USING [STREAM], Real USING [RoundLI, Fix, Float], RealFns USING [SinDeg, CosDeg, ArcTanDeg, Exp, Ln, SqRt], Rope USING [ROPE]; PascalBasic: CEDAR DEFINITIONS IMPORTS Basics, Real, RealFns = BEGIN PascalInteger: TYPE = LONG INTEGER; PascalReal: TYPE = REAL; PascalChar: TYPE = CHARACTER; PascalBoolean: TYPE = BOOLEAN; AlfaLength: PascalInteger = 10; AlfaIndex: TYPE = [1..AlfaLength]; Alfa: TYPE = PACKED ARRAY AlfaIndex OF PascalChar; CharArrayPtr: TYPE = LONG POINTER; CharArrayConcretePtr: TYPE = LONG POINTER TO PACKED ARRAY[1..1) OF PascalChar _ NIL; CommandProc: TYPE = Commander.CommandProc; UnsafeCommandProc: TYPE = UNSAFE PROC; ROPE: TYPE = Rope.ROPE; Maxint: PascalInteger = LAST[PascalInteger]; PascalStaticZone: UNCOUNTED ZONE; -- for static allocations PascalZone: UNCOUNTED ZONE; -- for dynamic allocations z: ZONE; -- for the runtime's own use subsystemName: ROPE; ProcRec: TYPE = RECORD [p: UnsafeCommandProc]; SubsystemProcRec: ProcRec; ExclusiveProc: CommandProc; commandLineTail: ROPE; clientData: REF ANY; ttyInputStream: IO.STREAM; ttyOutputStream: IO.STREAM; NumericInputError: SIGNAL; PascalHalt: SIGNAL; AttemptToDisposeInvalidPtr: SIGNAL; PascalRegister: PROCEDURE[name: ROPE, proc: UnsafeCommandProc]; PascalHALT: PROCEDURE = INLINE {SIGNAL PascalHalt}; longInt: PROCEDURE [x: INT] RETURNS [INT] = INLINE {RETURN[x]}; card: PROCEDURE [x: CARDINAL] RETURNS [CARDINAL] = INLINE {RETURN[x]}; nat: PROCEDURE [x: NAT] RETURNS [NAT] = INLINE {RETURN[x]}; shortInt: PROCEDURE [x: INTEGER] RETURNS [INTEGER] = INLINE {RETURN[x]}; PascalIntegerSQR: PROCEDURE [x: PascalInteger] RETURNS [PascalInteger] = INLINE {RETURN[x*x]}; PascalRealSQR: PROCEDURE [x: PascalReal] RETURNS [PascalReal] = INLINE { RETURN[x*x]}; PascalSIN: PROCEDURE [x: PascalReal] RETURNS [PascalReal] = INLINE { RETURN[RealFns.SinDeg[x]]}; PascalCOS: PROCEDURE [x: PascalReal] RETURNS [PascalReal] = INLINE { RETURN[RealFns.CosDeg[x]]}; PascalEXP: PROCEDURE [x: PascalReal] RETURNS [PascalReal] = INLINE { RETURN[RealFns.Exp[x]]}; PascalLN: PROCEDURE [x: PascalReal] RETURNS [PascalReal] = INLINE { RETURN[RealFns.Ln[x]]}; PascalSQRT: PROCEDURE [x: PascalReal] RETURNS [PascalReal] = INLINE { RETURN[RealFns.SqRt[x]]}; PascalARCTAN: PROCEDURE [x: PascalReal] RETURNS [PascalReal] = INLINE { RETURN[RealFns.ArcTanDeg[y: x, x: 1.0]]}; PascalROUND: PROCEDURE [x: PascalReal] RETURNS [PascalInteger] = Real.RoundLI; PascalTRUNC: PROCEDURE [x: PascalReal] RETURNS [PascalInteger] = Real.Fix; PascalFLOAT: PROCEDURE [x: PascalInteger] RETURNS [PascalReal] = Real.Float; PascalMULPower2: PROC [i: INT, lg: NAT] RETURNS [INT]; PascalDIVPower2: PROC [i: INT, lg: NAT] RETURNS [INT]; PascalMODPower2Mask: PROC [i: INT, mask: --nonneg-- INT] RETURNS [INT]; PascalODD: PROCEDURE [x: PascalInteger] RETURNS [PascalBoolean] = INLINE { t: Basics.LongNumber = [li[x]]; RETURN[(t.lo MOD 2) # 0]}; PascalORD: PROCEDURE [x: LONG UNSPECIFIED] RETURNS [PascalInteger] = INLINE { RETURN[LOOPHOLE[x, PascalInteger]]}; PascalCHR: PROCEDURE [x: PascalInteger] RETURNS [PascalChar] = INLINE { RETURN[LOOPHOLE[Basics.LowHalf[LOOPHOLE[x, LONG CARDINAL]], PascalChar]]}; PascalDATE: PROCEDURE [a: LONG POINTER TO Alfa]; PascalTIME: PROCEDURE [a: LONG POINTER TO Alfa]; PascalReadClock: PROCEDURE RETURNS [PascalInteger]; PascalStringCompare, PascalLongStringCompare: PROCEDURE [ aa: CharArrayPtr _ NIL, aLen: PascalInteger _ 0, as: ROPE _ NIL, ba: CharArrayPtr _ NIL, bLen: PascalInteger _ 0, bs: ROPE _ NIL] RETURNS [[-1..1]]; END. -- PascalBasic fPascalBasic.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. last modified by Ramshaw, February 3, 1984 8:45 pm written by McCreight, November 17, 1980 3:13 PM Michael Plass, September 27, 1985 10:04:21 am PDT The basics of Pascal runtime support in Cedar: storage, arithmetic, date, time, stringcompare, and CommandProc stuff T Y P E S The Alto version uses short integers instead, because of Alto compiler problems The following types are for Pascal strings passed by VAR; the nonspecific first version is for passing "strings" of any length to the runtime support routines. C O N S T A N T S V A R I A B L E S The Alto version also exports an MDSZone for short pointer allocations. S I G N A L S P R O C E D U R E S Called by PasMesa Warning! The Alto version of this interface defins PascalReadClock to return a PascalReal instead, since 16 bits isn't enough precision for runtimes in milliseconds. a and b are either ROPE's (generated as literals) or LONG POINTERs to packed arrays [1..Len) of characters, depending on which arguments are NIL. The result is -1 if ab. Κ•˜šœ™Icodešœ Οmœ1™˜Jšž˜J˜Jšœ ™ J˜Jšœžœžœžœ˜#JšœP™PJšœ žœžœ˜Jšœ žœž œ˜Jšœžœžœ˜J˜J˜Jšœ žœ˜"Jš œžœžœžœ žœ ˜2J˜JšœJ™JJšœU™UJšœžœžœžœ˜"šœžœžœžœž˜,Jšžœžœžœžœ˜'J˜—Jšœ žœ˜*JšΟnœžœžœžœ˜&Jšžœžœžœ˜J˜Jšœ™J˜Jšœžœ˜,J˜J˜Jšœ™J˜Jšœž œžœΟc˜;Jšœ ž œžœ ˜6Jšœžœ ˜&J˜JšœG™GJ˜Jšœžœ˜Jšœ žœžœ˜.Jšœ˜Jšœ˜Jšœžœ˜Jšœ žœžœ˜Jšœžœžœ˜Jšœžœžœ˜J˜Jšœ ™ J˜Jšœžœ˜Jšœ žœ˜Jšœžœ˜#J˜J˜Jšœ'™'J˜JšŸœž œžœ˜?J˜JšŸ œž œžœžœ ˜3J˜Jš œ ž œžœžœžœžœžœ˜?J˜Jš œž œžœžœžœžœžœ˜FJ˜Jš œž œžœžœžœžœžœ˜;J˜Jš œ ž œžœžœžœžœžœ˜HJ˜šŸœž œžœž˜OJšœžœ˜J˜—šŸ œž œžœžœ˜HJšžœ˜ J˜—šŸ œž œžœžœ˜DJšžœ˜J˜—šŸ œž œžœžœ˜DJšžœ˜J˜—šŸ œž œžœžœ˜DJšžœ˜J˜—šŸœž œžœžœ˜CJšžœ˜J˜—šŸ œž œžœžœ˜EJšžœ˜J˜—šŸ œž œžœžœ˜GJšžœ#˜)J˜—JšŸ œž œžœ ˜NJ˜JšŸ œž œžœ˜JJ˜JšŸ œž œžœ˜LJ˜š Ÿœžœžœžœžœžœ˜6K˜—š Ÿœžœžœžœžœžœ˜6K˜—šŸœžœžœ  œžœžœžœ˜GK˜—šŸ œž œžœžœ˜JKšœ˜Jšžœžœ ˜J˜—š Ÿ œž œžœž œžœžœ˜MJšžœžœ˜$J˜—šŸ œž œžœžœ˜GJš žœžœžœžœžœ˜JJ˜—Jš Ÿ œž œžœžœžœ˜0J˜Jš Ÿ œž œžœžœžœ˜0J˜JšŸœž œžœ˜3JšœL™LJšœJ™JJšœ ™ J˜šœŸœž œ˜9Jšœžœžœžœ˜@Jšœžœžœžœ˜@Jšžœ ˜Jšœ4™4Jšœ*™*Jšœ1™1Jšœ0™0J˜—Jšžœ ˜J˜J˜J˜J˜——…—B=