From: Ben Pfaff Date: Fri, 22 Nov 2013 19:42:42 +0000 (-0800) Subject: ofpbuf: New function ofpbuf_shift(). X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=b2348f6d5a2fd64f875aba0bfca2f52da2618fb5 ofpbuf: New function ofpbuf_shift(). An upcoming commit will add the first user. Signed-off-by: Ben Pfaff --- diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c index 82940eb75..0eed4284d 100644 --- a/lib/ofpbuf.c +++ b/lib/ofpbuf.c @@ -359,6 +359,24 @@ ofpbuf_padto(struct ofpbuf *b, size_t length) } } +/* Shifts all of the data within the allocated space in 'b' by 'delta' bytes. + * For example, a 'delta' of 1 would cause each byte of data to move one byte + * forward (from address 'p' to 'p+1'), and a 'delta' of -1 would cause each + * byte to move one byte backward (from 'p' to 'p-1'). */ +void +ofpbuf_shift(struct ofpbuf *b, int delta) +{ + ovs_assert(delta > 0 ? delta <= ofpbuf_tailroom(b) + : delta < 0 ? -delta <= ofpbuf_headroom(b) + : true); + + if (delta != 0) { + char *dst = (char *) b->data + delta; + memmove(dst, b->data, b->size); + b->data = dst; + } +} + /* Appends 'size' bytes of data to the tail end of 'b', reallocating and * copying its data if necessary. Returns a pointer to the first byte of the * new data, which is left uninitialized. */ diff --git a/lib/ofpbuf.h b/lib/ofpbuf.h index f945cb54c..7407d8bd3 100644 --- a/lib/ofpbuf.h +++ b/lib/ofpbuf.h @@ -94,6 +94,7 @@ void ofpbuf_prealloc_headroom(struct ofpbuf *, size_t); void ofpbuf_prealloc_tailroom(struct ofpbuf *, size_t); void ofpbuf_trim(struct ofpbuf *); void ofpbuf_padto(struct ofpbuf *, size_t); +void ofpbuf_shift(struct ofpbuf *, int); void ofpbuf_clear(struct ofpbuf *); void *ofpbuf_pull(struct ofpbuf *, size_t);