chiark / gitweb /
Bug fix
[clg] / glib / glib.lisp
index e8f6f47c5f0579120f53ee351d2240b2aa9a9c54..43eb8bca0f823e41aa52a444fbf15178612921f1 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.44 2008-10-08 18:11:12 espen Exp $
 
 
 (in-package "GLIB")
@@ -39,24 +39,20 @@   (defmacro with-mutex ((mutex) &body body)
 
 ;;;; Memory management
 
-(defbinding (%allocate-memory "g_malloc0") () pointer
-  (size unsigned-long))
+(deftype gsize () 'unsigned-int)
 
-(defbinding (%deallocate-memory "g_free") () nil
-  (address pointer))
+(defbinding malloc0 () pointer
+  (size gsize))
 
-;; (setf
-;;  (symbol-function 'allocate-memory) #'%allocate-memory
-;;  (symbol-function 'deallocate-memory) #'%deallocate-memory)
+(defbinding free () nil
+  (address pointer))
 
-(setf *memory-allocator* #'%allocate-memory)
-(setf *memory-deallocator* #'%deallocate-memory)
+(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))
@@ -152,19 +148,22 @@ (defbinding quark-to-string () (static string)
 (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)
@@ -324,12 +323,11 @@ (define-type-method copy-function ((type glist) &key inlined)
       #'(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)