Commits

Walton Hoops committed ea7c616

make accessors SETFable and free produced C strings

Comments (0)

Files changed (1)

   (file :pointer))
 
 ;;; taglib_file_audioproperties
-;;; taglib_file_save
+(defcfun (file-save "taglib_file_save") :boolean
+  (file :pointer))
 
 (defmacro taglib-accessor-for (slot)
-  (let* ((slot-name (string-downcase (string slot)))
-	 (function-name (intern (string-upcase (concatenate 'string "tag-" slot-name))))
-	 (foreign-name (concatenate 'string "taglib_tag_" slot-name)))
-    `(defcfun (,function-name ,foreign-name) :string+ptr
-       (tag :pointer))))
+  (let ((function-name (intern (concatenate 'string "TAG-" (string slot))))
+	(foreign-name (string-downcase (concatenate 'string "taglib_tag_" (string slot))))
+	(foreign-set-name (string-downcase (concatenate 'string "taglib_tag_set_" (string slot)))))
+    `(progn
+       (defun ,function-name (tag)
+	 (let ((str-ptr (foreign-funcall ,foreign-name :pointer tag :string+ptr)))
+	   (foreign-funcall "taglib_free" :pointer (cadr str-ptr) :void)
+	   (car str-ptr)))
+       (defun (setf ,function-name) (value tag)
+	 (foreign-funcall ,foreign-set-name :pointer tag :string value :void)))))
 
 (taglib-accessor-for :title)
 (taglib-accessor-for :artist)