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
 
   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
   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.
 
    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.
 
 
        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
 
        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 {
 */
 
 typedef struct {
-  uint32 truelen;
-  uint32 len;
+  SilcUInt32 truelen;
+  SilcUInt32 len;
   unsigned char *head;
   unsigned char *data;
   unsigned char *tail;
   unsigned char *head;
   unsigned char *data;
   unsigned char *tail;
@@ -129,7 +128,7 @@ typedef struct {
 /* Inline functions */
 
 static inline
 /* Inline functions */
 
 static inline
-SilcBuffer silc_buffer_alloc(uint32 len)
+SilcBuffer silc_buffer_alloc(SilcUInt32 len)
 {
   SilcBuffer sb;
 
 {
   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
    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;
 {
   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 
 */
 
 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
 {
   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;
 #endif
 
   sb->data += len;
@@ -223,7 +222,7 @@ unsigned char *silc_buffer_pull(SilcBuffer sb, uint32 len)
 */
 
 static inline 
 */
 
 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;
 
 {
   unsigned char *old_data = sb->data;
 
@@ -255,12 +254,12 @@ unsigned char *silc_buffer_push(SilcBuffer sb, uint32 len)
 */
 
 static inline 
 */
 
 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
 {
   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;
 #endif
 
   sb->tail += len;
@@ -287,7 +286,7 @@ unsigned char *silc_buffer_pull_tail(SilcBuffer sb, uint32 len)
 */
 
 static inline
 */
 
 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;
 
 {
   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,
 static inline
 unsigned char *silc_buffer_put_head(SilcBuffer sb, 
                                    const unsigned char *data,
-                                   uint32 len)
+                                   SilcUInt32 len)
 {
 #ifdef SILC_DEBUG
 {
 #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);
 }
 #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,
 static inline
 unsigned char *silc_buffer_put(SilcBuffer sb, 
                               const unsigned char *data,
-                              uint32 len)
+                              SilcUInt32 len)
 {
 #ifdef SILC_DEBUG
 {
 #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);
 }
 #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,
 static inline
 unsigned char *silc_buffer_put_tail(SilcBuffer sb, 
                                    const unsigned char *data,
-                                   uint32 len)
+                                   SilcUInt32 len)
 {
 #ifdef SILC_DEBUG
 {
 #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);
 }
 
 #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
 #endif