We could add a new construct like this for c-enums holding bitfields? (define-grovel-syntax bitfieldenum (name-and-opts &rest masks) (destructuring-bind (name &key base-type) (ensure-list name-and-opts) (c-section-header out "bitfieldenum" name) (c-export out name) (c-format out "(cffi:defbitfield (") (c-print-symbol out name t) (when base-type (c-printf out " ") (c-print-symbol out base-type t)) (c-format out ")~%") (dolist (mask masks) (destructuring-bind ((lisp-name &rest c-names) &key documentation) mask (declare (ignore documentation)) (check-type lisp-name symbol) (loop for c-name in c-names do ;XXX Why multiple c-names ? (check-type c-name string) (c-format out " (") (c-print-symbol out lisp-name) (c-format out " ") (c-print-integer-constant out c-name base-type) (c-format out ")~%")))) (c-format out ")~%")))
On Sun, 2015-01-25 at 19:01 -0700, Frank wrote: > Hello, > Thanks for your reply. Atm I work around this so I'm good. I may pick > up on that and have a closer look and get back on this later. > > On Sun, 2015-01-25 at 23:06 +0000, Luís Oliveira wrote: > > Hello Frank, > > > > On Sat, Jan 17, 2015 at 9:27 AM, Frank <f...@riseup.net> wrote: > > > enum uv_tcp_flags { > > > /* Used with uv_tcp_bind, when an IPv6 address is used. */ > > > UV_TCP_IPV6ONLY = 1 > > > }; > > [...] > > > #ifdef UV_TCP_IPV6ONLY > > > fprintf(output, "%d", UV_TCP_IPV6ONLY); > > > #else > > > fputs("\n #.(cl:progn (cl:warn 'cffi-grovel:missing-definition :name > > > 'IPV6-ONLY) -1)", output); > > > #endif > > > fputs(")", output); > > > fputs(")\n", output); > > > > > > Obviously the #ifdef guard is the culprit here. Maybe you guys want to > > > fix this? > > > > Well, there's a purpose to that #ifdef, and it works nicely when > > dealing with macro constants rather than enums. > > > > I'm not sure what the best way is to cater to your use case. We have > > CENUM and CONSTANTENUM for CFFI:DEFCFENUM, but only BITFIELD for > > CFFI:DEFBITFIELD. The naming is a bit inconsistent. > > > > But naming aside, do you feel like adding (and testing) an option to > > CFFI:DEFBITFIELD that does what you want? A pull request on GitHub > > would be great! > > > > Thanks, > > > > > > _______________________________________________ > Cffi-devel mailing list > Cffi-devel@common-lisp.net > http://mailman.common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel
diff --git a/grovel/grovel.lisp b/grovel/grovel.lisp index fef2a46..372f7fe 100644 --- a/grovel/grovel.lisp +++ b/grovel/grovel.lisp @@ -791,6 +791,32 @@ string." (format out "~&#endif~%")) (c-format out ")"))) (c-format out ")~%"))) + + +(define-grovel-syntax bitfieldenum (name-and-opts &rest masks) + (destructuring-bind (name &key base-type) + (ensure-list name-and-opts) + (c-section-header out "bitfieldenum" name) + (c-export out name) + (c-format out "(cffi:defbitfield (") + (c-print-symbol out name t) + (when base-type + (c-printf out " ") + (c-print-symbol out base-type t)) + (c-format out ")~%") + (dolist (mask masks) + (destructuring-bind ((lisp-name &rest c-names) &key documentation) + mask + (declare (ignore documentation)) + (check-type lisp-name symbol) + (loop for c-name in c-names do ;XXX Why multiple c-names ? + (check-type c-name string) + (c-format out " (") + (c-print-symbol out lisp-name) + (c-format out " ") + (c-print-integer-constant out c-name base-type) + (c-format out ")~%")))) + (c-format out ")~%"))) ;;;# Wrapper Generation
_______________________________________________ Cffi-devel mailing list Cffi-devel@common-lisp.net http://mailman.common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel