Added silc_buffer_realloc. Fixed silc_buffer_clone.
authorPekka Riikonen <priikone@silcnet.org>
Fri, 14 Jul 2000 06:08:49 +0000 (06:08 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Fri, 14 Jul 2000 06:08:49 +0000 (06:08 +0000)
lib/silccore/silcbufutil.c
lib/silccore/silcbufutil.h

index 53a676f8fe0fd5230524ba106a8816fa94aa7b48..7599868baeea4234906d7cefc0acde91c26da1b4 100644 (file)
@@ -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 */
index acbbcaf47cc1b5a7b278f2ae88437dd3ec55957f..1525375deb51371c6858258eee9628de74510396 100644 (file)
@@ -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