home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-12-26 | 17.0 KB | 596 lines | [TEXT/EMAC] |
- ;;;
- ;;; This file is part of a Macintosh port of GNU Emacs.
- ;;; Copyright (C) 1993 Marc Parmet. All rights reserved.
- ;;;
- ;;; This is the Toolbox trap glue.
- ;;;
-
- (defun gencode (words offset code)
- (if (null words)
- nil
- (cons
- (list 'ae-encode code offset 'typeShortInteger (car words))
- (gencode (cdr words) (+ sizeof-short offset) code))))
-
- (defun munge-parameters (parameters)
- (if (null parameters)
- (list 0 nil nil nil)
- (let* ((parameter (car parameters))
- (name (nth 0 parameter))
- (size (nth 1 parameter))
- (register (nth 2 parameter))
- (cdr-munge (munge-parameters (cdr parameters)))
- (offset (nth 0 cdr-munge))
- (cdr-stack (nth 1 cdr-munge))
- (cdr-registers (nth 2 cdr-munge))
- (cdr-names (nth 3 cdr-munge))
- (target (if (eq size 'address)
- (` (let ((temp (, name)))
- (if (stringp temp) (string-data temp) temp)))
- name))
- (typeparams (cdr (assoc size '((char 2 typeBoolean)
- (short 2 typeShortInteger)
- (long 4 typeLongInteger)
- (address 4 typeLongInteger)
- (immediate-string 4 "string")))))
- (offset-incr (nth 0 typeparams))
- (type-code (nth 1 typeparams)))
- (if register
- (list
- offset
- cdr-stack
- (` ((list (quote (, register)) (, target)) (,@ cdr-registers)))
- (cons name cdr-names))
- (list
- (+ offset offset-incr)
- (cons (` (ae-encode stack (, offset) (, type-code) (, target))) cdr-stack)
- cdr-registers
- (cons name cdr-names))))))
-
- (defmacro deftrap (name code parameters return)
- (let* ((code-retrieve (cond
- ((null return) nil)
- ((consp return) nil)
- ((eq return 'char) '("101f")) ; move.b (a7)+,d0
- ((eq return 'short) '("301f")) ; move.w (a7)+,d0
- ((eq return 'long) '("201f")))) ; move.l (a7)+,d0
- (code-rts (append code code-retrieve '("4e75"))) ; rts
- (code-size (* 2 (length code-rts)))
- (stack-result-size (cond ((null return) 0)
- ((consp return) 0)
- ((eq return 'char) 2)
- ((eq return 'short) 2)
- ((eq return 'long) 4)))
- (munge-list (munge-parameters parameters))
- (register-list (cons 'list (nth 2 munge-list)))
- (stack-size (+ stack-result-size (nth 0 munge-list)))
- (parameter-list (nth 3 munge-list))
- (return-directive (cond ((null return) nil)
- ((consp return) (list 'quote return))
- ((eq return 'char) ''(char d0))
- ((eq return 'short) ''(short d0))
- ((eq return 'long) ''(long d0))))
- (code-name (intern (concat (symbol-name name) "-code"))))
- (` (progn
- (message (concat "Defining trap " (, (symbol-name name)) "..."))
- (defconst (, code-name) (make-string (, code-size) 0))
- (,@ (gencode code-rts 0 code-name))
- (defun (, name) (, parameter-list)
- (let ((stack (make-string (, stack-size) 0)))
- (,@ (nth 1 munge-list))
- (execute stack (, code-name) (, register-list) (, return-directive))))))))
-
- (deftrap DebugStr-internal ("abff")
- ((s address))
- nil)
-
- (defun DebugStr (s)
- (DebugStr-internal (CtoPstr s)))
-
- ;pascal OSErr
- ;AEDisposeDesc( AEDesc *theAEDesc )
- ; = {0x303C,0x0204,0xA816};
- (deftrap AEDisposeDesc ("303c" "0204" "a816")
- ((theAEDesc address))
- short)
-
- ;pascal OSErr
- ;AESend( const AppleEvent *theAppleEvent, AppleEvent *reply,
- ; AESendMode sendMode, AESendPriority sendPriority, long timeOutInTicks,
- ; IdleProcPtr idleProc, EventFilterProcPtr filterProc )
- ; = {0x303C,0x0D17,0xA816};
- (deftrap AESend ("303c" "0d17" "a816")
- ((theAppleEvent address)
- (reply address)
- (sendMode long)
- (sendPriority short)
- (timeOutInTicks long)
- (idleProc long)
- (filterProc long))
- short)
-
- ;pascal OSErr
- ;AECountItems( const AEDescList *theAEDescList, long *theCount )
- ; = {0x303C,0x0407,0xA816};
- (deftrap AECountItems ("303c" "0407" "a816")
- ((theAEDescList address)
- (theCount address))
- short)
-
- ;pascal OSErr
- ;AESizeOfNthItem( const AEDescList *theAEDescList, long index,
- ; DescType *typeCode, Size *dataSize )
- ; = {0x303C,0x082A,0xA816};
- (deftrap AESizeOfNthItem ("303c" "082a" "a816")
- ((theAEDescList address)
- (index long)
- (typeCode address)
- (dataSize address))
- short)
-
- ;pascal OSErr
- ;AESizeOfParam( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
- ; DescType *typeCode, Size *dataSize )
- ; = {0x303C,0x0829,0xA816};
- (deftrap AESizeOfParam ("303c" "0829" "a816")
- ((theAppleEvent address)
- (theAEKeyword immediate-string)
- (typeCode address)
- (dataSize address))
- short)
-
- ; pascal OSErr
- ; AEPutParamPtr( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
- ; DescType typeCode, const void* dataPtr, Size dataSize )
- ; = {0x303C,0x0A0F,0xA816};
- (deftrap AEPutParamPtr ("303c" "0a0f" "a816")
- ((theAppleEvent address)
- (theAEKeyword immediate-string)
- (typeCode immediate-string)
- (dataPtr address)
- (dataSize long))
- short)
-
- ; pascal OSErr
- ; AEPutParamDesc( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
- ; const AEDesc *theAEDesc )
- ; = {0x303C,0x0610,0xA816};
- (deftrap AEPutParamDesc ("303c" "0610" "a816")
- ((theAppleEvent address)
- (theAEKeyword immediate-string)
- (theAEDesc address))
- short)
-
- ; pascal OSErr
- ; AEPutPtr( const AEDescList *theAEDescList, long index, DescType typeCode,
- ; const void* dataPtr, Size dataSize )
- ; = {0x303C,0x0A08,0xA816};
- (deftrap AEPutPtr ("303c" "0a08" "a816")
- ((theAEDescList address)
- (index long)
- (typeCode immediate-string)
- (dataPtr address)
- (dataSize long))
- short)
-
- ; pascal OSErr
- ; AEInstallEventHandler( AEEventClass theAEEventClass, AEEventID theAEEventID,
- ; EventHandlerProcPtr handler, long handlerRefcon,
- ; Boolean isSysHandler )
- ; = {0x303C,0x091F,0xA816};
- (deftrap AEInstallEventHandler-internal ("303c" "091f" "a816")
- ((theAEEventClass immediate-string)
- (theAEEventID immediate-string)
- (handler address)
- (handlerRefCon address)
- (isSysHandler short))
- short)
-
- ;;; This list is really only used now to protect the cons cells stored in the
- ;;; refCon slots of the dispatch table from being garbage collected, and for
- ;;; documentation.
- (defvar ae-callback-list nil "The list of Apple event handlers")
-
- ;;; This is called from C when receiving an Apple event registered from elisp.
- (defun ae-receive (event reply refCon)
- (funcall (car refCon) event reply (cdr refCon)))
-
- (defun AEInstallEventHandler (class type callback handlerRefCon isSysHandler)
- (let* ((callback-cons (cons callback handlerRefCon))
- (err (AEInstallEventHandler-internal class type ae-receive
- callback-cons isSysHandler)))
- (if (not (zerop err))
- err
- (setq ae-callback-list (cons (list class type callback-cons) ae-callback-list))
- noErr)))
-
- ; pascal OSErr
- ; AEGetParamPtr( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
- ; DescType desiredType, DescType *typeCode, void* dataPtr,
- ; Size maximumSize, Size *actualSize )
- ; = {0x303C,0x0E11,0xA816};
- (deftrap AEGetParamPtr ("303c" "0e11" "a816")
- ((theAppleEvent address)
- (theAEKeyword immediate-string)
- (desiredType immediate-string)
- (typeCode address)
- (dataPtr address)
- (maximumSize long)
- (actualSize address))
- short)
-
- ; pascal OSErr
- ; AEGetAttributePtr( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
- ; DescType desiredType, DescType *typeCode, void* dataPtr,
- ; Size maximumSize, Size *actualSize )
- ; = {0x303C,0x0E15,0xA816};
- (deftrap AEGetAttributePtr ("303c" "0e15" "a816")
- ((theAppleEvent address)
- (theAEKeyword immediate-string)
- (desiredType immediate-string)
- (typeCode address)
- (dataPtr address)
- (maximumSize long)
- (actualSize address))
- short)
-
- ; pascal OSErr
- ; AEGetNthPtr( const AEDescList *theAEDescList, long index, DescType desiredType,
- ; AEKeyword *theAEKeyword, DescType *typeCode, void* dataPtr,
- ; Size maximumSize, Size *actualSize )
- ; = {0x303C,0x100A,0xA816};
-
- (deftrap AEGetNthPtr ("303c" "100a" "a816")
- ((theAEDescList address)
- (index long)
- (desiredType immediate-string)
- (theAEKeyword address)
- (typeCode address)
- (dataPtr address)
- (maximumSize long)
- (actualSize address))
- short)
-
- ; pascal OSErr
- ; AEGetParamDesc( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
- ; DescType desiredType, AEDesc *result )
- ; = {0x303C,0x0812,0xA816};
- (deftrap AEGetParamDesc ("303c" "0812" "a816")
- ((theAppleEvent address)
- (theAEKeyword immediate-string)
- (desiredType immediate-string)
- (result address))
- short)
-
- ; pascal OSErr
- ; AECreateList( const void* factoringPtr, Size factoredSize, Boolean isRecord,
- ; AEDescList *resultList )
- ; = {0x303C,0x0706,0xA816};
- (deftrap AECreateList ("303c" "0706" "a816")
- ((factoringPtr address)
- (factoredSize long)
- (isRecord char)
- (resultList address))
- short)
-
- ; pascal OSErr
- ; AECreateDesc( DescType typeCode, const void* dataPtr, Size dataSize, AEDesc *result )
- ; = {0x303C,0x0825,0xA816};
- (deftrap AECreateDesc ("303c" "0825" "a816")
- ((typeCode immediate-string)
- (dataPtr address)
- (dataSize long)
- (result address))
- short)
-
- ; pascal OSErr
- ; AECreateAppleEvent( AEEventClass theAEEventClass, AEEventID theAEEventID,
- ; const AEAddressDesc *target, short returnID,
- ; long transactionID, AppleEvent *result )
- ; = {0x303C,0x0B14,0xA816};
- (deftrap AECreateAppleEvent ("303c" "0b14" "a816")
- ((theAEEventClass immediate-string)
- (theAEEventID immediate-string)
- (target address)
- (returnID short)
- (transactionID long)
- (result address))
- short)
-
- ;pascal OSErr NewAlias(const FSSpec *fromFile,
- ; const FSSpec *target,
- ; AliasHandle *alias)
- ; = {0x7002,0xA823};
- (deftrap NewAlias ("7002" "a823")
- ((fromFile address)
- (toFile address)
- (alias address))
- short)
-
- ;pascal OSErr NewAliasMinimal(const FSSpec *target,
- ; AliasHandle *alias)
- ; = {0x7008,0xA823};
- (deftrap NewAliasMinimal ("7008" "a823")
- ((target address)
- (alias address))
- short)
-
- ;pascal OSErr NewAliasMinimalFromFullPath(short fullPathLength,
- ; const unsigned char *fullPath,
- ; ConstStr32Param zoneName,
- ; ConstStr31Param serverName,
- ; AliasHandle *alias)
- ; = {0x7009,0xA823};
- (deftrap NewAliasMinimalFromFullPath ("7009" "a823")
- ((fullPathLength short)
- (fullPath address)
- (zoneName address)
- (serverName address)
- (alias address))
- short)
-
- ;pascal long ZeroScrap(void)
- ; = 0xA9FC;
- (deftrap ZeroScrap ("a9fc")
- ()
- long)
-
- ;pascal long PutScrap(long length,ResType theType,Ptr source)
- ; = 0xA9FE;
- (deftrap PutScrap ("a9fe")
- ((length long)
- (theType immediate-string)
- (source address))
- long)
-
- ;pascal long GetScrap(Handle hDest,ResType theType,long *offset)
- ; = 0xA9FD;
- (deftrap GetScrap ("a9fd")
- ((hDest long)
- (theType immediate-string)
- (offset address))
- long)
-
- ; pascal PScrapStuff InfoScrap(void)
- ; = 0xA9F9;
- (deftrap InfoScrap ("a9f9")
- nil
- long)
-
- ;#pragma parameter __A0 NewPtr(__D0)
- ;pascal Ptr NewPtr(Size byteCount)
- ; = 0xA11E;
- (deftrap NewPtr ("a11e")
- ((byteCount long d0))
- (long a0))
-
- ;#pragma parameter __A0 NewHandle(__D0)
- ;pascal Handle NewHandle(Size byteCount)
- ; = 0xA122;
- (deftrap NewHandle ("a122")
- ((byteCount long d0))
- (long a0))
-
- ;#pragma parameter DisposPtr(__A0)
- ;pascal void DisposPtr(Ptr p)
- ; = 0xA01F;
- (deftrap DisposPtr ("a01f")
- ((p long a0))
- nil)
-
- ;#pragma parameter DisposHandle(__A0)
- ;pascal void DisposHandle(Handle h)
- ; = 0xA023;
- (deftrap DisposHandle ("a023")
- ((h long a0))
- nil)
-
- ;#pragma parameter HLock(__A0)
- ;pascal void HLock(Handle h)
- ; = 0xA029;
- (deftrap HLock ("a029")
- ((h long a0))
- nil)
-
- ; #pragma parameter HUnlock(__A0)
- ; pascal void HUnlock(Handle h)
- ; = 0xA02A;
- (deftrap HUnlock ("a02a")
- ((h long a0))
- nil)
-
- ; In Memory.h, this has no pragma directive, so there must be
- ; glue for this in MacTraps. I don't know why.
- ; pascal Size GetHandleSize(Handle h);
- (deftrap GetHandleSize ("a025")
- ((h long a0))
- (long d0))
-
- ; #pragma parameter SetHandleSize(__A0,__D0)
- ; pascal void SetHandleSize(Handle h,Size newSize)
- ; = 0xA024;
- (deftrap SetHandleSize ("a024")
- ((h long a0)
- (newSize long d0))
- nil)
-
- (deftrap MemError ("3038" "0220") ; move.w 0x220,d0
- nil
- (short d0))
-
- ;#pragma parameter BlockMove(__A0,__A1,__D0)
- ;pascal void BlockMove(const void *srcPtr,void *destPtr,Size byteCount)
- ; = 0xA02E;
- (deftrap BlockMove ("a02e")
- ((srcPtr address a0)
- (destPtr address a1)
- (byteCount long d0))
- nil)
-
- ; #pragma parameter GetDateTime(__A0)
- ; pascal void GetDateTime(unsigned long *secs)
- ; = {0x20B8,0x020C};
- (deftrap GetDateTime-internal ("20b8" "020c")
- ((now address a0))
- nil)
-
- (defmacro GetDateTime (now)
- (` (let ((s (make-string 4 0)))
- (GetDateTime-internal s)
- (setq (, now) (extract-internal s 0 4 nil)))))
-
- ; pascal void CheckItem(MenuHandle theMenu,short item,Boolean checked)
- ; = 0xA945;
- (deftrap CheckItem ("a945")
- ((theMenu long)
- (item short)
- (check char))
- nil)
-
- ; pascal MenuHandle NewMenu(short menuID,const Str255 menuTitle)
- ; = 0xA931;
- (deftrap NewMenu-internal ("a931")
- ((menuID short)
- (menuTitle address))
- long)
-
- (defun NewMenu (menuID menuTitle)
- (NewMenu-internal menuID (CtoPstr menuTitle)))
-
- (defun MenuList ()
- (extract-internal 2588 0 4 nil))
-
- ; pascal void InsertMenu(MenuHandle theMenu,short beforeID)
- ; = 0xA935;
- (deftrap InsertMenu-internal ("a935")
- ((theMenu long)
- (beforeID short))
- nil)
-
- (defun id-of-first-menu ()
- (extract-internal (deref (deref (+ (deref (MenuList)) 6))) 0 2 nil))
-
- (defun InsertMenu (theMenu beforeID)
- (if (numberp beforeID)
- (InsertMenu-internal theMenu beforeID)
- (let ((n (/ (extract-internal (deref (MenuList)) 0 2 nil) 6)))
- (InsertMenu-internal theMenu (if (zerop n) 0 (id-of-first-menu))))))
-
- ; pascal MenuHandle GetMHandle(short menuID)
- ; = 0xA949;
- (deftrap GetMHandle ("a949")
- ((menuID short))
- long)
-
- ; pascal void AppendMenu(MenuHandle menu,ConstStr255Param data)
- ; = 0xA933;
- (deftrap AppendMenu-internal ("a933")
- ((menu long)
- (data address))
- nil)
-
- (defvar mac-menu-callback-list nil)
-
- (defun AppendMenu (menu data callback)
- (AppendMenu-internal menu (CtoPstr data))
- (setq mac-menu-callback-list (cons (cons (cons menu (CountMItems menu)) callback)
- mac-menu-callback-list)))
-
- ; pascal short CountMItems(MenuHandle theMenu)
- ; = 0xA950;
- (deftrap CountMItems ("a950")
- ((theMenu long))
- short)
-
- ; pascal void SetItemMark(MenuHandle theMenu,short item,short markChar)
- ; = 0xA944;
- (deftrap SetItemMark ("a944")
- ((theMenu long)
- (item short)
- (markChar short))
- nil)
-
- ; pascal void GetItem(MenuHandle theMenu,short item,Str255 itemString)
- ; = 0xA946;
- (deftrap GetItem ("a946")
- ((theMenu long)
- (item short)
- (itemString address))
- nil)
-
- ; pascal void AddResMenu(MenuHandle theMenu,ResType theType)
- ; = 0xA94D;
- (deftrap AddResMenu ("a94d")
- ((theMenu long)
- (theType immediate-string))
- nil)
-
- ; pascal void DrawMenuBar(void)
- ; = 0xA937;
- (deftrap DrawMenuBar ("a937")
- nil
- nil)
-
- ; pascal short OpenDeskAcc(ConstStr255Param deskAccName)
- ; = 0xA9B6;
- (deftrap OpenDeskAcc-internal ("a9b6")
- ((deskAccName address))
- short)
-
- (defun OpenDeskAcc (deskAccName)
- (OpenDeskAcc-internal (CtoPstr deskAccName)))
-
- ; pascal void StandardPutFile(ConstStr255Param prompt,
- ; ConstStr255Param defaultName,
- ; StandardFileReply *reply)
- ; = {0x3F3C,0x0005,0xA9EA};
- (deftrap StandardPutFile ("3f3c" "0005" "a9ea")
- ((prompt address)
- (defaultName address)
- (reply address))
- nil)
-
- ; pascal OSErr FSpGetFInfo(const FSSpec *spec,FInfo *fndrInfo)
- ; = {0x303C,0x0007,0xAA52};
- (deftrap FSpGetFInfo ("303c" "0007" "aa52")
- ((spec address)
- (fndrInfo address))
- short)
-
- (defconst sizeof-StandardFileReply 88)
- (defun StandardFileReply-sfGood (s) (extract-internal s 0 1 nil))
- (defun StandardFileReply-sfFile (s) (ae-extract "string" s 6 sizeof-FSSpec))
- (defconst sizeof-SFTypeList 16)
-
- (defun PutFile (prompt defaultName)
- (let ((reply (make-string sizeof-StandardFileReply 0)))
- (StandardPutFile (CtoPstr prompt) (CtoPstr defaultName) reply)
- (if (zerop (StandardFileReply-sfGood reply))
- nil
- (FSSpec-to-unix-filename (StandardFileReply-sfFile reply)))))
-
- ; pascal void StandardGetFile(FileFilterProcPtr fileFilter,
- ; short numTypes,
- ; SFTypeList typeList,
- ; StandardFileReply *reply)
- ; = {0x3F3C,0x0006,0xA9EA};
- (deftrap StandardGetFile ("3f3c" "0006" "a9ea")
- ((fileFilter address)
- (numTypes short)
- (typeList address)
- (reply address))
- nil)
-
- (defun GetFile ()
- (let ((typeList (make-string sizeof-SFTypeList 0))
- (reply (make-string sizeof-StandardFileReply 0)))
- (ae-encode typeList 0 "string" "TEXT")
- (StandardGetFile 0 1 typeList reply)
- (if (zerop (StandardFileReply-sfGood reply))
- nil
- (FSSpec-to-unix-filename (StandardFileReply-sfFile reply)))))
-
- ;;; Just for fun
- (deftrap MoveTo ("A893") ((h short) (v short)) nil)
- (deftrap LineTo ("A891") ((h short) (v short)) nil)
-