;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-;; $Id: basic-types.lisp,v 1.2 2006-06-08 13:24:25 espen Exp $
+;; $Id: basic-types.lisp,v 1.5 2007-01-02 15:20:32 espen Exp $
(in-package "GFFI")
#+(or cmu sbcl)(sap-ref-double location offset)
#+clisp(ffi:memory-as location 'double-float offset)))
+(deftype optimized-double-float () 'double-float)
+
+(define-type-method to-alien-form ((type optimized-double-float) form &optional copy-p)
+ (declare (ignore type copy-p))
+ form)
+
;;; Character
;;; String
(defun utf8-length (string)
+ "Returns the length including the trailing zero, of STRING encoded as UTF8"
(1+ (loop
for char across string
as char-code = (char-code char)
((< char-code #x1FFFFF) 4)))))
(defun encode-utf8-string (string &optional location)
- (let ((location (or location (allocate-memory (utf8-length string)))))
+ (let* ((len (utf8-length string))
+ (location (or location (allocate-memory len))))
(loop
for char across string
for i from 0
((< char-code #x80) (setf (ref-byte location i) char-code))
((< char-code #x800) (encode 11))
((< char-code #x10000) (encode 16))
- ((< char-code #x200000) (encode 21))))
- finally (setf (ref-byte location (1+ i)) 0))
+ ((< char-code #x200000) (encode 21)))))
+ (setf (ref-byte location (1- len)) 0)
location))
(defun decode-utf8-string (c-string)