Is this FFI done right? pasted by C-Keen on Sat Oct 8 21:33:31 2011

(define-foreign-variable sizeof-cairo-text-extents int "sizeof(cairo_text_extents_t)")

(define-record cairo-text-extents-type buffer)

(let ((maker make-cairo-text-extents-type))
  (set! make-cairo-text-extents-type
    (lambda () (maker (make-u8vector sizeof-cairo-text-extents)))))

(define-record-printer (cairo-text-extents-type te out)
                    (list "#<cairo-text-extents "
                          (cairo-text-extents-x-bearing te)" "
                          (cairo-text-extents-y-bearing te)" "
                          (cairo-text-extents-width te)" "
                          (cairo-text-extents-height te)" "
                          (cairo-text-extents-x-advance te)" "
                          (cairo-text-extents-y-advance te)">"))))
          (b (cairo-text-extents-type-buffer te)))

(define cairo-text-extents-x-bearing (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->x_bearing);"))
(define cairo-text-extents-y-bearing (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->y_bearing);"))
(define cairo-text-extents-width (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->width);"))
(define cairo-text-extents-height (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->height);"))
(define cairo-text-extents-x-advance (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->x_advance);"))
(define cairo-text-extents-y-advance (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->y_advance);"))
(define cairo-text-extents-x-bearing-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->x_bearing = v;"))
(define cairo-text-extents-y-bearing-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->y_bearing = v;"))
(define cairo-text-extents-width-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->width = v;"))
(define cairo-text-extents-height-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->height = v;"))
(define cairo-text-extents-x-advance-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->x_advance = v;"))
(define cairo-text-extents-y-advance-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->y_advance = v;"))

(define cairo-text-extents (foreign-lambda void "cairo_text_extents" cairo_t c-string cairo_text_extents_t))

and the missing definition pasted by C-Keen on Sat Oct 8 21:35:36 2011

(define-foreign-type cairo_text_extents_t (c-pointer "cairo_text_extents_t")

a possible fix? added by C-Keen on Sat Oct 8 22:13:29 2011

$ svn diff        
Index: cairo.scm
===================================================================
--- cairo.scm   (revision 25270)
+++ cairo.scm   (working copy)
@@ -303,7 +303,7 @@
 (define-record cairo-text-extents-type buffer)
 (let ((maker make-cairo-text-extents-type))
   (set! make-cairo-text-extents-type
-    (lambda () (maker (make-u8vector sizeof-cairo-text-extents)))))
+    (lambda () (maker (make-blob sizeof-cairo-text-extents)))))
 
 (define-record-printer (cairo-text-extents-type te out)
   (for-each (lambda (x) (display x out)
@@ -315,26 +315,21 @@
                           (cairo-text-extents-x-advance te)" "
                           (cairo-text-extents-y-advance te)">"))))
 
-(define-foreign-type cairo_text_extents_t (c-pointer "cairo_text_extents_t")
-  (lambda (te) 
-    (let ((p (##sys#make-pointer))
-          (b (cairo-text-extents-type-buffer te)))
-      (if b (##core#inline "C_pointer_to_block" p b))
-      p)))
+(define-foreign-type cairo_text_extents_t scheme-pointer)
 
-(define cairo-text-extents-x-bearing (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->x_bearing);"))
-(define cairo-text-extents-y-bearing (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->y_bearing);"))
-(define cairo-text-extents-width (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->width);"))
-(define cairo-text-extents-height (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->height);"))
-(define cairo-text-extents-x-advance (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->x_advance);"))
-(define cairo-text-extents-y-advance (foreign-lambda* double ((cairo_text_extents_t te)) "return(te->y_advance);"))
+(define cairo-text-extents-x-bearing (foreign-lambda* double ((cairo_text_extents_t te)) "return(((cairo_text_extents_t*)te)->x_bearing);"))
+(define cairo-text-extents-y-bearing (foreign-lambda* double ((cairo_text_extents_t te)) "return(((cairo_text_extents_t*)te)->y_bearing);"))
+(define cairo-text-extents-width (foreign-lambda* double ((cairo_text_extents_t te)) "return(((cairo_text_extents_t*)te)->width);"))
+(define cairo-text-extents-height (foreign-lambda* double ((cairo_text_extents_t te)) "return(((cairo_text_extents_t*)te)->height);"))
+(define cairo-text-extents-x-advance (foreign-lambda* double ((cairo_text_extents_t te)) "return(((cairo_text_extents_t*)te)->x_advance);"))
+(define cairo-text-extents-y-advance (foreign-lambda* double ((cairo_text_extents_t te)) "return(((cairo_text_extents_t*)te)->y_advance);"))
 
-(define cairo-text-extents-x-bearing-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->x_bearing = v;"))
-(define cairo-text-extents-y-bearing-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->y_bearing = v;"))
-(define cairo-text-extents-width-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->width = v;"))
-(define cairo-text-extents-height-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->height = v;"))
-(define cairo-text-extents-x-advance-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->x_advance = v;"))
-(define cairo-text-extents-y-advance-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "te->y_advance = v;"))
+(define cairo-text-extents-x-bearing-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "((cairo_text_extents_t*)te)->x_bearing = v;"))
+(define cairo-text-extents-y-bearing-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "((cairo_text_extents_t*)te)->y_bearing = v;"))
+(define cairo-text-extents-width-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "((cairo_text_extents_t*)te)->width = v;"))
+(define cairo-text-extents-height-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "((cairo_text_extents_t*)te)->height = v;"))
+(define cairo-text-extents-x-advance-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "((cairo_text_extents_t*)te)->x_advance = v;"))
+(define cairo-text-extents-y-advance-set! (foreign-lambda* double ((cairo_text_extents_t te) (double v)) "((cairo_text_extents_t*)te)->y_advance = v;"))
 
 (define-foreign-variable sizeof-cairo-font-extents int "sizeof(cairo_font_extents_t)")