updates.
[silc.git] / lib / silcutil / silcbuffer.h
index 8c822cd7354310842d4aea8e923a321d007c753d..9a64329e6c3e426c5de7c353f269367882b584da 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
@@ -128,7 +127,7 @@ typedef struct {
 
 /* Inline functions */
 
-extern inline
+static inline
 SilcBuffer silc_buffer_alloc(uint32 len)
 {
   SilcBuffer sb;
@@ -150,7 +149,7 @@ SilcBuffer silc_buffer_alloc(uint32 len)
 
 /* Free's a SilcBuffer */
 
-extern inline
+static inline
 void silc_buffer_free(SilcBuffer sb)
 {
   if (sb) {
@@ -165,7 +164,7 @@ void silc_buffer_free(SilcBuffer sb)
    can be used to set the data to static buffer without needing any
    memory allocations. The `data' will not be copied to the buffer. */
 
-extern inline
+static inline
 void silc_buffer_set(SilcBuffer sb, unsigned char *data, uint32 data_len)
 {
   sb->data = sb->head = data;
@@ -190,7 +189,7 @@ void silc_buffer_set(SilcBuffer sb, unsigned char *data, uint32 data_len)
            ^
 */
 
-extern inline 
+static inline 
 unsigned char *silc_buffer_pull(SilcBuffer sb, uint32 len)
 {
   unsigned char *old_data = sb->data;
@@ -222,7 +221,7 @@ unsigned char *silc_buffer_pull(SilcBuffer sb, uint32 len)
               ^
 */
 
-extern inline 
+static inline 
 unsigned char *silc_buffer_push(SilcBuffer sb, uint32 len)
 {
   unsigned char *old_data = sb->data;
@@ -254,7 +253,7 @@ unsigned char *silc_buffer_push(SilcBuffer sb, uint32 len)
                         ^
 */
 
-extern inline 
+static inline 
 unsigned char *silc_buffer_pull_tail(SilcBuffer sb, uint32 len)
 {
   unsigned char *old_tail = sb->tail;
@@ -286,7 +285,7 @@ unsigned char *silc_buffer_pull_tail(SilcBuffer sb, uint32 len)
                             ^
 */
 
-extern inline
+static inline
 unsigned char *silc_buffer_push_tail(SilcBuffer sb, uint32 len)
 {
   unsigned char *old_tail = sb->tail;
@@ -312,7 +311,7 @@ unsigned char *silc_buffer_push_tail(SilcBuffer sb, uint32 len)
    Puts data to the head section. 
 */
 
-extern inline
+static inline
 unsigned char *silc_buffer_put_head(SilcBuffer sb, 
                                    const unsigned char *data,
                                    uint32 len)
@@ -334,7 +333,7 @@ unsigned char *silc_buffer_put_head(SilcBuffer sb,
            Puts data to the data section.
 */
 
-extern inline
+static inline
 unsigned char *silc_buffer_put(SilcBuffer sb, 
                               const unsigned char *data,
                               uint32 len)
@@ -356,7 +355,7 @@ unsigned char *silc_buffer_put(SilcBuffer sb,
                            Puts data to the tail section.
 */
 
-extern inline
+static inline
 unsigned char *silc_buffer_put_tail(SilcBuffer sb, 
                                    const unsigned char *data,
                                    uint32 len)
@@ -367,4 +366,78 @@ unsigned char *silc_buffer_put_tail(SilcBuffer sb,
   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, uint32 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