From 8071964943e23700cfe1095ba0f5e3c99f590dee Mon Sep 17 00:00:00 2001 From: =?utf8?q?Ludovic=20Court=C3=A8s?= Date: Sun, 20 Nov 2011 01:10:58 +0100 Subject: [PATCH] Allow overlapping regions to be passed to `bytevector-copy!'. Reported by Dmitry Chestnykh . Fixes . * libguile/bytevectors.c (scm_bytevector_copy_x): Use `memmove', not `memcpy'. * test-suite/tests/bytevectors.test ("2.2 General Operations")["bytevector-copy! overlapping"]: New test. * doc/ref/api-data.texi (Bytevector Manipulation): Mention possible overlapping. --- doc/ref/api-data.texi | 3 ++- libguile/bytevectors.c | 6 +++--- test-suite/tests/bytevectors.test | 11 +++++++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/doc/ref/api-data.texi b/doc/ref/api-data.texi index f9b39b61d..5017165c0 100644 --- a/doc/ref/api-data.texi +++ b/doc/ref/api-data.texi @@ -4546,7 +4546,8 @@ Fill bytevector @var{bv} with @var{fill}, a byte. @deffnx {C Function} scm_bytevector_copy_x (source, source_start, target, target_start, len) Copy @var{len} bytes from @var{source} into @var{target}, starting reading from @var{source-start} (a positive index within @var{source}) -and start writing at @var{target-start}. +and start writing at @var{target-start}. It is permitted for the +@var{source} and @var{target} regions to overlap. @end deffn @deffn {Scheme Procedure} bytevector-copy bv diff --git a/libguile/bytevectors.c b/libguile/bytevectors.c index 4aeae63b0..fff53550c 100644 --- a/libguile/bytevectors.c +++ b/libguile/bytevectors.c @@ -579,9 +579,9 @@ SCM_DEFINE (scm_bytevector_copy_x, "bytevector-copy!", 5, 0, 0, if (SCM_UNLIKELY (c_target_start + c_len > c_target_len)) scm_out_of_range (FUNC_NAME, target_start); - memcpy (c_target + c_target_start, - c_source + c_source_start, - c_len); + memmove (c_target + c_target_start, + c_source + c_source_start, + c_len); return SCM_UNSPECIFIED; } diff --git a/test-suite/tests/bytevectors.test b/test-suite/tests/bytevectors.test index 081e4ee47..3007434c4 100644 --- a/test-suite/tests/bytevectors.test +++ b/test-suite/tests/bytevectors.test @@ -1,6 +1,6 @@ ;;;; bytevectors.test --- R6RS bytevectors. -*- mode: scheme; coding: utf-8; -*- ;;;; -;;;; Copyright (C) 2009, 2010 Free Software Foundation, Inc. +;;;; Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. ;;;; Ludovic Courtès ;;;; ;;;; This library is free software; you can redistribute it and/or @@ -42,7 +42,14 @@ (and (bytevector=? (make-bytevector 20 7) (make-bytevector 20 7)) (not (bytevector=? (make-bytevector 20 7) - (make-bytevector 20 0)))))) + (make-bytevector 20 0))))) + + (pass-if "bytevector-copy! overlapping" + ;; See . + (let ((b (u8-list->bytevector '(1 2 3 4 5 6 7 8)))) + (bytevector-copy! b 0 b 3 4) + (bytevector->u8-list b) + (bytevector=? b #vu8(1 2 3 1 2 3 4 8))))) (with-test-prefix/c&e "2.3 Operations on Bytes and Octets" -- 2.20.1