Added new types GSSIZE and GOFFSET
[clg] / glib / glib.lisp
index e8f6f47..a94b0fd 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: glib.lisp,v 1.42 2007-10-17 14:30:41 espen Exp $
+;; $Id: glib.lisp,v 1.45 2008-12-14 21:37:25 espen Exp $
 
 
 (in-package "GLIB")
 
 ;;;; Memory management
 
-(defbinding (%allocate-memory "g_malloc0") () pointer
-  (size unsigned-long))
+(deftype gsize () 'unsigned-int)
+(deftype gssize () 'int)
+(deftype goffset () '(unsigned-int 64))
 
-(defbinding (%deallocate-memory "g_free") () nil
-  (address pointer))
 
-;; (setf
-;;  (symbol-function 'allocate-memory) #'%allocate-memory
-;;  (symbol-function 'deallocate-memory) #'%deallocate-memory)
+(defbinding malloc0 () pointer
+  (size gsize))
 
-(setf *memory-allocator* #'%allocate-memory)
-(setf *memory-deallocator* #'%deallocate-memory)
+(defbinding free () nil
+  (address pointer))
+
+(setf *memory-allocator* #'malloc0)
+(setf *memory-deallocator* #'free)
 
 (defbinding (reallocate-memory "g_realloc") () pointer
   (address pointer)
-  (size unsigned-long))
-
-(deftype gsize () 'unsigned-int)
+  (size gsize))
 
 (defbinding (slice-alloc "g_slice_alloc0") () pointer
   (block-size gsize))
@@ -64,6 +63,8 @@
 ;;;; User data is a mechanism to store references to lisp objects in
 ;;;; foreign code
 
+;; TODO: move to gffi
+
 (defvar *user-data-lock* (make-mutex))
 (defvar *user-data* (make-hash-table))
 (defvar *user-data-next-id* 1)
 (deftype glist (type) 
   `(or null (cons ,type list)))
 
-(defbinding (%glist-append "g_list_append") () pointer
+(defbinding (%glist-prepend "g_list_prepend") () pointer
   (glist (or null pointer))
   (nil null))
 
+(defbinding (%glist-reverse "g_list_reverse") () pointer
+  (glist (or null pointer)))
+
 (defun make-glist (element-type list &optional temp-p)
   (let ((writer (if (functionp element-type)
                    element-type
                  (writer-function element-type :temp temp-p))))
     (loop
      for element in list
-     as glist = (%glist-append nil) then (%glist-append glist)
+     as glist = (%glist-prepend nil) then (%glist-prepend glist)
      do (funcall writer element glist)
-     finally (return glist))))
+     finally (return (%glist-reverse glist)))))
 
 (defun glist-next (glist)
   (unless (null-pointer-p glist)
       #'(lambda (from to &optional (offset 0))
          (unless (null-pointer-p (ref-pointer from offset))
            (loop
-            as from-list = (ref-pointer from offset) 
-                           then (glist-next from-list)
-            as to-list = (setf (ref-pointer to offset) (%glist-append nil)) 
-                         then (%glist-append to-list)
+            as from-list = (ref-pointer from offset) then (glist-next from-list)
+            as to-list = (%glist-prepend nil) then (%glist-prepend to-list)
             do (funcall copy-element from-list to-list)
-            while (glist-next from-lisT)))))))
+            while (glist-next from-list)
+            finally (setf (ref-pointer to offset) (%glist-reverse to-list))))))))
 
 
 ;;;; Single linked list (GSList)