Integer type name change.
[silc.git] / lib / silcutil / silcbuffer.h
index b91d6cb67ad50f79b658818bddeea43ebd5a3d6e..8d39ec81ce0650f9f9e518cd2828271882a5cee9 100644 (file)
@@ -1,16 +1,15 @@
 /*
 
-  silcbuffer.h
+  silcbuffer.h 
 
-  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+  Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 1998 - 2000 Pekka Riikonen
+  Copyright (C) 1998 - 2002 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
-  the Free Software Foundation; either version 2 of the License, or
-  (at your option) any later version.
-  
+  the Free Software Foundation; version 2 of the License.
+
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    the allocated data area. Following short description of the fields
    of the buffer.
 
-   uint32 truelen;
+   SilcUInt32 truelen;
 
        True length of the buffer. This is set at the allocation of the
        buffer and it should not be touched after that. This field should
        be considered read-only.
 
-   uint32 len;
+   SilcUInt32 len;
 
        Length of the currently valid data area. Tells the length of the 
        data at the buffer. This is set to zero at the allocation of the
 */
 
 typedef struct {
-  uint32 truelen;
-  uint32 len;
+  SilcUInt32 truelen;
+  SilcUInt32 len;
   unsigned char *head;
   unsigned char *data;
   unsigned char *tail;
@@ -129,7 +128,7 @@ typedef struct {
 /* Inline functions */
 
 static inline
-SilcBuffer silc_buffer_alloc(uint32 len)
+SilcBuffer silc_buffer_alloc(SilcUInt32 len)
 {
   SilcBuffer sb;
 
@@ -166,7 +165,7 @@ void silc_buffer_free(SilcBuffer sb)
    memory allocations. The `data' will not be copied to the buffer. */
 
 static inline
-void silc_buffer_set(SilcBuffer sb, unsigned char *data, uint32 data_len)
+void silc_buffer_set(SilcBuffer sb, unsigned char *data, SilcUInt32 data_len)
 {
   sb->data = sb->head = data;
   sb->tail = sb->end = data + data_len;
@@ -191,12 +190,12 @@ void silc_buffer_set(SilcBuffer sb, unsigned char *data, uint32 data_len)
 */
 
 static inline 
-unsigned char *silc_buffer_pull(SilcBuffer sb, uint32 len)
+unsigned char *silc_buffer_pull(SilcBuffer sb, SilcUInt32 len)
 {
   unsigned char *old_data = sb->data;
 
 #ifdef SILC_DEBUG
-  assert(len <= (uint32)(sb->tail - sb->data));
+  assert(len <= (SilcUInt32)(sb->tail - sb->data));
 #endif
 
   sb->data += len;
@@ -223,7 +222,7 @@ unsigned char *silc_buffer_pull(SilcBuffer sb, uint32 len)
 */
 
 static inline 
-unsigned char *silc_buffer_push(SilcBuffer sb, uint32 len)
+unsigned char *silc_buffer_push(SilcBuffer sb, SilcUInt32 len)
 {
   unsigned char *old_data = sb->data;
 
@@ -255,12 +254,12 @@ unsigned char *silc_buffer_push(SilcBuffer sb, uint32 len)
 */
 
 static inline 
-unsigned char *silc_buffer_pull_tail(SilcBuffer sb, uint32 len)
+unsigned char *silc_buffer_pull_tail(SilcBuffer sb, SilcUInt32 len)
 {
   unsigned char *old_tail = sb->tail;
 
 #ifdef SILC_DEBUG
-  assert((uint32)(sb->end - sb->tail) >= len);
+  assert((SilcUInt32)(sb->end - sb->tail) >= len);
 #endif
 
   sb->tail += len;
@@ -287,7 +286,7 @@ unsigned char *silc_buffer_pull_tail(SilcBuffer sb, uint32 len)
 */
 
 static inline
-unsigned char *silc_buffer_push_tail(SilcBuffer sb, uint32 len)
+unsigned char *silc_buffer_push_tail(SilcBuffer sb, SilcUInt32 len)
 {
   unsigned char *old_tail = sb->tail;
 
@@ -315,10 +314,10 @@ unsigned char *silc_buffer_push_tail(SilcBuffer sb, uint32 len)
 static inline
 unsigned char *silc_buffer_put_head(SilcBuffer sb, 
                                    const unsigned char *data,
-                                   uint32 len)
+                                   SilcUInt32 len)
 {
 #ifdef SILC_DEBUG
-  assert((uint32)(sb->data - sb->head) >= len);
+  assert((SilcUInt32)(sb->data - sb->head) >= len);
 #endif
   return (unsigned char *)memcpy(sb->head, data, len);
 }
@@ -337,10 +336,10 @@ unsigned char *silc_buffer_put_head(SilcBuffer sb,
 static inline
 unsigned char *silc_buffer_put(SilcBuffer sb, 
                               const unsigned char *data,
-                              uint32 len)
+                              SilcUInt32 len)
 {
 #ifdef SILC_DEBUG
-  assert((uint32)(sb->tail - sb->data) >= len);
+  assert((SilcUInt32)(sb->tail - sb->data) >= len);
 #endif
   return (unsigned char *)memcpy(sb->data, data, len);
 }
@@ -359,12 +358,86 @@ unsigned char *silc_buffer_put(SilcBuffer sb,
 static inline
 unsigned char *silc_buffer_put_tail(SilcBuffer sb, 
                                    const unsigned char *data,
-                                   uint32 len)
+                                   SilcUInt32 len)
 {
 #ifdef SILC_DEBUG
-  assert((uint32)(sb->end - sb->tail) >= len);
+  assert((SilcUInt32)(sb->end - sb->tail) >= len);
 #endif
   return (unsigned char *)memcpy(sb->tail, data, len);
 }
 
+/* Clears and initialiazes the buffer to the state as if it was just
+   allocated by silc_buffer_alloc. */
+
+static inline
+void silc_buffer_clear(SilcBuffer sb)
+{
+  memset(sb->head, 0, sb->truelen);
+  sb->data = sb->head;
+  sb->tail = sb->head;
+  sb->len = 0;
+}
+
+/* Generates copy of a SilcBuffer. This copies everything inside the
+   currently valid data area, nothing more. Use silc_buffer_clone to
+   copy entire buffer. */
+
+static inline
+SilcBuffer silc_buffer_copy(SilcBuffer sb)
+{
+  SilcBuffer sb_new;
+
+  sb_new = silc_buffer_alloc(sb->len);
+  silc_buffer_pull_tail(sb_new, SILC_BUFFER_END(sb_new));
+  silc_buffer_put(sb_new, sb->data, sb->len);
+
+  return sb_new;
+}
+
+/* Clones SilcBuffer. This generates new SilcBuffer and copies
+   everything from the source buffer. The result is exact clone of
+   the original buffer. */
+
+static inline
+SilcBuffer silc_buffer_clone(SilcBuffer sb)
+{
+  SilcBuffer sb_new;
+
+  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->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. */
+
+static inline
+SilcBuffer silc_buffer_realloc(SilcBuffer sb, SilcUInt32 newsize)
+{
+  SilcBuffer sb_new;
+
+  if (!sb)
+    return silc_buffer_alloc(newsize);
+
+  if (newsize <= sb->truelen)
+    return sb;
+
+  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