home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 November / macformat-018.iso / Utility Spectacular / Text / Emacs-1.12d folder / lisp / mac / traps.el < prev   
Encoding:
Text File  |  1993-12-26  |  17.0 KB  |  596 lines  |  [TEXT/EMAC]

  1. ;;;
  2. ;;; This file is part of a Macintosh port of GNU Emacs.
  3. ;;; Copyright (C) 1993 Marc Parmet.  All rights reserved.
  4. ;;;
  5. ;;; This is the Toolbox trap glue.
  6. ;;;
  7.  
  8. (defun gencode (words offset code)
  9.   (if (null words)
  10.       nil
  11.     (cons
  12.      (list 'ae-encode code offset 'typeShortInteger (car words))
  13.      (gencode (cdr words) (+ sizeof-short offset) code))))
  14.  
  15. (defun munge-parameters (parameters)
  16.   (if (null parameters)
  17.       (list 0 nil nil nil)
  18.     (let* ((parameter (car parameters))
  19.            (name (nth 0 parameter))
  20.            (size (nth 1 parameter))
  21.            (register (nth 2 parameter))
  22.            (cdr-munge (munge-parameters (cdr parameters)))
  23.            (offset (nth 0 cdr-munge))
  24.            (cdr-stack (nth 1 cdr-munge))
  25.            (cdr-registers (nth 2 cdr-munge))
  26.            (cdr-names (nth 3 cdr-munge))
  27.            (target (if (eq size 'address)
  28.                        (` (let ((temp (, name)))
  29.                             (if (stringp temp) (string-data temp) temp)))
  30.                      name))
  31.            (typeparams (cdr (assoc size '((char 2 typeBoolean)
  32.                                           (short 2 typeShortInteger)
  33.                                           (long 4 typeLongInteger)
  34.                                           (address 4 typeLongInteger)
  35.                                           (immediate-string 4 "string")))))
  36.            (offset-incr (nth 0 typeparams))
  37.            (type-code (nth 1 typeparams)))
  38.       (if register
  39.           (list
  40.            offset
  41.            cdr-stack
  42.            (` ((list (quote (, register)) (, target)) (,@ cdr-registers)))
  43.            (cons name cdr-names))
  44.         (list
  45.          (+ offset offset-incr)
  46.          (cons (` (ae-encode stack (, offset) (, type-code) (, target))) cdr-stack)
  47.          cdr-registers
  48.          (cons name cdr-names))))))
  49.            
  50. (defmacro deftrap (name code parameters return)
  51.   (let* ((code-retrieve (cond
  52.                          ((null return) nil)
  53.                          ((consp return) nil)
  54.                          ((eq return 'char) '("101f"))    ; move.b (a7)+,d0
  55.                          ((eq return 'short) '("301f"))   ; move.w (a7)+,d0
  56.                          ((eq return 'long) '("201f"))))  ; move.l (a7)+,d0
  57.          (code-rts (append code code-retrieve '("4e75"))) ; rts
  58.          (code-size (* 2 (length code-rts)))
  59.          (stack-result-size (cond ((null return) 0)
  60.                                   ((consp return) 0)
  61.                                   ((eq return 'char) 2)
  62.                                   ((eq return 'short) 2)
  63.                                   ((eq return 'long) 4)))
  64.          (munge-list (munge-parameters parameters))
  65.          (register-list (cons 'list (nth 2 munge-list)))
  66.          (stack-size (+ stack-result-size (nth 0 munge-list)))
  67.          (parameter-list (nth 3 munge-list))
  68.          (return-directive (cond ((null return) nil)
  69.                                  ((consp return) (list 'quote return))
  70.                                  ((eq return 'char) ''(char d0))
  71.                                  ((eq return 'short) ''(short d0))
  72.                                  ((eq return 'long) ''(long d0))))
  73.          (code-name (intern (concat (symbol-name name) "-code"))))
  74.     (` (progn
  75.          (message (concat "Defining trap " (, (symbol-name name)) "..."))
  76.          (defconst (, code-name) (make-string (, code-size) 0))
  77.          (,@ (gencode code-rts 0 code-name))
  78.          (defun (, name) (, parameter-list)
  79.            (let ((stack (make-string (, stack-size) 0)))
  80.              (,@ (nth 1 munge-list))
  81.              (execute stack (, code-name) (, register-list) (, return-directive))))))))
  82.  
  83. (deftrap DebugStr-internal ("abff")
  84.   ((s address))
  85.   nil)
  86.  
  87. (defun DebugStr (s)
  88.   (DebugStr-internal (CtoPstr s)))
  89.  
  90. ;pascal OSErr
  91. ;AEDisposeDesc( AEDesc *theAEDesc )
  92. ;    = {0x303C,0x0204,0xA816};
  93. (deftrap AEDisposeDesc ("303c" "0204" "a816")
  94.   ((theAEDesc address))
  95.   short)
  96.  
  97. ;pascal OSErr
  98. ;AESend( const AppleEvent *theAppleEvent, AppleEvent *reply,
  99. ;        AESendMode sendMode, AESendPriority sendPriority, long timeOutInTicks,
  100. ;        IdleProcPtr idleProc, EventFilterProcPtr filterProc )
  101. ;    = {0x303C,0x0D17,0xA816};
  102. (deftrap AESend ("303c" "0d17" "a816")
  103.   ((theAppleEvent address)
  104.    (reply address)
  105.    (sendMode long)
  106.    (sendPriority short)
  107.    (timeOutInTicks long)
  108.    (idleProc long)
  109.    (filterProc long))
  110.   short)
  111.  
  112. ;pascal OSErr
  113. ;AECountItems( const AEDescList *theAEDescList, long *theCount )
  114. ;    = {0x303C,0x0407,0xA816}; 
  115. (deftrap AECountItems ("303c" "0407" "a816")
  116.   ((theAEDescList address)
  117.    (theCount address))
  118.   short)
  119.  
  120. ;pascal OSErr
  121. ;AESizeOfNthItem( const AEDescList *theAEDescList, long index,
  122. ;                 DescType *typeCode, Size *dataSize )
  123. ;    = {0x303C,0x082A,0xA816};
  124. (deftrap AESizeOfNthItem ("303c" "082a" "a816")
  125.   ((theAEDescList address)
  126.    (index long)
  127.    (typeCode address)
  128.    (dataSize address))
  129.   short)
  130.  
  131. ;pascal OSErr
  132. ;AESizeOfParam( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
  133. ;               DescType *typeCode, Size *dataSize )
  134. ;    = {0x303C,0x0829,0xA816};
  135. (deftrap AESizeOfParam ("303c" "0829" "a816")
  136.   ((theAppleEvent address)
  137.    (theAEKeyword immediate-string)
  138.    (typeCode address)
  139.    (dataSize address))
  140.   short)
  141.  
  142. ; pascal OSErr
  143. ; AEPutParamPtr( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
  144. ;               DescType typeCode, const void* dataPtr, Size dataSize )
  145. ;    = {0x303C,0x0A0F,0xA816};
  146. (deftrap AEPutParamPtr ("303c" "0a0f" "a816")
  147.   ((theAppleEvent address)
  148.    (theAEKeyword immediate-string)
  149.    (typeCode immediate-string)
  150.    (dataPtr address)
  151.    (dataSize long))
  152.   short)
  153.  
  154. ; pascal OSErr
  155. ; AEPutParamDesc( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
  156. ;                const AEDesc *theAEDesc )
  157. ;    = {0x303C,0x0610,0xA816};
  158. (deftrap AEPutParamDesc ("303c" "0610" "a816")
  159.   ((theAppleEvent address)
  160.    (theAEKeyword immediate-string)
  161.    (theAEDesc address))
  162.   short)
  163.  
  164. ; pascal OSErr
  165. ; AEPutPtr( const AEDescList *theAEDescList, long index, DescType typeCode,
  166. ;          const void* dataPtr, Size dataSize )
  167. ;    = {0x303C,0x0A08,0xA816};
  168. (deftrap AEPutPtr ("303c" "0a08" "a816")
  169.   ((theAEDescList address)
  170.    (index long)
  171.    (typeCode immediate-string)
  172.    (dataPtr address)
  173.    (dataSize long))
  174.   short)
  175.  
  176. ; pascal OSErr
  177. ; AEInstallEventHandler( AEEventClass theAEEventClass, AEEventID theAEEventID,
  178. ;                       EventHandlerProcPtr handler, long handlerRefcon,
  179. ;                       Boolean isSysHandler )
  180. ;    = {0x303C,0x091F,0xA816};
  181. (deftrap AEInstallEventHandler-internal ("303c" "091f" "a816")
  182.   ((theAEEventClass immediate-string)
  183.    (theAEEventID immediate-string)
  184.    (handler address)
  185.    (handlerRefCon address)
  186.    (isSysHandler short))
  187.   short)
  188.  
  189. ;;; This list is really only used now to protect the cons cells stored in the
  190. ;;; refCon slots of the dispatch table from being garbage collected, and for
  191. ;;; documentation.
  192. (defvar ae-callback-list nil "The list of Apple event handlers")
  193.  
  194. ;;; This is called from C when receiving an Apple event registered from elisp.
  195. (defun ae-receive (event reply refCon)
  196.   (funcall (car refCon) event reply (cdr refCon)))
  197.  
  198. (defun AEInstallEventHandler (class type callback handlerRefCon isSysHandler)
  199.   (let* ((callback-cons (cons callback handlerRefCon))
  200.          (err (AEInstallEventHandler-internal class type ae-receive
  201.                                               callback-cons isSysHandler)))
  202.     (if (not (zerop err))
  203.         err
  204.       (setq ae-callback-list (cons (list class type callback-cons) ae-callback-list))
  205.       noErr)))
  206.  
  207. ; pascal OSErr
  208. ; AEGetParamPtr( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
  209. ;               DescType desiredType, DescType *typeCode, void* dataPtr,
  210. ;               Size maximumSize, Size *actualSize )
  211. ;    = {0x303C,0x0E11,0xA816};
  212. (deftrap AEGetParamPtr ("303c" "0e11" "a816")
  213.   ((theAppleEvent address)
  214.    (theAEKeyword immediate-string)
  215.    (desiredType immediate-string)
  216.    (typeCode address)
  217.    (dataPtr address)
  218.    (maximumSize long)
  219.    (actualSize address))
  220.   short)
  221.  
  222. ; pascal OSErr
  223. ; AEGetAttributePtr( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
  224. ;                   DescType desiredType, DescType *typeCode, void* dataPtr,
  225. ;                   Size maximumSize, Size *actualSize )
  226. ;    = {0x303C,0x0E15,0xA816};
  227. (deftrap AEGetAttributePtr ("303c" "0e15" "a816")
  228.   ((theAppleEvent address)
  229.    (theAEKeyword immediate-string)
  230.    (desiredType immediate-string)
  231.    (typeCode address)
  232.    (dataPtr address)
  233.    (maximumSize long)
  234.    (actualSize address))
  235.   short)
  236.  
  237. ; pascal OSErr
  238. ; AEGetNthPtr( const AEDescList *theAEDescList, long index, DescType desiredType,
  239. ;             AEKeyword *theAEKeyword, DescType *typeCode, void* dataPtr,
  240. ;             Size maximumSize, Size *actualSize )
  241. ;    = {0x303C,0x100A,0xA816}; 
  242.  
  243. (deftrap AEGetNthPtr ("303c" "100a" "a816")
  244.   ((theAEDescList address)
  245.    (index long)
  246.    (desiredType immediate-string)
  247.    (theAEKeyword address)
  248.    (typeCode address)
  249.    (dataPtr address)
  250.    (maximumSize long)
  251.    (actualSize address))
  252.   short)
  253.  
  254. ; pascal OSErr
  255. ; AEGetParamDesc( const AppleEvent *theAppleEvent, AEKeyword theAEKeyword,
  256. ;                DescType desiredType, AEDesc *result )
  257. ;    = {0x303C,0x0812,0xA816};
  258. (deftrap AEGetParamDesc ("303c" "0812" "a816")
  259.   ((theAppleEvent address)
  260.    (theAEKeyword immediate-string)
  261.    (desiredType immediate-string)
  262.    (result address))
  263.   short)
  264.  
  265. ; pascal OSErr
  266. ; AECreateList( const void* factoringPtr, Size factoredSize, Boolean isRecord,
  267. ;              AEDescList *resultList )
  268. ;    = {0x303C,0x0706,0xA816}; 
  269. (deftrap AECreateList ("303c" "0706" "a816")
  270.   ((factoringPtr address)
  271.    (factoredSize long)
  272.    (isRecord char)
  273.    (resultList address))
  274.   short)
  275.  
  276. ; pascal OSErr
  277. ; AECreateDesc( DescType typeCode, const void* dataPtr, Size dataSize, AEDesc *result )
  278. ;    = {0x303C,0x0825,0xA816};
  279. (deftrap AECreateDesc ("303c" "0825" "a816")
  280.   ((typeCode immediate-string)
  281.    (dataPtr address)
  282.    (dataSize long)
  283.    (result address))
  284.   short)
  285.  
  286. ; pascal OSErr
  287. ; AECreateAppleEvent( AEEventClass theAEEventClass, AEEventID theAEEventID,
  288. ;                    const AEAddressDesc *target, short returnID,
  289. ;                    long transactionID, AppleEvent *result )
  290. ;    = {0x303C,0x0B14,0xA816};
  291. (deftrap AECreateAppleEvent ("303c" "0b14" "a816")
  292.   ((theAEEventClass immediate-string)
  293.    (theAEEventID immediate-string)
  294.    (target address)
  295.    (returnID short)
  296.    (transactionID long)
  297.    (result address))
  298.   short)
  299.  
  300. ;pascal OSErr NewAlias(const FSSpec *fromFile,
  301. ;                      const FSSpec *target,
  302. ;                      AliasHandle *alias)
  303. ;    = {0x7002,0xA823}; 
  304. (deftrap NewAlias ("7002" "a823")
  305.   ((fromFile address)
  306.    (toFile address)
  307.    (alias address))
  308.   short)
  309.  
  310. ;pascal OSErr NewAliasMinimal(const FSSpec *target,
  311. ;                             AliasHandle *alias)
  312. ;    = {0x7008,0xA823}; 
  313. (deftrap NewAliasMinimal ("7008" "a823")
  314.   ((target address)
  315.    (alias address))
  316.   short)
  317.  
  318. ;pascal OSErr NewAliasMinimalFromFullPath(short fullPathLength,
  319. ;                                         const unsigned char *fullPath,
  320. ;                                         ConstStr32Param zoneName,
  321. ;                                         ConstStr31Param serverName,
  322. ;                                         AliasHandle *alias)
  323. ;    = {0x7009,0xA823}; 
  324. (deftrap NewAliasMinimalFromFullPath ("7009" "a823")
  325.   ((fullPathLength short)
  326.    (fullPath address)
  327.    (zoneName address)
  328.    (serverName address)
  329.    (alias address))
  330.   short)
  331.  
  332. ;pascal long ZeroScrap(void)
  333. ;    = 0xA9FC; 
  334. (deftrap ZeroScrap ("a9fc")
  335.   ()
  336.   long)
  337.  
  338. ;pascal long PutScrap(long length,ResType theType,Ptr source)
  339. ;    = 0xA9FE; 
  340. (deftrap PutScrap ("a9fe")
  341.   ((length long)
  342.    (theType immediate-string)
  343.    (source address))
  344.   long)
  345.  
  346. ;pascal long GetScrap(Handle hDest,ResType theType,long *offset)
  347. ;    = 0xA9FD; 
  348. (deftrap GetScrap ("a9fd")
  349.   ((hDest long)
  350.    (theType immediate-string)
  351.    (offset address))
  352.   long)
  353.  
  354. ; pascal PScrapStuff InfoScrap(void)
  355. ;    = 0xA9F9; 
  356. (deftrap InfoScrap ("a9f9")
  357.   nil
  358.   long)
  359.  
  360. ;#pragma parameter __A0 NewPtr(__D0)
  361. ;pascal Ptr NewPtr(Size byteCount)
  362. ;    = 0xA11E; 
  363. (deftrap NewPtr ("a11e")
  364.   ((byteCount long d0))
  365.   (long a0))
  366.  
  367. ;#pragma parameter __A0 NewHandle(__D0)
  368. ;pascal Handle NewHandle(Size byteCount)
  369. ;    = 0xA122; 
  370. (deftrap NewHandle ("a122")
  371.   ((byteCount long d0))
  372.   (long a0))
  373.  
  374. ;#pragma parameter DisposPtr(__A0)
  375. ;pascal void DisposPtr(Ptr p)
  376. ;    = 0xA01F; 
  377. (deftrap DisposPtr ("a01f")
  378.   ((p long a0))
  379.   nil)
  380.  
  381. ;#pragma parameter DisposHandle(__A0)
  382. ;pascal void DisposHandle(Handle h)
  383. ;    = 0xA023; 
  384. (deftrap DisposHandle ("a023")
  385.   ((h long a0))
  386.   nil)
  387.  
  388. ;#pragma parameter HLock(__A0)
  389. ;pascal void HLock(Handle h)
  390. ;    = 0xA029; 
  391. (deftrap HLock ("a029")
  392.   ((h long a0))
  393.   nil)
  394.  
  395. ; #pragma parameter HUnlock(__A0)
  396. ; pascal void HUnlock(Handle h)
  397. ;    = 0xA02A; 
  398. (deftrap HUnlock ("a02a")
  399.   ((h long a0))
  400.   nil)
  401.  
  402. ; In Memory.h, this has no pragma directive, so there must be
  403. ; glue for this in MacTraps.  I don't know why.
  404. ; pascal Size GetHandleSize(Handle h); 
  405. (deftrap GetHandleSize ("a025")
  406.   ((h long a0))
  407.   (long d0))
  408.  
  409. ; #pragma parameter SetHandleSize(__A0,__D0)
  410. ; pascal void SetHandleSize(Handle h,Size newSize)
  411. ;    = 0xA024; 
  412. (deftrap SetHandleSize ("a024")
  413.   ((h long a0)
  414.    (newSize long d0))
  415.   nil)
  416.  
  417. (deftrap MemError ("3038" "0220") ; move.w 0x220,d0
  418.   nil
  419.   (short d0))
  420.  
  421. ;#pragma parameter BlockMove(__A0,__A1,__D0)
  422. ;pascal void BlockMove(const void *srcPtr,void *destPtr,Size byteCount)
  423. ;    = 0xA02E; 
  424. (deftrap BlockMove ("a02e")
  425.   ((srcPtr address a0)
  426.    (destPtr address a1)
  427.    (byteCount long d0))
  428.   nil)
  429.  
  430. ; #pragma parameter GetDateTime(__A0)
  431. ; pascal void GetDateTime(unsigned long *secs)
  432. ;    = {0x20B8,0x020C}; 
  433. (deftrap GetDateTime-internal ("20b8" "020c")
  434.   ((now address a0))
  435.   nil)
  436.  
  437. (defmacro GetDateTime (now)
  438.   (` (let ((s (make-string 4 0)))
  439.        (GetDateTime-internal s)
  440.        (setq (, now) (extract-internal s 0 4 nil)))))
  441.  
  442. ; pascal void CheckItem(MenuHandle theMenu,short item,Boolean checked)
  443. ;    = 0xA945; 
  444. (deftrap CheckItem ("a945")
  445.   ((theMenu long)
  446.    (item short)
  447.    (check char))
  448.   nil)
  449.  
  450. ; pascal MenuHandle NewMenu(short menuID,const Str255 menuTitle)
  451. ;    = 0xA931; 
  452. (deftrap NewMenu-internal ("a931")
  453.   ((menuID short)
  454.    (menuTitle address))
  455.   long)
  456.  
  457. (defun NewMenu (menuID menuTitle)
  458.   (NewMenu-internal menuID (CtoPstr menuTitle)))
  459.  
  460. (defun MenuList ()
  461.   (extract-internal 2588 0 4 nil))
  462.  
  463. ; pascal void InsertMenu(MenuHandle theMenu,short beforeID)
  464. ;    = 0xA935; 
  465. (deftrap InsertMenu-internal ("a935")
  466.   ((theMenu long)
  467.    (beforeID short))
  468.   nil)
  469.  
  470. (defun id-of-first-menu ()
  471.   (extract-internal (deref (deref (+ (deref (MenuList)) 6))) 0 2 nil))
  472.  
  473. (defun InsertMenu (theMenu beforeID)
  474.   (if (numberp beforeID)
  475.       (InsertMenu-internal theMenu beforeID)
  476.     (let ((n (/ (extract-internal (deref (MenuList)) 0 2 nil) 6)))
  477.       (InsertMenu-internal theMenu (if (zerop n) 0 (id-of-first-menu))))))
  478.  
  479. ; pascal MenuHandle GetMHandle(short menuID)
  480. ;    = 0xA949; 
  481. (deftrap GetMHandle ("a949")
  482.   ((menuID short))
  483.   long)
  484.  
  485. ; pascal void AppendMenu(MenuHandle menu,ConstStr255Param data)
  486. ;    = 0xA933; 
  487. (deftrap AppendMenu-internal ("a933")
  488.   ((menu long)
  489.    (data address))
  490.   nil)
  491.  
  492. (defvar mac-menu-callback-list nil)
  493.  
  494. (defun AppendMenu (menu data callback)
  495.   (AppendMenu-internal menu (CtoPstr data))
  496.   (setq mac-menu-callback-list (cons (cons (cons menu (CountMItems menu)) callback)
  497.                                      mac-menu-callback-list)))
  498.  
  499. ; pascal short CountMItems(MenuHandle theMenu)
  500. ;    = 0xA950; 
  501. (deftrap CountMItems ("a950")
  502.   ((theMenu long))
  503.   short)
  504.  
  505. ; pascal void SetItemMark(MenuHandle theMenu,short item,short markChar)
  506. ;    = 0xA944; 
  507. (deftrap SetItemMark ("a944")
  508.   ((theMenu long)
  509.    (item short)
  510.    (markChar short))
  511.   nil)
  512.  
  513. ; pascal void GetItem(MenuHandle theMenu,short item,Str255 itemString)
  514. ;    = 0xA946; 
  515. (deftrap GetItem ("a946")
  516.   ((theMenu long)
  517.    (item short)
  518.    (itemString address))
  519.   nil)
  520.  
  521. ; pascal void AddResMenu(MenuHandle theMenu,ResType theType)
  522. ;    = 0xA94D; 
  523. (deftrap AddResMenu ("a94d")
  524.   ((theMenu long)
  525.    (theType immediate-string))
  526.   nil)
  527.  
  528. ; pascal void DrawMenuBar(void)
  529. ;    = 0xA937; 
  530. (deftrap DrawMenuBar ("a937")
  531.   nil
  532.   nil)
  533.  
  534. ; pascal short OpenDeskAcc(ConstStr255Param deskAccName)
  535. ;    = 0xA9B6; 
  536. (deftrap OpenDeskAcc-internal ("a9b6")
  537.   ((deskAccName address))
  538.   short)
  539.  
  540. (defun OpenDeskAcc (deskAccName)
  541.   (OpenDeskAcc-internal (CtoPstr deskAccName)))
  542.  
  543. ; pascal void StandardPutFile(ConstStr255Param prompt,
  544. ;                            ConstStr255Param defaultName,
  545. ;                            StandardFileReply *reply)
  546. ;    = {0x3F3C,0x0005,0xA9EA}; 
  547. (deftrap StandardPutFile ("3f3c" "0005" "a9ea")
  548.   ((prompt address)
  549.    (defaultName address)
  550.    (reply address))
  551.   nil)
  552.  
  553. ; pascal OSErr FSpGetFInfo(const FSSpec *spec,FInfo *fndrInfo)
  554. ;  = {0x303C,0x0007,0xAA52}; 
  555. (deftrap FSpGetFInfo ("303c" "0007" "aa52")
  556.   ((spec address)
  557.    (fndrInfo address))
  558.   short)
  559.  
  560. (defconst sizeof-StandardFileReply 88)
  561. (defun StandardFileReply-sfGood (s) (extract-internal s 0 1 nil))
  562. (defun StandardFileReply-sfFile (s) (ae-extract "string" s 6 sizeof-FSSpec))
  563. (defconst sizeof-SFTypeList 16)
  564.  
  565. (defun PutFile (prompt defaultName)
  566.   (let ((reply (make-string sizeof-StandardFileReply 0)))
  567.     (StandardPutFile (CtoPstr prompt) (CtoPstr defaultName) reply)
  568.     (if (zerop (StandardFileReply-sfGood reply))
  569.         nil
  570.       (FSSpec-to-unix-filename (StandardFileReply-sfFile reply)))))
  571.  
  572. ; pascal void StandardGetFile(FileFilterProcPtr fileFilter,
  573. ;                            short numTypes,
  574. ;                            SFTypeList typeList,
  575. ;                            StandardFileReply *reply)
  576. ;    = {0x3F3C,0x0006,0xA9EA}; 
  577. (deftrap StandardGetFile ("3f3c" "0006" "a9ea")
  578.   ((fileFilter address)
  579.    (numTypes short)
  580.    (typeList address)
  581.    (reply address))
  582.   nil)
  583.  
  584. (defun GetFile ()
  585.   (let ((typeList (make-string sizeof-SFTypeList 0))
  586.         (reply (make-string sizeof-StandardFileReply 0)))
  587.     (ae-encode typeList 0 "string" "TEXT")
  588.     (StandardGetFile 0 1 typeList reply)
  589.     (if (zerop (StandardFileReply-sfGood reply))
  590.         nil
  591.       (FSSpec-to-unix-filename (StandardFileReply-sfFile reply)))))
  592.  
  593. ;;; Just for fun
  594. (deftrap MoveTo ("A893") ((h short) (v short)) nil)
  595. (deftrap LineTo ("A891") ((h short) (v short)) nil)
  596.