X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcbuffer.h;h=a6ca1897e2fc3444e7650aa4566874a2da303b04;hp=d32b046baf34a8836627d7bb40e47dfd87c73cbf;hb=e5d8d3db6caa344b3d419b884556c21b15e7d123;hpb=4d35af3be05cacf69ca4bd634973cdcd25118e98 diff --git a/lib/silcutil/silcbuffer.h b/lib/silcutil/silcbuffer.h index d32b046b..a6ca1897 100644 --- a/lib/silcutil/silcbuffer.h +++ b/lib/silcutil/silcbuffer.h @@ -17,6 +17,8 @@ GNU General Public License for more details. */ +/* $Id$ */ +/* Optimized buffer managing routines. These are short inline functions. */ #ifndef SILCBUFFER_H #define SILCBUFFER_H @@ -30,13 +32,13 @@ the allocated data area. Following short description of the fields of the buffer. - unsigned int truelen; + uint32 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. - unsigned int len; + uint32 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 @@ -109,16 +111,14 @@ */ -typedef struct SilcBufferStruct { - unsigned int truelen; - unsigned int len; +typedef struct { + uint32 truelen; + uint32 len; unsigned char *head; unsigned char *data; unsigned char *tail; unsigned char *end; -} SilcBufferObject; - -typedef SilcBufferObject *SilcBuffer; +} *SilcBuffer, SilcBufferStruct; /* Macros */ @@ -126,33 +126,24 @@ typedef SilcBufferObject *SilcBuffer; the buffer area to the end of the buffer. */ #define SILC_BUFFER_END(x) ((x)->end - (x)->head) -#ifndef SILC_DEBUG /* When we are not doing debugging we use - optimized inline buffer functions. */ -/* - * Optimized buffer managing routines. These are short inline - * functions. - */ +/* Inline functions */ extern inline -SilcBuffer silc_buffer_alloc(unsigned int len) +SilcBuffer silc_buffer_alloc(uint32 len) { SilcBuffer sb; - unsigned char *data; /* Allocate new SilcBuffer */ - sb = silc_calloc(1, sizeof(*sb)); + sb = (SilcBuffer)silc_calloc(1, sizeof(*sb)); /* Allocate the actual data area */ - data = silc_calloc(len, sizeof(*data)); - memset(data, 0, len); + sb->head = (unsigned char *)silc_calloc(len, sizeof(*sb->head)); /* Set pointers to the new buffer */ sb->truelen = len; - sb->len = 0; - sb->head = data; - sb->data = data; - sb->tail = data; - sb->end = data + sb->truelen; + sb->data = sb->head; + sb->tail = sb->head; + sb->end = sb->head + sb->truelen; return sb; } @@ -169,6 +160,19 @@ void silc_buffer_free(SilcBuffer sb) } } +/* Sets the `data' and `data_len' to the buffer pointer sent as argument. + The data area is automatically set to the `data_len'. This function + 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 +void silc_buffer_set(SilcBuffer sb, unsigned char *data, uint32 data_len) +{ + sb->data = sb->head = data; + sb->tail = sb->end = data + data_len; + sb->len = sb->truelen = data_len; +} + /* Pulls current data area towards end. The length of the currently valid data area is also decremented. Returns pointer to the data area before pulling. @@ -187,11 +191,13 @@ void silc_buffer_free(SilcBuffer sb) */ extern inline -unsigned char *silc_buffer_pull(SilcBuffer sb, unsigned int len) +unsigned char *silc_buffer_pull(SilcBuffer sb, uint32 len) { unsigned char *old_data = sb->data; +#ifdef SILC_DEBUG assert(len <= (sb->tail - sb->data)); +#endif sb->data += len; sb->len -= len; @@ -217,11 +223,13 @@ unsigned char *silc_buffer_pull(SilcBuffer sb, unsigned int len) */ extern inline -unsigned char *silc_buffer_push(SilcBuffer sb, unsigned int len) +unsigned char *silc_buffer_push(SilcBuffer sb, uint32 len) { unsigned char *old_data = sb->data; +#ifdef SILC_DEBUG assert((sb->data - len) >= sb->head); +#endif sb->data -= len; sb->len += len; @@ -247,11 +255,13 @@ unsigned char *silc_buffer_push(SilcBuffer sb, unsigned int len) */ extern inline -unsigned char *silc_buffer_pull_tail(SilcBuffer sb, unsigned int len) +unsigned char *silc_buffer_pull_tail(SilcBuffer sb, uint32 len) { unsigned char *old_tail = sb->tail; +#ifdef SILC_DEBUG assert((sb->end - sb->tail) >= len); +#endif sb->tail += len; sb->len += len; @@ -277,11 +287,13 @@ unsigned char *silc_buffer_pull_tail(SilcBuffer sb, unsigned int len) */ extern inline -unsigned char *silc_buffer_push_tail(SilcBuffer sb, unsigned int len) +unsigned char *silc_buffer_push_tail(SilcBuffer sb, uint32 len) { unsigned char *old_tail = sb->tail; +#ifdef SILC_DEBUG assert((sb->tail - len) >= sb->data); +#endif sb->tail -= len; sb->len -= len; @@ -303,10 +315,12 @@ unsigned char *silc_buffer_push_tail(SilcBuffer sb, unsigned int len) extern inline unsigned char *silc_buffer_put_head(SilcBuffer sb, unsigned char *data, - unsigned int len) + uint32 len) { +#ifdef SILC_DEBUG assert((sb->data - sb->head) >= len); - return memcpy(sb->head, data, len); +#endif + return (unsigned char *)memcpy(sb->head, data, len); } /* Puts data at the start of the valid data area. Returns a pointer @@ -323,10 +337,12 @@ unsigned char *silc_buffer_put_head(SilcBuffer sb, extern inline unsigned char *silc_buffer_put(SilcBuffer sb, unsigned char *data, - unsigned int len) + uint32 len) { +#ifdef SILC_DEBUG assert((sb->tail - sb->data) >= len); - return memcpy(sb->data, data, len); +#endif + return (unsigned char *)memcpy(sb->data, data, len); } /* Puts data at the tail of the buffer. Returns pointer to the copied @@ -343,31 +359,12 @@ unsigned char *silc_buffer_put(SilcBuffer sb, extern inline unsigned char *silc_buffer_put_tail(SilcBuffer sb, unsigned char *data, - unsigned int len) + uint32 len) { - assert((sb->end - sb->tail) >= len); - return memcpy(sb->tail, data, len); -} - -#endif /* !SILC_DEBUG */ - -/* Prototypes */ #ifdef SILC_DEBUG -SilcBuffer silc_buffer_alloc(unsigned int len); -void silc_buffer_free(SilcBuffer sb); -unsigned char *silc_buffer_pull(SilcBuffer sb, unsigned int len); -unsigned char *silc_buffer_push(SilcBuffer sb, unsigned int len); -unsigned char *silc_buffer_pull_tail(SilcBuffer sb, unsigned int len); -unsigned char *silc_buffer_push_tail(SilcBuffer sb, unsigned int len); -unsigned char *silc_buffer_put_head(SilcBuffer sb, - unsigned char *data, - unsigned int len); -unsigned char *silc_buffer_put(SilcBuffer sb, - unsigned char *data, - unsigned int len); -unsigned char *silc_buffer_put_tail(SilcBuffer sb, - unsigned char *data, - unsigned int len); + assert((sb->end - sb->tail) >= len); #endif + return (unsigned char *)memcpy(sb->tail, data, len); +} #endif