[gambit-list] c interface: enums issue

Álvaro Castro-Castilla alvaro.castro.castilla at gmail.com
Sun Feb 5 11:48:13 EST 2012


Hi,

I'm using my ffi cairo bindings, that worked fine in the past. However now
that I'm using Gambit compiled with C++ support it stopped working.




I got this error:

*** ERROR IN main-sdl#main, "main-sdl.scm"@19.24 -- (Argument 2) Can't
convert to C type
(cairo#cairo-image-surface-create-for-data '#<|unsigned char*| #16
0x7f33ba191000> 1 500 500 2000)

On the ffi side, things are declared like this:

(c-define-type cairo-format-t "cairo_format_t")
(define CAIRO_FORMAT_ARGB32 0)
(define CAIRO_FORMAT_RGB24 1)
(define CAIRO_FORMAT_A8 2)
(define CAIRO_FORMAT_A1 3)
(define CAIRO_FORMAT_RGB16_565 4)
(define cairo-image-surface-create-for-data (c-lambda (unsigned-char*
cairo-format-t int int int) cairo-surface-t*
"cairo_image_surface_create_for_data"))

And used like this:

(cairo-image-surface-create-for-data
                         (SDL::surface-pixels sdl-surface)
                         CAIRO_FORMAT_RGB24
                         maxx
                         maxy
                         (SDL::screen-pitch sdl-surface))

I've tried with this idea:

(define cairo-format
  (c-lambda (int) cairo-format-t
            "
            switch (___arg1) {
              case 0: ___result = CAIRO_FORMAT_ARGB32; break;
              case 1: ___result = CAIRO_FORMAT_RGB24; break; // and so on...
            }
            "))

And then calling on the Scheme side "(cairo-format CAIRO_FORMAT_RGB24)"
instead of just using the int directly, but it segfaults.


How should I really handle enums properly?



Best regards,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20120205/e992aed5/attachment.htm>


More information about the Gambit-list mailing list