Need foreign string method for translate-into-foreign-memory?
Liam Healy
lnp at healy.washington.dc.us
Sat Oct 5 23:36:29 UTC 2013
On Tue, Oct 1, 2013 at 12:35 PM, Luís Oliveira
<loliveira at common-lisp.net> wrote:
> On Tue, Oct 1, 2013 at 5:28 PM, Liam Healy <lnp at healy.washington.dc.us> wrote:
>> OK. On superficial examination, it seems like foreign-string-alloc and
>> lisp-string-to-foreign have significant duplicated code. Is there a reason
>> for that rather than having the former call the latter?
>
> Having the foreign-string-alloc call lisp-string-to-foreign would
> cause the string length to be calculated twice. But it indeed seems
> like they could both share a helper function at least.
>
> --
> Luís Oliveira
Are you sure?
;;; LMH new function
(defun length-of-string-as-foreign (string encoding start end null-terminated-p)
(+ (funcall (octet-counter (lookup-mapping *foreign-string-mappings*
encoding))
string start end 0)
(if null-terminated-p
(null-terminator-len encoding)
0)))
;;; LMH new version
(defun foreign-string-alloc (string &key (encoding *default-foreign-encoding*)
(null-terminated-p t) (start 0) end)
"Allocate a foreign string containing Lisp string STRING.
The string must be freed with FOREIGN-STRING-FREE."
(let* ((length
(length-of-string-as-foreign
string encoding start end null-terminated-p))
(ptr (foreign-alloc :char :count length)))
(lisp-string-to-foreign
string ptr length :start start :end end :encoding encoding)
(values ptr length)))
The only duplication of effort is mapping and null-len, which seem
like pretty lightweight operations. However, by adding key variables
to lisp-string-to-foreign, we could avoid the recalculation. The new
function I have defined is mostly for my clarity of thought and can be
folded into foreign-string-alloc if that's preferable.
Does this look right? What do you think?
Thanks,
Liam
More information about the cffi-devel
mailing list