X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fhelper%2Fbinarybuffer.c;h=5732689c01e95fd8ff1033e45427a5bc0417d821;hp=e789e6ff1b52a1c0282c124483f163dd62dd8d83;hb=b21be6054a76418e93920ae4d038f75d65ba8840;hpb=6684b35346fc10626041e1b2fef060786bf98a95 diff --git a/src/helper/binarybuffer.c b/src/helper/binarybuffer.c index e789e6ff1b..5732689c01 100644 --- a/src/helper/binarybuffer.c +++ b/src/helper/binarybuffer.c @@ -133,26 +133,40 @@ void* buf_set_buf(const void *_src, unsigned src_start, { const uint8_t *src = _src; uint8_t *dst = _dst; - unsigned sb,db,sq,dq; + unsigned i,sb,db,sq,dq, lb,lq; sb = src_start / 8; db = dst_start / 8; sq = src_start % 8; dq = dst_start % 8; + lb = len / 8; + lq = len % 8; - for (unsigned i = 0; i < len; i++) + src += sb; + dst += db; + + /* check if both buffers are on byte boundary and + * len is a multiple of 8bit so we can simple copy + * the buffer */ + if ( (sq == 0) && (dq == 0) && (lq == 0) ) + { + for (i = 0; i < lb; i++) + *dst++ = *src++; + return (uint8_t*)_dst; + } + + /* fallback to slow bit copy */ + for (i = 0; i < len; i++) { if (((*src >> (sq&7)) & 1) == 1) *dst |= 1 << (dq&7); else *dst &= ~(1 << (dq&7)); - if ( sq++ == 7 ) { sq = 0; src++; } - if ( dq++ == 7 ) { dq = 0;