Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!linus!philabs!cmcl2!seismo!rochester!bullwinkle!uw-beaver!tikal!bobc From: bobc@tikal.UUCP (Bob Campbell) Newsgroups: net.sources.mac Subject: ETHZ Standalone Definition Modules (2 of 4) Message-ID: <420@tikal.UUCP> Date: Thu, 8-May-86 11:32:36 EDT Article-I.D.: tikal.420 Posted: Thu May 8 11:32:36 1986 Date-Received: Wed, 14-May-86 05:06:41 EDT Reply-To: bobc@tikal.UUCP (Bob Campbell) Organization: Teltone Corp., Kirkland, WA Lines: 615 # The rest of this file is a shell script which will extract: # FileTypes.DEF FontManager.DEF IUPackage.DEF InOut.DEF MacSYSTEM.DEF # MathLib0.DEF MathLib1.DEF echo x - FileTypes.DEF cat >FileTypes.DEF <<'!Funky!Stuff!' DEFINITION MODULE FileTypes; FROM SYSTEM IMPORT ADDRESS,WORD; FROM MacSYSTEM IMPORT LONGINT,StringPtr; FROM QuickDraw IMPORT Point; EXPORT QUALIFIED (*CONST*) fHasBundle,fInvisible,fTrash,fDesktop,fDisk, fsAtMark,fsFromStart,fsFromLEOF,fsFromMark, fsCurPerm,fsRdPerm,fsWrPerm,fsRdWrPerm, badMDBErr,bdNamErr,dirFulErr,dskFulErr,dupFNErr,eofErr, extFSErr,fBsyErr,fLckdErr,fnfErr,fnOpnErr,fsRnErr, ioErr,mFulErr,nsDrvErr,noMacDskErr,nsvErr, opWrErr,paramErr,permErr,posErr,rfNumErr,tmfoErr, volOffLinErr,volOnLinErr,vLckdErr,wrPermErr,wPrErr, (*TYPE*) OSType,FInfo,ParamBlkPtr,ParamBlkType,ParamBlockRec; CONST fHasBundle = 32; (* File has bundle *) fInvisible = 64; (* file's icon is invisible *) fTrash = -3; (* file is in trash window *) fDesktop = -2; (* file is on desktop *) fDisk = 0; (* file is in disk window *) (* Values for posMode and ioPosMode *) fsAtMark = 0; (* at current position of mark *) (* (posOff or ioPosOffset ignored) *) fsFromStart = 1; (* offset from beginning of file *) fsFromLEOF = 2; (* offset from logical end-of-file *) fsFromMark = 3; (* offset from current mark *) (* Values for requesting read/write access *) fsCurPerm = 0C; (* whatever is currently allowed *) fsRdPerm = 1C; (* read only *) fsWrPerm = 2C; (* write only *) fsRdWrPerm = 3C; (* request to read and write *) (* Result Codes *) badMDBErr = -60; (* Master Block Bad *) bdNamErr = -37; (* Bad file name or volume name *) dirFulErr = -33; (* File directory full *) dskFulErr = -34; (* All allocation blocks on volume are full *) dupFNErr = -48; (* file name already exists *) eofErr = -39; extFSErr = -58; (* External FS error, .... *) fBsyErr = -47; (* One or more files open? *) fLckdErr = -45; (* File is locked *) fnfErr = -43; (* File not found *) fnOpnErr = -38; (* File not open *) fsRnErr = -59; (* Problem during Rename *) ioErr = -36; (* Disk I/O error *) mFulErr = -41; (* System heap is full *) nsDrvErr = -56; (* Drive not in Drive Queue *) noMacDskErr = -57; (* Volume lacks Macintosh-format *) nsvErr = -35; (* Volume does not exist *) opWrErr = -49; (* Permissions only allow one access path *) paramErr = -50; (* No Default Volume *) permErr = -54; (* Permission disallowed *) posErr = -40; (* Attempt to position before start of file *) rfNumErr = -51; (* Nonexistent access path *) tmfoErr = -42; (* only 12 files can be open at one time *) volOffLinErr= -53; (* volume not on line *) volOnLinErr = -55; (* volume already on line *) vLckdErr = -46; (* volume is locked by a software flag *) wrPermErr = -61; (* writing not allowed *) wPrErr = -44; (* volume is locked by hardware *) TYPE OSErr = INTEGER; OSType = ARRAY [0..3] OF CHAR; FInfo = RECORD fdType: OSType; (* file type *) fdCreator: OSType; (* file's creator *) fdFlags: INTEGER;(* flags *) fdLocation: Point; (* file's location *) fdFldr: INTEGER;(* file's window *) END; ParamBlkPtr = POINTER TO ParamBlockRec; ParamBlkType = (ioParam,fileParam,volumeParam,cntrlParam); ParamBlockRec = RECORD qLink: ADDRESS; (* next queue entry *) qType: INTEGER; (* queue type *) ioTrap: INTEGER; (* routine trap *) ioCmdAddr: ADDRESS; (* routine address *) ioCompletion: ADDRESS; (* completion routine *) ioResult: OSErr; (* result code *) ioNamePtr: POINTER TO ARRAY [0..255] OF CHAR; ioVRefNum: INTEGER; CASE ParamBlkType OF ioParam: ioRefNum: INTEGER; (* Path reference number *) ioVersNum: CHAR; (* version number *) ioPermssn: CHAR; (* read/write permission *) ioMisc: ADDRESS; (* miscellaneous *) ioBuffer: ADDRESS; (* data buffer *) ioReqCount: LONGINT; (* requested number of bytes *) ioActCount: LONGINT; (* actual number of bytes *) ioPosMode: INTEGER; (* newlint character any type of * positioning operation *) ioPosOffset:LONGINT; (* size of positioning offset *) | fileParam: ioFRefNum: INTEGER; (* path reference number *) ioFVersNum: CHAR; (* version Number *) filler1: CHAR; (* pad *) ioFDirIndex: INTEGER; (* File Number *) ioFlAttrib: CHAR; (* File Attributes *) ioFlVersNum: CHAR; (* version number *) ioFlFndrInfo: FInfo; (* finder information *) ioFlNum: LONGINT; (* file number *) ioFlStBlk: INTEGER; (* first block of data fork *) ioFlLgLen: LONGINT; (* Logical end-of-file data fork *) ioFlPyLen: LONGINT; (* physical end-of-file data fork *) ioFlRStBlk: INTEGER; (* first block of resource fork *) ioFlRLgLen: LONGINT; (* logical EOF resource fork *) ioFlRPyLen: LONGINT; (* physical EOF resource fork *) ioFlCrDat: LONGINT; (* date and time of creation *) ioFlMdDat: LONGINT; (* date and time of modification *) | volumeParam: filler2: LONGINT; (* not used *) ioVolIndex: INTEGER; (* volume index *) ioVCrDate: LONGINT; (* time of initialization *) ioVLsBkUp: LONGINT; (* time of last back up *) ioVAtrb: INTEGER; (* bit 15=1 if volume locked *) ioVNmFls: INTEGER; (* number of files in directory *) ioVDirSt: INTEGER; (* first block of file directory *) ioVBlLn: INTEGER; (* number of blocks in directory *) ioVNmAlBlks: INTEGER; (* number of blocks on volume *) ioVAlBlkSiz: LONGINT; (* number of bytes per block *) ioVClpSiz: LONGINT; (* number of bytes to allocate *) ioAlBlSt: INTEGER; (* first block in volume block map*) ioVNxtFNum: LONGINT; (* next free file number *) ioVFrBlk: INTEGER; END (*CASE*) END (*RECORD*); (* NOT USED * VCB = RECORD * qLink: QElemPtr; (* next queue entry *) * qType: INTEGER; (* not used *) * vcbFlags: INTEGER; (* bit 15=1 if dirty *) * vcbSigWord: INTEGER; (* always $D2D7 *) * vcbCrDate: LONGINT; (* date volume was initialized *) * vcbLsBkUp: LONGINT; (* date volume was last backed up *) * vcbAtrb: INTEGER; (* volume attributes *) * vcbNmFls: INTEGER; (* number of fines in directory *) * vcbDirSt: INTEGER; (* directory's first block *) * vcbBlLn: INTEGER; (* length of file directory *) * vcbNmBlks: INTEGER; (* number of allocation blocks *) * vcbAlBlkSize:LONGINT; (* size of allocation blocks *) * vcbClpSiz: LONGINT; (* number of bytes to allocate *) * vcbAlBlSt: INTEGER; (* first block in block map *) * vcbNxtFNum: LONGINT; (* next unused file number *) * vcbFreeBks: INTEGER; (* number of unused blocks *) * vcbVN: ARRAY [0..27] OF CHAR; (* vol Name *) * vcbDrvNum: INTEGER; * vcbDRefNum: INTEGER; (* Driver reference number *) * vcbFSID: INTEGER; (* file system identifier *) * vcbVRefNum: INTEGER; (* volume reference number *) * vcbMAdr: ADDRESS; (* location of block map *) * vcbBufAdr: ADDRESS; (* location of volume buffer *) * vcbMLen: INTEGER; (* number of bytes in block map *) * vcbDirIndex:INTEGER; (* internal use *) * vcbDirBlk: INTEGER; (* internal use *) * END; * * DrvQEl = RECORD * (* flags: LONGINT *) * qLink: QElemPtr; * qType: INTEGER; * dQDrive:INTEGER; * dQRefNum:INTEGER; * dQFSID: INTEGER; * dQDrvSize:INTEGER * END; * *VAR *(*FSQHdr EQU $360; file system queue header (10 bytes)*) * FSQHdr[0360H]:QHdr; *(*VCBQHdr EQU $356; VCB queue header*) * VCBQHdr[0356H]:QHdr; *(*DrvQHdr EQU $308; queue header of drives in system [10 bytes]*) * DrvQHdr[0308H]:QHdr; *) END FileTypes. !Funky!Stuff! echo x - FontManager.DEF cat >FontManager.DEF <<'!Funky!Stuff!' DEFINITION MODULE FontManager; FROM MacSYSTEM IMPORT LONGINT,BYTE,Handle; FROM SYSTEM IMPORT ADDRESS,WORD; FROM QuickDraw IMPORT Style,Point; (* * This is the Font Manager from Inside Macintosh(TM) Volume I * * Because of problems with the extreme size of QuickDraw, the font * routine GetFontInfo, and the record FontInfo are in here not * in QuickDraw. *) EXPORT QUALIFIED (*CONST*) systemFont,applFont,newYork,geneva,monaco,venice,london, athens,sanFran,toronto,cairo,losAngeles,times,helvetica,courier, symbol,taliesin, commandMark,checkMark,diamondMark,appleMark, propFont,fixedFont,fontWid, (*TYPE*) FMInput,FMOutPtr,FMOutput,FontRec,FontInfo, (*PROC*) GetFontName,GetFNum,RealFont,GetFontInfo,SetFontLock,FMSwapFont; CONST systemFont = 0; applFont = 1; newYork = 2; geneva = 3; monaco = 4; venice = 5; london = 6; athens = 7; sanFran = 8; toronto = 9; cairo = 11; losAngeles = 12; times = 20; helvetica = 21; courier = 22; symbol = 23; taliesin = 24; (* special characters *) commandMark = 21C; checkMark = 22C; diamondMark = 23C; appleMark = 24C; propFont = 09000H; (* proportional font *) fixedFont = 0B000H; (* fixed-width font *) fontWid = 0ACB0H; (* font width table *) TYPE FMInput = RECORD family: INTEGER; (* font number *) size: INTEGER; (* font size *) face: Style; (* character style *) needBits: BOOLEAN; (* TRUE if drawing *) device: INTEGER; (* device-specific information *) numer: Point; (* numerators of scaling factors *) denom: Point; (* denominators of scaling factors *) END; FMOutPtr = POINTER TO FMOutput; FMOutput = RECORD errNum: INTEGER; (* not used *) fontHandle: Handle; (* handle to font record *) bold: BYTE; (* bold factor *) italic: BYTE; (* italic factor *) ulOffset: BYTE; (* underline shadow *) ulThick: BYTE; (* underline thickness *) shadow: BYTE; (* shadow factor *) extra: BYTE; (* width of style *) ascent: BYTE; (* ascent *) descent: BYTE; (* descent *) widMax: BYTE; (* width of style *) leading: BYTE; (* leading *) unused: BYTE; (* not used *) numer: Point; (* numerators of scaling factors *) denom: Point; (* denominators of scaling factors *) END; FontRec = RECORD fontType: INTEGER; (* proportional or fixed width *) firstChar: INTEGER; (* code of first defined char *) lastChar: INTEGER; (* code of last defined char *) widMax: INTEGER; (* maximum character width *) kernMax: INTEGER; (* negative of maximum character kern *) nDescent: INTEGER; (* negative of descent in pixels *) fRectWidth: INTEGER; (* width of font rectangle *) fRectHeight: INTEGER; (* height of font rectangle *) owTLoc: INTEGER; (* Offset to owTable in words *) ascent: INTEGER; (* Ascent in pixels *) descent: INTEGER; (* Descent in pixels *) leading: INTEGER; (* Leading in pixels *) rowWords: INTEGER; (* Row width of bitImage in Words *) (* bitImage: ARRAY [1..rowWords,1..chHeight] OF INTEGER; *) (* locTable: ARRAY [firstChar..lastChar+2] OF INTEGER; *) (* owTable: ARRAY [firstChar..lastChar+2] OF INTEGER; *) END; FontInfo = RECORD ascent: INTEGER; descent: INTEGER; widMax: INTEGER; leading: INTEGER; END; PROCEDURE GetFontName(fontNumber:INTEGER;VAR name:ARRAY OF CHAR); PROCEDURE GetFNum(VAR name:ARRAY OF CHAR;VAR fontNumber:INTEGER); PROCEDURE RealFont(fontNumber:INTEGER;pointSize:INTEGER):BOOLEAN; PROCEDURE GetFontInfo(VAR info:FontInfo); PROCEDURE SetFontLock(lock:BOOLEAN); PROCEDURE FMSwapFont (inRec: FMInput) : FMOutPtr; END FontManager. !Funky!Stuff! echo x - IUPackage.DEF cat >IUPackage.DEF <<'!Funky!Stuff!' DEFINITION MODULE IUPackage; FROM SYSTEM IMPORT ADDRESS; FROM MacSYSTEM IMPORT LONGINT,Handle; EXPORT QUALIFIED (*CONST*) currSymLead,currNegSym,currTrailingZ,currLeadingZ, mdy,dmy,ymd, dayLeadingZ,mntLeadingZ,century, secLeadingZ,minLeadingZ,hrLeadingZ, verUS,verFrance,verBritain,verGermany,verItaly, (*TYPE*) Intl0Hndl,Intl0Ptr,Intl0Rec, Intl1Hndl,Intl1Ptr,Intl1Rec, DateForm, (* Routines *) IUDateString,IUDatePString,IUTimeString,IUTimePString, IUMetric,IUGetIntl,IUSetIntl,IUCompString,IUMagString, IUEqualString,IUMagIDString; CONST (* Masks for currency format *) currSymLead = 16; (* set if currency symbol leads *) currNegSym = 32; (* set if minus sign for negative *) currTrailingZ = 64; (* set if trailing decimal zeroes *) currLeadingZ = 128; (* set if leading integer zero *) (* order of short date elements *) mdy = 0; (* Month Day Year *) dmy = 1; (* day month year *) ymd = 2; (* year month day *) (* masks for short date format *) dayLeadingZ = 32; (* set if leading zero for day *) mntLeadingZ = 64; (* set if leading zero for month *) century = 128; (* set if century included *) (* Masks for time format *) secLeadingZ = 32; (* set if leading zero for seconds *) minLeadingZ = 64; (* set if leading zero for minutes *) hrLeadingZ = 128; (* set if leading zero for hours *) (* High-order byte of version information *) verUS = 0; verFrance = 1; verBritain = 2; verGermany = 3; verItaly = 4; TYPE Intl0Hndl = POINTER TO Intl0Ptr; Intl0Ptr = POINTER TO Intl0Rec; Intl0Rec = RECORD decimalPt: CHAR; (* decimal point character *) thousSep: CHAR; (* thousands separator *) listSep: CHAR; (* list separator *) currSym1: CHAR; (* currency symbol *) currSym2: CHAR; currSym3: CHAR; currFmt: CHAR; (* currency format *) dateOrder: CHAR; (* order of short date elements *) shortDateFmt: CHAR; (* short date format *) dateSep: CHAR; (* date separator *) timeCycle: CHAR; (* 0 if 24-hour, 255 if 12-hour *) timeFmt: CHAR; (* time format *) mornStr: ARRAY [1..4] OF CHAR; (* trailing string for first 12-hour cycle *) eveStr: ARRAY [1..4] OF CHAR; (* trailing string for second 12-hour cycle *) timeSep: CHAR; (* time separator *) time1Suff: CHAR; (* trailing string for 24-hour cycle *) time2Suff: CHAR; time3Suff: CHAR; time4Suff: CHAR; time5Suff: CHAR; time6Suff: CHAR; time7Suff: CHAR; time8Suff: CHAR; metricSys: CHAR; (* 255 if metric, 0 if not *) intl0Vers: INTEGER;(* version information *) END; Intl1Hndl = POINTER TO Intl1Ptr; Intl1Ptr = POINTER TO Intl1Rec; Intl1Rec = RECORD days: ARRAY [1..7] OF ARRAY [0..15] OF CHAR; (* Day Names *) months: ARRAY [1..12] OF ARRAY [0..15] OF CHAR; (* month names *) suppressDay: CHAR; (* 0 for day name, 255 for none *) longDateFmt: CHAR; (* order of long date elements *) dayleading0: CHAR; (* 255 for leading 0 in day number *) abbrLen: CHAR; (* length for abbreviating names *) st0: ARRAY [1..4] OF CHAR; (* strings *) st1: ARRAY [1..4] OF CHAR; (* for *) st2: ARRAY [1..4] OF CHAR; (* long *) st3: ARRAY [1..4] OF CHAR; (* date *) st4: ARRAY [1..4] OF CHAR; (* format *) intl1Vers: INTEGER; (* version information *) localRtn: INTEGER; (* routine for localizing string *) (* comparision; actually may be longer than one integer *) END; DateForm = (shortDate, longDate, abbbrevDate,DFPad3,DFPad4, DFPad5,DFPad6,DFPad7,DFPad8); (* force to be WORD size *) (* Routines *) PROCEDURE IUDateString (dateTime:LONGINT;form:DateForm; VAR result:ARRAY OF CHAR); PROCEDURE IUDatePString (dateTime:LONGINT;form:DateForm; VAR result:ARRAY OF CHAR;intlParam:Handle); PROCEDURE IUTimeString(dateTime:LONGINT;wantSeconds:BOOLEAN; VAR result:ARRAY OF CHAR); PROCEDURE IUTimePString(dateTime:LONGINT;wantSeconds:BOOLEAN; VAR result:ARRAY OF CHAR; intlParam:Handle); PROCEDURE IUMetric():BOOLEAN; PROCEDURE IUGetIntl(theID:INTEGER):Handle; PROCEDURE IUSetIntl(refNum:INTEGER; theID:INTEGER;intlParam:Handle); PROCEDURE IUCompString(VAR aStr,bStr:ARRAY OF CHAR):INTEGER; (* Pascal Only *) PROCEDURE IUMagString(aPtr,bPtr:ADDRESS;aLen,bLen:INTEGER):INTEGER; PROCEDURE IUEqualString(VAR aStr,bStr:ARRAY OF CHAR):INTEGER; (* Pascal Only *) PROCEDURE IUMagIDString(aPtr,bPtr:ADDRESS;aLen,bLen:INTEGER):INTEGER; END IUPackage. !Funky!Stuff! echo x - InOut.DEF cat >InOut.DEF <<'!Funky!Stuff!' DEFINITION MODULE InOut; (* * copied from the book "PROGRAMMING IN * MODULA-2" by Miklaus Wirth Edited by * David Gries pages 103 and 104. *) FROM SYSTEM IMPORT WORD; EXPORT QUALIFIED EOL, Done, termCH, OpenInput, OpenOutput, CloseInput, CloseOutput, Read, ReadString, ReadInt, ReadCard, Write, WriteLn, WriteString, WriteInt, WriteCard, WriteOct,WriteHex; CONST EOL = 15C; (* SYSTEM DEPENDENT *) VAR Done: BOOLEAN; VAR termCH: CHAR; PROCEDURE OpenInput (VAR defext: ARRAY OF CHAR); (* request a file name and open input file "in". Done := "file was successfully opened". If open, subsequent input is read from this file. If name ends with ".", append extension defext*) (* This procedure will use the SFPackage on the Mac BC *) PROCEDURE OpenOutput (VAR defext: ARRAY OF CHAR); (* request a file name and open output file "out" Done := "file was successfully opened. If open, subsequent output is written on this file *) (* This procedure will also use the SFPackage on the Mac BC *) PROCEDURE CloseInput; (* closes input file; returns input to the terminal *) PROCEDURE CloseOutput; (* closes output file; returns output to terminal*) PROCEDURE Read (VAR ch:CHAR); (* Done := NOT in.eof *) (* if EOF then ch = 0C *) PROCEDURE ReadString (VAR s:ARRAY OF CHAR); (*read string, i.e. sequence of characters not containing blanks nor control characters; leading blanks are ignored. Input is terminated by any character <= " "; this character is assigned to termCH. DEL is used for backspacing when input from terminal*) (* I will make this a backspace for the Mac BC *) PROCEDURE ReadInt (VAR x:INTEGER); (* read strings and convert to integer. Syntax: integer = ["+"|"-"]digit{digit}. leading blanks are ignored. Done := "integer was read" *) PROCEDURE ReadCard (VAR x:CARDINAL); (*read string and convert to cardinal. Syntax: cardinal = digit {digit} Leading blanks are ignored. Done := "cardinal was read"*) PROCEDURE Write (ch:CHAR); PROCEDURE WriteLn; (*terminate line*) PROCEDURE WriteString (VAR s:ARRAY OF CHAR); PROCEDURE WriteInt (x: INTEGER; n: CARDINAL); (*write integer x with (at least) n characters on file "out". If n is greater than the number of digits needed, blanks are added preceding the number*) PROCEDURE WriteCard (x,n: CARDINAL); PROCEDURE WriteOct (x: WORD; n: CARDINAL); PROCEDURE WriteHex (x: WORD; n: CARDINAL); END InOut. !Funky!Stuff! echo x - MacSYSTEM.DEF cat >MacSYSTEM.DEF <<'!Funky!Stuff!' DEFINITION MODULE MacSYSTEM; FROM SYSTEM IMPORT WORD,ADDRESS; EXPORT QUALIFIED LONGINT,LONGCARD,DOUBLE,EXTENDED,COMP,BYTE, Fixed,Int64Bit,Ptr,Handle,Str255,StringPtr,StringHandle,OSErr,noErr; CONST noErr = 0; TYPE LONGINT = ADDRESS; LONGCARD = ADDRESS; DOUBLE = RECORD Long1:LONGCARD; Long2:LONGCARD; END; EXTENDED = ARRAY [0..4] OF CARDINAL; COMP = DOUBLE; BYTE = CHAR; Fixed = LONGINT; Int64Bit = RECORD hiLong: LONGINT; loLong: LONGINT; END; Ptr = ADDRESS; Handle = POINTER TO Ptr; Str255 = ARRAY [0..255] OF CHAR; StringPtr = POINTER TO Str255; StringHandle = POINTER TO StringPtr; OSErr = INTEGER; END MacSYSTEM. !Funky!Stuff! echo x - MathLib0.DEF cat >MathLib0.DEF <<'!Funky!Stuff!' DEFINITION MODULE MathLib0; (*Mathematical library 0 *) EXPORT QUALIFIED sqrt, sin, cos, arctan, exp, ln, real, entier; PROCEDURE sqrt (x: REAL) : REAL; PROCEDURE sin (x: REAL) : REAL; PROCEDURE cos (x: REAL) : REAL; PROCEDURE arctan (x: REAL) : REAL; PROCEDURE exp (x: REAL) : REAL; PROCEDURE ln (x: REAL) : REAL; PROCEDURE entier (x: REAL) : INTEGER; PROCEDURE real (x: INTEGER) : REAL; END MathLib0. !Funky!Stuff! echo x - MathLib1.DEF cat >MathLib1.DEF <<'!Funky!Stuff!' DEFINITION MODULE MathLib1; (* Math. library 1 *) (* additional mathematical functions*) (* M. Schneider 4. Juli 1983 *) EXPORT QUALIFIED exp2, log2, tan, random, setrandom, PI; PROCEDURE exp2 ( x: REAL ): REAL; PROCEDURE log2 ( x: REAL ): REAL; PROCEDURE tan ( x: REAL ): REAL; PROCEDURE random(): REAL; (* range: 0.0 <= random < 1.0 *) PROCEDURE setrandom( x0: REAL ); PROCEDURE PI(): REAL; END MathLib1. !Funky!Stuff!