02855f8dfe4562fd4dd69a92f8f5ec3005b88c54
[sbcl.git] / contrib / sb-posix / macros.lisp
1 (in-package :sb-posix)
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   (let ((root (if (eql #\_ (char s 0)) (subseq s 1) s)))
22     (intern (substitute #\- #\_ (string-upcase root)) :sb-posix)))
23
24 (defmacro define-call-internally (lisp-name c-name return-type error-predicate
25                                   &rest arguments)
26   (if (sb-sys:find-foreign-symbol-address c-name)
27       `(progn
28         (declaim (inline ,lisp-name))
29         (defun ,lisp-name ,(mapcar #'car arguments)
30           (let ((r (alien-funcall
31                     (extern-alien
32                      ,c-name
33                      (function ,return-type
34                                ,@(mapcar
35                                   (lambda (x)
36                                     (gethash (cadr x)
37                                              *designator-types*
38                                              (cadr x)))
39                                   arguments)))
40                     ,@(mapcar (lambda (x)
41                                 (if (nth-value 1
42                                                (gethash (cadr x)
43                                                         *designator-types*))
44                                     `(,(intern (symbol-name (cadr x))
45                                                :sb-posix)
46                                       ,(car x))
47                                     (car x)))
48                               arguments))))
49             (if (,error-predicate r) (syscall-error) r))))
50       `(sb-int:style-warn "Didn't find definition for ~S" ,c-name)))
51
52 (defmacro define-call (name return-type error-predicate &rest arguments)
53   (let ((lisp-name (lisp-for-c-symbol name)))
54     `(progn
55        (export ',lisp-name :sb-posix)
56        (define-call-internally ,lisp-name
57            ,name
58          ,return-type
59          ,error-predicate
60          ,@arguments))))
61
62 (defmacro define-entry-point (name arglist &body body)
63   (let ((lisp-name (lisp-for-c-symbol name)))
64     `(progn
65       (export ',lisp-name :sb-posix)
66       (declaim (inline ,lisp-name))
67       (defun ,lisp-name ,arglist
68         ,@body))))