[Openmcl-devel] Using CFStrings in OpenMCL

David Steuber david at david-steuber.com
Fri Dec 17 22:12:36 UTC 2004


I'm wondering if I am going about this the right way.  I'm starting to 
work through the Learning Carbon book, translating the C into Lisp.  I 
want something like the CFSTR() function that is used to turn a C 
string into a CFString for use by the Core Foundation functions and 
this was the closest I could come up with, partly inspired by code for 
WITH-CSTRS in ccl/lib/macros.lisp:

(defun make-cfstring (str)
   "Allocates a CFString object stored in a MACPTR which must be
   CFRelease(d) when no longer needed."
   (ccl::with-cstr (cstr str)
      (#_CFStringCreateWithCString (%null-ptr) cstr 
#$kCFStringEncodingMacRoman)))

(defmacro with-cfstring ((sym str) &rest body)
   "Create, use, and then release a CFString."
   (let ((ret (gensym)))
     `(let* ((,sym (make-cfstring ,str))
             (,ret (progn , at body)))
        (#_CFRelease ,sym)
        ,ret)))

(defmacro with-cfstrings (speclist &body body)
   "Create, use, and then release CFStrings."
   (ccl::with-specs-aux 'with-cfstring speclist body))

CL-USER> (with-cfstrings ((foo "foo") (bar "bar")) (print foo) (print 
bar) 2)

#<A Mac Pointer #x10DC90>
#<A Mac Pointer #x106570>

2
CL-USER>

Is the above reasonable code, or am I making work for myself?  I went 
to the trouble because I don't want memory leaks.




More information about the Openmcl-devel mailing list