Hello,

I've been working on an interface for the graphics package plplot (http://plplot.sourceforge.net/). Its API has lots of functions that expect arrays, matrixes and associated variables that specify the size of the array/matrix. To facilitate wrapping these functions I wrote a macro that I thought might (after some modification/cleaning) be useful for others. The macro can be found at: http:// paste.lisp.org/display/18274.

It was written to expand a function declaration like:

(pl-defcfun ("c_plmesh" plmesh) :void
            (x *plflt nx)
            (y *plflt ny)
            (z **plflt (nx ny))
            (nx plint)
            (ny plint)
            (opt plint))

into: (progn statements removed)

(DEFCFUN ("c_plmesh" C-PLMESH)
           :VOID
           (X *PLFLT)
           (Y *PLFLT)
           (Z **PLFLT)
           (NX PLINT)
           (NY PLINT)
           (OPT PLINT))

(EXPORT 'C-PLMESH (PACKAGE-NAME *PACKAGE*)))

(DEFUN PLMESH (X Y Z OPT)
(LET ((C-X (MAKE-PTR X :DOUBLE #'(LAMBDA (X) (COERCE X 'DOUBLE- FLOAT)))) (C-Y (MAKE-PTR Y :DOUBLE #'(LAMBDA (X) (COERCE X 'DOUBLE- FLOAT))))
          (NX (ARRAY-DIMENSION Z 0))
          (NY (ARRAY-DIMENSION Z 1))
          (C-Z (MAKE-MATRIX Z)))
      (UNWIND-PROTECT
          (C-PLMESH C-X
                    C-Y
                    C-Z
                    (FUNCALL #'(LAMBDA (X) (ROUND X)) NX)
                    (FUNCALL #'(LAMBDA (X) (ROUND X)) NY)
                    (FUNCALL #'(LAMBDA (X) (ROUND X)) OPT))
        (PROGN
         (FOREIGN-FREE C-X)
         (FOREIGN-FREE C-Y)
         (FREE-MATRIX C-Z (LIST NX NY))))))

(EXPORT 'PLMESH (PACKAGE-NAME *PACKAGE*))))

Where make-ptr, make-matrix and free-matrix are functions that make 1D arrays, make 2D arrays & free 2D arrays respectively.

best,
-Hazen

_______________________________________________
cffi-devel mailing list
cffi-devel@common-lisp.net
http://common-lisp.net/cgi-bin/mailman/listinfo/cffi-devel

Reply via email to