X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=contrib%2Fsb-grovel%2Fdef-to-lisp.lisp;h=b39ff5e2bd7cbc64154e6fc518dbb9b6c837d2e7;hb=0c26b29ea29678579b1e6520db5d49a68d87a236;hp=a929fd029222dc10649f444297b243b317b9f724;hpb=ecae2f9323086c64d026d4ce719590907f486c63;p=sbcl.git diff --git a/contrib/sb-grovel/def-to-lisp.lisp b/contrib/sb-grovel/def-to-lisp.lisp index a929fd0..b39ff5e 100644 --- a/contrib/sb-grovel/def-to-lisp.lisp +++ b/contrib/sb-grovel/def-to-lisp.lisp @@ -37,6 +37,19 @@ code: (c-escape formatter) args))) +(defun c-for-enum (lispname elements export) + (printf "(cl:eval-when (:compile-toplevel :load-toplevel :execute) (sb-alien:define-alien-type ~A (sb-alien:enum nil" lispname) + (dolist (element elements) + (destructuring-bind (lisp-element-name c-element-name) element + (printf " (~S %d)" lisp-element-name c-element-name))) + (printf ")))") + (when export + (dolist (element elements) + (destructuring-bind (lisp-element-name c-element-name) element + (declare (ignore c-element-name)) + (unless (keywordp lisp-element-name) + (printf "(export '~S)" lisp-element-name)))))) + (defun c-for-structure (lispname cstruct) (destructuring-bind (cname &rest elements) cstruct (printf "(cl:eval-when (:compile-toplevel :load-toplevel :execute) (sb-grovel::define-c-struct ~A %d" lispname @@ -87,6 +100,8 @@ code: (as-c "#else") (printf "(sb-int:style-warn \"Couldn't grovel for ~A (unknown to the C compiler).\")" cname) (as-c "#endif")) + (:enum + (c-for-enum lispname cname export)) (:type (printf "(cl:eval-when (:compile-toplevel :load-toplevel :execute) (sb-alien:define-alien-type ~A (sb-alien:%ssigned %d)))" lispname (format nil "SIGNED_(~A)" cname) @@ -100,7 +115,6 @@ code: (printf "(sb-grovel::define-foreign-routine (\"~A\" ~A)" f-cname lispname) (printf "~{ ~W~^\\n~})" definition))) (:structure - ;; FIXME: structure slots should be auto-exportable as well. (c-for-structure lispname cname)) (otherwise ;; should we really not sprechen espagnol, monsieurs?