;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-;; $Id: glib.lisp,v 1.9 2001/04/29 20:07:17 espen Exp $
+;; $Id: glib.lisp,v 1.15 2004/11/01 00:08:49 espen Exp $
(in-package "GLIB")
;;;; Memory management
-(defbinding ("g_malloc0" allocate-memory) () pointer
+(defbinding (allocate-memory "g_malloc0") () pointer
(size unsigned-long))
-(defbinding ("g_realloc" reallocate-memory) () pointer
+(defbinding (reallocate-memory "g_realloc") () pointer
(address pointer)
(size unsigned-long))
-(defbinding ("g_free" deallocate-memory) () nil
+(defbinding (deallocate-memory "g_free") () nil
(address pointer))
+;(defun deallocate-memory (address)
+; (declare (ignore address)))
(defun copy-memory (from length &optional (to (allocate-memory length)))
(kernel:system-area-copy from 0 to 0 (* 8 length))
(declaim (fixnum *user-data-count*))
-(defvar *destroy-notify* (system:foreign-symbol-address "destroy_notify"))
(defvar *user-data* (make-hash-table))
(defvar *user-data-count* 0)
(deftype glist (type) `(or (null (cons ,type list))))
-(defbinding ("g_list_append" %glist-append-unsigned) () pointer
+(defbinding (%glist-append-unsigned "g_list_append") () pointer
(glist pointer)
(data unsigned))
-(defbinding ("g_list_append" %glist-append-signed) () pointer
+(defbinding (%glist-append-signed "g_list_append") () pointer
(glist pointer)
(data signed))
-(defbinding ("g_list_append" %glist-append-sap) () pointer
+(defbinding (%glist-append-sap "g_list_append") () pointer
(glist pointer)
(data pointer))
(unless (null-pointer-p glist)
(sap-ref-sap glist +size-of-sap+)))
-(defbinding ("g_list_free" glist-free) () nil
+(defbinding (glist-free "g_list_free") () nil
(glist pointer))
(deftype-method translate-type-spec glist (type-spec)
(deftype gslist (type) `(or (null (cons ,type list))))
-(defbinding ("g_slist_prepend" %gslist-prepend-unsigned) () pointer
+(defbinding (%gslist-prepend-unsigned "g_slist_prepend") () pointer
(gslist pointer)
(data unsigned))
-(defbinding ("g_slist_prepend" %gslist-prepend-signed) () pointer
+(defbinding (%gslist-prepend-signed "g_slist_prepend") () pointer
(gslist pointer)
(data signed))
-(defbinding ("g_slist_prepend" %gslist-prepend-sap) () pointer
+(defbinding (%gslist-prepend-sap "g_slist_prepend") () pointer
(gslist pointer)
(data pointer))
(signed `(%gslist-prepend-signed ,gslist ,value))
(system-area-pointer `(%gslist-prepend-sap ,gslist ,value))))
-(defbinding ("g_slist_free" gslist-free) () nil
+(defbinding (gslist-free "g_slist_free") () nil
(gslist pointer))
(deftype-method translate-type-spec gslist (type-spec)
(dotimes (i ,length)
(setf
(aref vector i)
- ,(translate-to-alien
+ ,(translate-from-alien
element-type
`(,(sap-ref-fname element-type) c-array (* i ,element-size))
weak-ref)))
`(dotimes (i ,length)
(unreference-alien
element-type (sap-ref-sap c-vector (* i ,element-size))))
- `(do ((offset 0 (+ offset ,element-size))
+ `(do ((offset 0 (+ offset ,element-size)))
((sap=
(sap-ref-sap c-vector offset)
- *magic-end-of-array*)))
+ *magic-end-of-array*))
,(unreference-alien
element-type '(sap-ref-sap c-vector offset))))))
(deallocate-memory c-vector)))))
+
+
+(defun map-c-array (seqtype function location element-type length)
+ (let ((reader (intern-reader-function element-type))
+ (size (size-of element-type)))
+ (case seqtype
+ ((nil)
+ (dotimes (i length)
+ (funcall function (funcall reader location (* i size)))))
+ (list
+ (let ((list nil))
+ (dotimes (i length)
+ (push (funcall function (funcall reader location (* i size))) list))
+ (nreverse list)))
+ (t
+ (let ((sequence (make-sequence seqtype length)))
+ (dotimes (i length)
+ (setf
+ (elt sequence i)
+ (funcall function (funcall reader location (* i size)))))
+ sequence)))))