[Ecls-list] updating refererence pointers in UFFI

Dean O'Connor Dean.OConnor at ite.com.au
Wed Aug 30 09:17:33 UTC 2006

Great stuff mate !!

Thanks heaps, that worked nicely.

Yeah just called ffi:free-foreign-object after copying it to a lisp var
using ffi:deref-pointer to free the dynamic string.


-----Original Message-----
From: Dustin Long [mailto:dlong at stevens.edu] 
Sent: Wednesday, 30 August 2006 4:34 PM
To: Dean O'Connor
Cc: ecls-list at lists.sourceforge.net
Subject: Re: [Ecls-list] updating refererence pointers in UFFI

I've got some ecl+sqlite code lying around that I believe demonstrates 
what you are looking for.
Here err-message is a c-string passed back by the dll:

(ffi:def-foreign-type str-pointer (* (* :unsigned-char)))

(ffi:def-function ("sqlite3_exec" sqlite3_exec)
                  ((db sqlite3-db)
                   (sqlcmd :cstring)
                   (callback :pointer-void)
                   (dunno :int)
                   (err-message (* (* :unsigned-char))))
                  :module "sqlite.dll"
                  :returning :int)

  (let ((err-ptr (ffi:allocate-foreign-object 'str-pointer)))
    (sqlite3_exec db-conn sql-stm (ffi:callback 'sql-callback) 0

To my knowledge, sqlite is giving back pointers to statically allocated 
strings. If, in your case, the c code is allocating the memory, you'll 
need to call it again when you want to free.

Hope this helps!

Dean O'Connor wrote:
> I may have asked his ages ago but can't seem to find any record of it.
> I should probably post this on some UFFI mail list if I can find one
> aswell, but any ideas with ECL.
> I am using UFFI to call our DLL (written in C) functions and most of
> works ok.
> I can pass cstrings ok as in cl_init().
> But other functions such as cl_elementGetAttachment() creates C
> and return them by assigning them to dereferenced argument pointers.
> Also pointers to longs are dereferenced.
> Eg. for the "attachment" argument, in C we pass the address of a C
> string pointer. This get updated with the newly allocated C string
> pointer.
> So is there any way to pass the C-function via UFFI a C pointer arg of
> somekind and have it updated when returning to Lisp ??
> It doesn't seem to fit in with the Lisp way of doing things, but is
> possible in any way ?
> I am not compiling any of this in Windows. Its just pure interpretive.
> long cl_init(const char *configFileName);
> ((ffi:def-function ("cl_init" init)
>   ((configFileName :cstring ))
>   :returning :long
> )
> long cl_elementGetAttachment(long hDoc, unsigned int index, char
> char **attachment, unsigned long *attachmentSize, bool detach);
> ((ffi:def-function ("cl_elementgetattachment" element-get-attachment)
>                   ((hdoc :long) (index :unsigned-short) (name
> :pointer-void)
>                    (attachment :pointer-void) (attachmentsize
> :pointer-void)
>                    (detach :unsigned-char))
>                   :returning
>                   :long
>                   :module
>                   :default))
> Cheers
> deano
> Using Tomcat but need to do more? Need to support web services,
> Get stuff done quickly with pre-integrated technology to make your job
> Download IBM WebSphere Application Server v.1.0.1 based on Apache
> _______________________________________________
> Ecls-list mailing list
> Ecls-list at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/ecls-list

More information about the ecl-devel mailing list