X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcbuffer.h;h=9a64329e6c3e426c5de7c353f269367882b584da;hb=386c883d8774999c6e74d7c6c37e52e4163a4cb1;hp=8c822cd7354310842d4aea8e923a321d007c753d;hpb=b72807680a98f6ef93580c20dcb8cb1fb525b068;p=silc.git diff --git a/lib/silcutil/silcbuffer.h b/lib/silcutil/silcbuffer.h index 8c822cd7..9a64329e 100644 --- a/lib/silcutil/silcbuffer.h +++ b/lib/silcutil/silcbuffer.h @@ -1,16 +1,15 @@ /* - silcbuffer.h + silcbuffer.h - Author: Pekka Riikonen + Author: Pekka Riikonen - 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