(in-package :sb-posix-internal)
+(defvar *designator-types* (make-hash-table :test #'equal))
+
(defmacro define-designator (name result &body conversions)
(let ((type `(quote (or ,@(mapcar #'car conversions))))
- (typename (intern (format nil "~A-~A"
- (symbol-name name)
- (symbol-name :designator))
- #.*package*)))
+ (typename (intern (format nil "~A-~A"
+ (symbol-name name)
+ (symbol-name :designator))
+ #.*package*)))
`(progn
(eval-when (:compile-toplevel :load-toplevel :execute)
- (deftype ,typename () ,type)
- (setf (get ',name 'designator-type) ',result))
+ (deftype ,typename () ,type)
+ (setf (gethash ',name *designator-types*) ',result))
(defun ,(intern (symbol-name name) :sb-posix) (,name)
- (declare (type ,typename ,name))
- (etypecase ,name
- ,@conversions)))))
-
-(define-designator filename c-string
- (pathname (namestring (translate-logical-pathname filename)))
- (string filename))
-
-(define-designator file-descriptor (integer 32)
- (sb-impl::file-stream (sb-impl::fd-stream-fd file-descriptor))
- (fixnum file-descriptor))
+ (declare (type ,typename ,name))
+ (etypecase ,name
+ ,@conversions)))))
-(define-designator sap-or-nil sb-sys:system-area-pointer
- (null (sb-sys:int-sap 0))
- (sb-sys:system-area-pointer sap-or-nil))