0.8.0.45
[sbcl.git] / contrib / sb-posix / designator.lisp
1 (in-package :sb-posix-internal)
2 (defmacro define-designator (name result &body conversions)
3   (let ((type `(quote (or ,@(mapcar #'car conversions))))
4         (typename (intern (format nil "~A-~A"
5                                   (symbol-name name)
6                                   (symbol-name :designator))
7                           #.*package*)))
8     `(progn
9       (eval-when (:compile-toplevel :load-toplevel :execute)
10         (deftype ,typename () ,type)
11         (setf (get ',name 'designator-type) ',result))
12       (defun ,(intern (symbol-name name) :sb-posix) (,name)
13         (declare (type ,typename ,name))
14         (etypecase ,name
15           ,@conversions)))))
16
17 (define-designator filename c-string
18   (pathname  (namestring (translate-logical-pathname filename)))
19   (string filename))
20
21 (define-designator file-descriptor (integer 32)
22   (sb-impl::file-stream (sb-impl::fd-stream-fd file-descriptor))
23   (fixnum file-descriptor))
24
25 (define-designator sap-or-nil sb-sys:system-area-pointer
26   (null (sb-sys:int-sap 0))
27   (sb-sys:system-area-pointer sap-or-nil))