/*
* $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.
*
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 */
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 */
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