From: Christophe R. <cr...@us...> - 2004-12-09 16:16:14
|
Update of /cvsroot/sbcl/sbcl/contrib/sb-grovel In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26804/contrib/sb-grovel Modified Files: def-to-lisp.lisp sb-grovel.texinfo Log Message: 0.8.17.27: Improve ENUM support a little. (VJA sbcl-devel 2004-12-09) ... SB-ALIEN enums not limited to symbols any more; ... SB-GROVEL enum grovelation; ... tests (which pass despite the current, erm, suboptimality of arithmetic :) Index: def-to-lisp.lisp =================================================================== RCS file: /cvsroot/sbcl/sbcl/contrib/sb-grovel/def-to-lisp.lisp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- def-to-lisp.lisp 22 Jul 2004 07:46:32 -0000 1.15 +++ def-to-lisp.lisp 9 Dec 2004 16:15:59 -0000 1.16 @@ -37,6 +37,19 @@ (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 @@ (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) Index: sb-grovel.texinfo =================================================================== RCS file: /cvsroot/sbcl/sbcl/contrib/sb-grovel/sb-grovel.texinfo,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- sb-grovel.texinfo 17 Aug 2004 22:55:57 -0000 1.3 +++ sb-grovel.texinfo 9 Dec 2004 16:15:59 -0000 1.4 @@ -112,6 +112,16 @@ other forms are possible. @item +@code{:enum} +@lisp + (:enum lisp-type-name ((lisp-enumerated-name c-enumerated-name) ...))) +@end lisp + +An @code{sb-alien:enum} type with name @code{lisp-type-name} will be defined. +The symbols are the @code{lisp-enumerated-name}s, and the values +are grovelled from the @code{c-enumerated-name}s. + +@item @code{:structure} - alien structure definitions look like this: @lisp (:structure lisp-struct-name ("struct c_structure" |