? bio.fas ? bio.fasl ? bio.lib ? conditions.fas ? conditions.fasl ? conditions.lib ? cvs.diff ? ffi-buffer-all.fas ? ffi-buffer-all.fasl ? ffi-buffer-all.lib ? ffi-buffer-clisp.fas ? ffi-buffer-clisp.lib ? ffi-buffer.fasl ? ffi.fas ? ffi.fasl ? ffi.lib ? package.fas ? package.fasl ? package.lib ? reload.fas ? reload.fasl ? reload.lib ? streams.fas ? streams.fasl ? streams.lib Index: ffi-buffer-clisp.lisp =================================================================== RCS file: /project/cl-plus-ssl/cvsroot/cl+ssl/ffi-buffer-clisp.lisp,v retrieving revision 1.1 diff -U8 -r1.1 ffi-buffer-clisp.lisp --- ffi-buffer-clisp.lisp 7 Jul 2007 15:25:09 -0000 1.1 +++ ffi-buffer-clisp.lisp 29 Jun 2008 11:09:21 -0000 @@ -8,22 +8,36 @@ +initial-buffer-size+) (defun buffer-elt (buf index) (ffi:memory-as buf 'ffi:uint8 index)) (defun set-buffer-elt (buf index val) (setf (ffi:memory-as buf 'ffi:uint8 index) val)) (defsetf buffer-elt set-buffer-elt) -(defun v/b-replace (vec buf &key (start1 0) end1 (start2 0) (end2 +initial-buffer-size+)) +(declaim + (inline calc-buf-end)) + +;; to calculate non NIL value of the buffer end index +(defun calc-buf-end (buf-start vec vec-start vec-end) + (+ buf-start + (- (or vec-end (length vec)) + vec-start))) + +(defun v/b-replace (vec buf &key (start1 0) end1 (start2 0) end2) + (when (null end2) + (setf end2 (calc-buf-end start2 vec start1 end1))) (replace vec (ffi:memory-as buf (ffi:parse-c-type `(ffi:c-array ffi:uint8 ,(- end2 start2))) start2) :start1 start1 :end1 end1)) -(defun b/v-replace (buf vec &key (start1 0) (end1 +initial-buffer-size+) (start2 0) end2) + +(defun b/v-replace (buf vec &key (start1 0) end1 (start2 0) end2) + (when (null end1) + (setf end1 (calc-buf-end start1 vec start2 end2))) (setf (ffi:memory-as buf (ffi:parse-c-type `(ffi:c-array ffi:uint8 ,(- end1 start1))) start1) (subseq vec start2 end2))) (defmacro with-pointer-to-vector-data ((ptr buf) &body body) `(let ((,ptr ,buf)) ,@body))