[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Code fragments for returning C string to Lisp....
- To: info-mcl@cambridge.apple.com
- Subject: Code fragments for returning C string to Lisp....
- From: DOYLE@SISU
- Date: Fri, 26 Jul 1991 09:45 EST
Charlene Abrams asked:
> Or alternately, how do I return a string from C back to Lisp?
Here is a codce we are writing
to the NCSA's HDF/Vset library:
;;; Here is the FF interface for a C function which returns
;;; pointers to both a string and an integer..
;;
;; A record structure is defined for returning the longint...
(defrecord longint-ptr
(integer :longint) )
(deffcfun
(Vinquire "Vinquire")
(
(pointer :ptr :no-check-arg) ;vg *
(pointer :ptr :no-check-arg) ;longint-ptr
(string :cstring :by-reference); char * (value returned here)
)
:long)
The function prototype in C looks like:
int Vinquire (VGROUP *vg,int * nentries,char * vgname);
And it is called by passing for the Lisp character array:
(let (
(vg-ptr (Vattach df-pointer tag "r"))
(vgname (make-array (list VSET_VGNAMELENMAX)
:adjustable t
:element-type 'character
:initial-element #\null
))
)
(if (not (%null-ptr-p vg-ptr ))
(%stack-block ((n-entries LONGINT_PTR_SIZE))
(Vinquire vg-ptr n-entries vgname )))
; vgname now contains the string...
; and (rref n-entries longint-ptr.integer) gets the
; integer.
)
This seems to work just fine. Please let me know if there
is a more efficient way (Apropos reveals CCL::WITH-CSTR and
CCL::WITH-CSTRS, but these aren't documented or exported from CCL.
I'd love to use them if they are going to stay around!)
Sean Doyle