X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcbuffer.h;h=8d39ec81ce0650f9f9e518cd2828271882a5cee9;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=b91d6cb67ad50f79b658818bddeea43ebd5a3d6e;hpb=392c65ba9e06f633115ab2b88ebdbbb63ccc59c8;p=silc.git diff --git a/lib/silcutil/silcbuffer.h b/lib/silcutil/silcbuffer.h index b91d6cb6..8d39ec81 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 @@ -32,13 +31,13 @@ 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 @@ -112,8 +111,8 @@ */ 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