0.9.7.31:
[sbcl.git] / contrib / sb-posix / macros.lisp
1 (in-package :sb-posix-internal)
2
3 (define-designator filename c-string
4   (pathname
5    (sb-ext:native-namestring (translate-logical-pathname filename)))
6   (string filename))
7
8 (define-designator file-descriptor (integer 32)
9   (file-stream (sb-sys:fd-stream-fd file-descriptor))
10   (fixnum file-descriptor))
11
12 (define-designator sap-or-nil sb-sys:system-area-pointer
13   (null (sb-sys:int-sap 0))
14   (sb-sys:system-area-pointer sap-or-nil))
15
16 (define-designator alien-pointer-to-anything-or-nil (* t)
17   (null (sb-alien:sap-alien (sb-sys:int-sap 0) (* t)))
18   ((alien (* t)) alien-pointer-to-anything-or-nil))
19
20 (defun lisp-for-c-symbol (s)
21   (intern (substitute #\- #\_ (string-upcase s)) :sb-posix))
22
23 (defmacro define-call-internally (lisp-name c-name return-type error-predicate
24                                   &rest arguments)
25   (if (sb-sys:find-foreign-symbol-address c-name)
26       `(progn
27         (declaim (inline ,lisp-name))
28         (defun ,lisp-name ,(mapcar #'car arguments)
29           (let ((r (alien-funcall
30                     (extern-alien
31                      ,c-name
32                      (function ,return-type
33                                ,@(mapcar
34                                   (lambda (x)
35                                     (gethash (cadr x)
36                                              *designator-types*
37                                              (cadr x)))
38                                   arguments)))
39                     ,@(mapcar (lambda (x)
40                                 (if (nth-value 1
41                                                (gethash (cadr x)
42                                                         *designator-types*))
43                                     `(,(intern (symbol-name (cadr x))
44                                                :sb-posix)
45                                       ,(car x))
46                                     (car x)))
47                               arguments))))
48             (if (,error-predicate r) (syscall-error) r))))
49       `(sb-int:style-warn "Didn't find definition for ~S" ,c-name)))
50
51 (defmacro define-call (name return-type error-predicate &rest arguments)
52   (let ((lisp-name (lisp-for-c-symbol name)))
53     `(progn
54        (export ',lisp-name :sb-posix)
55        (define-call-internally ,lisp-name
56            ,name
57          ,return-type
58          ,error-predicate
59          ,@arguments))))
60
61 (defmacro define-entry-point (name arglist &body body)
62   (let ((lisp-name (lisp-for-c-symbol name)))
63     `(progn
64       (export ',lisp-name :sb-posix)
65       (declaim (inline ,lisp-name))
66       (defun ,lisp-name ,arglist
67         ,@body))))