[cffi-devel] a thought on string encodings

James Bielman jamesjb at jamesjb.com
Mon Jan 2 14:13:50 UTC 2006


On Mon, 2006-01-02 at 14:18 +0100, Hoehle, Joerg-Cyril wrote:

> Summary:
> ptr -> Lisp string:
> either ext:convert + memory-as uint8
> or (let ((old *foreign-encoding*))
>      (unwind-protect (progn (setq *foreign-encoding* utf-8)
>        (memory-as pointer (parse-c-type `(c-array character ,known-length)))
>        )(setq *foreign-encoding* old))) ; looks scary :-(
> Do you need unknown-length as well?
> Lisp string -> ptr:
> ext:convert + memory-as uint8 as mentioned above.

Thanks for the detailed explanation.  I did need unknown length, here's
what I'm using now to convert to/from:

#+clisp
(defmethod translate-to-foreign ((s string) (name (eql 'utf8-string)))
  (let* ((bytes (ext:convert-string-to-bytes s charset:utf-8))
         (length (length bytes))
         (buf (foreign-alloc :unsigned-char :count (1+ length))))
    (setf (ffi:memory-as ptr (ffi:parse-c-type
                              `(ffi:c-array ffi:uint8 ,length))) bytes)
    (setf (mem-aref buf :unsigned-char length) 0)
    buf))

#+clisp
(defcfun "strlen" :unsigned-int
  (s :pointer))

#+clisp
(defmethod translate-from-foreign (ptr (name (eql 'utf8-string)))
  (let* ((length (strlen ptr))
         (bytes (ffi:memory-as ptr (ffi:parse-c-type
                                    `(ffi:c-array ffi:uint8 ,length)))))
    (ext:convert-string-from-bytes bytes charset:utf-8)))

Now that this is working, I will start pulling the
implementation-specific code into an encoding-aware 
%FOREIGN-STRING-TO-LISP function in CFFI-SYS.

James





More information about the cffi-devel mailing list