r10380: working on new sbcl
[uffi.git] / src / strings.lisp
index 7ac5c16c14b9d7ab5c423c82e1ffcf09199e0106..a0ca3fc31bdb26ad3e9d099c5caed63c552e0bf1 100644 (file)
@@ -299,56 +299,48 @@ that LW/CMU automatically converts strings from c-calls."
        (setf (char result i) (code-char (system:sap-ref-8 sap i))))
       result)))
 
-#+sbcl
-(sb-ext:without-package-locks
-    (let ((copy-fn (if (fboundp (intern "COPY-FROM-SYSTEM-AREA" "SB-KERNEL"))
-                      (intern "COPY-FROM-SYSTEM-AREA" "SB-KERNEL")
-                      (intern "COPY-UB8-FROM-SYSTEM" "SB-KERNEL"))))
-
-      #-sb-unicode
-      (defun sbcl-naturalize-cstring (sap &key length (null-terminated-p t))
-       (declare (type sb-sys:system-area-pointer sap))
-       (locally
-           (declare (optimize (speed 3) (safety 0)))
-         (let ((null-terminated-length
-                (when null-terminated-p
-                  (loop
-                     for offset of-type fixnum upfrom 0
-                     until (zerop (sb-sys:sap-ref-8 sap offset))
-                     finally (return offset)))))
-           (if length
-               (if (and null-terminated-length
-                        (> (the fixnum length) (the fixnum null-terminated-length)))
-                   (setq length null-terminated-length))
-               (setq length null-terminated-length)))
-         (let ((result (make-string length)))
-           (funcall copy-fn sap 0
-                    result (* sb-vm:vector-data-offset
-                              sb-vm:n-word-bits)
-                    (* length sb-vm:n-byte-bits))
-           result)))
+#+(and sbcl (not sb-unicode))
+(defun sbcl-naturalize-cstring (sap &key length (null-terminated-p t))
+  (declare (type sb-sys:system-area-pointer sap)
+          (type (or null fixnum) length))
+  (locally
+   (declare (optimize (speed 3) (safety 0)))
+   (let ((null-terminated-length
+         (when null-terminated-p
+           (loop
+            for offset of-type fixnum upfrom 0
+            until (zerop (sb-sys:sap-ref-8 sap offset))
+            finally (return offset)))))
+     (if length
+        (if (and null-terminated-length
+                 (> (the fixnum length) (the fixnum null-terminated-length)))
+            (setq length null-terminated-length))
+       (setq length null-terminated-length)))
+   (let ((result (make-string length)))
+       (funcall *system-copy-fn* sap 0 result *system-copy-offset*
+               (* length *system-copy-multiplier*))
+       result)))
 
-      #+sb-unicode
-      (defun sbcl-naturalize-cstring (sap &key length (null-terminated-p t))
-       (declare (type sb-sys:system-area-pointer sap))
-       (locally
-           (declare (optimize (speed 3) (safety 0)))
-         (cond
-           (null-terminated-p
-            (let ((casted (sb-alien:cast (sb-alien:sap-alien sap (* char))
-                                         #+sb-unicode sb-alien:utf8-string
-                                         #-sb-unicode sb-alien:c-string)))
-              (if length
-                  (copy-seq (subseq casted 0 length))
-                  (copy-seq casted))))
-           (t
-            (let ((result (make-string length)))
-              ;; this will not work in sb-unicode
-              (funcall copy-fn sap 0
-                       result (* sb-vm:vector-data-offset
-                                 sb-vm:n-word-bits)
-                       (* length sb-vm:n-byte-bits))
-              result)))))))
+#+(and sbcl sb-unicode)
+(defun sbcl-naturalize-cstring (sap &key length (null-terminated-p t))
+  (declare (type sb-sys:system-area-pointer sap)
+          (type (or null fixnum) length))
+  (locally
+   (declare (optimize (speed 3) (safety 0)))
+   (cond
+    (null-terminated-p
+     (let ((casted (sb-alien:cast (sb-alien:sap-alien sap (* char))
+                                 #+sb-unicode sb-alien:utf8-string
+                                 #-sb-unicode sb-alien:c-string)))
+       (if length
+          (copy-seq (subseq casted 0 length))
+        (copy-seq casted))))
+    (t
+     (let ((result (make-string length)))
+       ;; this will not work in sb-unicode
+       (funcall *system-copy-fn* sap 0 result *system-copy-offset*
+               (* length *system-copy-multiplier*))
+       result)))))
 
 
 (eval-when (:compile-toplevel :load-toplevel :execute)