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)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.