From 482dab47a0be90a6792145dec545cf47660f988f Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Fri, 14 Jul 2000 06:08:49 +0000 Subject: [PATCH] Added silc_buffer_realloc. Fixed silc_buffer_clone. --- lib/silccore/silcbufutil.c | 27 +++++++++++++++++++++++++-- lib/silccore/silcbufutil.h | 26 ++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/lib/silccore/silcbufutil.c b/lib/silccore/silcbufutil.c index 53a676f8..7599868b 100644 --- a/lib/silccore/silcbufutil.c +++ b/lib/silccore/silcbufutil.c @@ -20,6 +20,9 @@ /* * $Id$ * $Log$ + * Revision 1.3 2000/07/14 06:08:49 priikone + * Added silc_buffer_realloc. Fixed silc_buffer_clone. + * * Revision 1.2 2000/07/05 06:06:35 priikone * Global cosmetic change. * @@ -74,11 +77,31 @@ SilcBuffer silc_buffer_clone(SilcBuffer sb) sb_new = silc_buffer_alloc(sb->truelen); silc_buffer_pull_tail(sb_new, SILC_BUFFER_END(sb_new)); silc_buffer_put(sb_new, sb->head, sb->truelen); - sb_new->data = sb_new->head + sb->len; - sb_new->tail = sb_new->head + (sb->end - sb->tail); + sb_new->data = sb_new->head + (sb->data - sb->head); + sb_new->tail = sb_new->data + sb->len; sb_new->len = sb->len; return sb_new; } +/* Reallocates buffer. Old data is saved into the new buffer. Returns + new SilcBuffer pointer. The buffer is exact clone of the old one + except that there is now more space at the end of buffer. */ + +SilcBuffer silc_buffer_realloc(SilcBuffer sb, unsigned int newsize) +{ + SilcBuffer sb_new; + + sb_new = silc_buffer_alloc(newsize); + silc_buffer_pull_tail(sb_new, SILC_BUFFER_END(sb_new)); + silc_buffer_put(sb_new, sb->head, sb->truelen); + sb_new->data = sb_new->head + (sb->data - sb->head); + sb_new->tail = sb_new->data + sb->len; + sb_new->len = sb->len; + + silc_buffer_free(sb); + + return sb_new; +} + #endif /* SILC_DEBUG */ diff --git a/lib/silccore/silcbufutil.h b/lib/silccore/silcbufutil.h index acbbcaf4..1525375d 100644 --- a/lib/silccore/silcbufutil.h +++ b/lib/silccore/silcbufutil.h @@ -64,13 +64,34 @@ SilcBuffer silc_buffer_clone(SilcBuffer sb) sb_new = silc_buffer_alloc(sb->truelen); silc_buffer_pull_tail(sb_new, SILC_BUFFER_END(sb_new)); silc_buffer_put(sb_new, sb->head, sb->truelen); - sb_new->data = sb_new->head + sb->len; - sb_new->tail = sb_new->head + (sb->end - sb->tail); + sb_new->data = sb_new->head + (sb->data - sb->head); + sb_new->tail = sb_new->data + sb->len; sb_new->len = sb->len; return sb_new; } +/* Reallocates buffer. Old data is saved into the new buffer. Returns + new SilcBuffer pointer. The buffer is exact clone of the old one + except that there is now more space at the end of buffer. */ + +extern inline +SilcBuffer silc_buffer_realloc(SilcBuffer sb, unsigned int newsize) +{ + SilcBuffer sb_new; + + sb_new = silc_buffer_alloc(newsize); + silc_buffer_pull_tail(sb_new, SILC_BUFFER_END(sb_new)); + silc_buffer_put(sb_new, sb->head, sb->truelen); + sb_new->data = sb_new->head + (sb->data - sb->head); + sb_new->tail = sb_new->data + sb->len; + sb_new->len = sb->len; + + silc_buffer_free(sb); + + return sb_new; +} + #endif /* !SILC_DEBUG */ /* Prototypes */ @@ -78,6 +99,7 @@ SilcBuffer silc_buffer_clone(SilcBuffer sb) void silc_buffer_clear(SilcBuffer sb); SilcBuffer silc_buffer_copy(SilcBuffer sb); SilcBuffer silc_buffer_clone(SilcBuffer sb); +SilcBuffer silc_buffer_realloc(SilcBuffer sb, unsigned int newsize); #endif #endif -- 2.24.0