X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcbuffer.h;h=a6ca1897e2fc3444e7650aa4566874a2da303b04;hp=179c3d0e0567065917c4d402e077eef0887ad61d;hb=e5d8d3db6caa344b3d419b884556c21b15e7d123;hpb=318d79b391bf6288e3e28c840217a7097f3d0392 diff --git a/lib/silcutil/silcbuffer.h b/lib/silcutil/silcbuffer.h index 179c3d0e..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,28 +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; - - /* Method functions. */ - unsigned char *(*pull)(struct SilcBufferStruct *, unsigned int); - unsigned char *(*push)(struct SilcBufferStruct *, unsigned int); - unsigned char *(*pull_tail)(struct SilcBufferStruct *, unsigned int); - unsigned char *(*push_tail)(struct SilcBufferStruct *, unsigned int); - unsigned char *(*put)(struct SilcBufferStruct *, unsigned char *, - unsigned int); - unsigned char *(*put_head)(struct SilcBufferStruct *, unsigned char *, - unsigned int); - unsigned char *(*put_tail)(struct SilcBufferStruct *, unsigned char *, - unsigned int); -} SilcBufferObject; - -typedef SilcBufferObject *SilcBuffer; +} *SilcBuffer, SilcBufferStruct; /* Macros */ @@ -138,12 +126,52 @@ 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(uint32 len) +{ + SilcBuffer sb; + + /* Allocate new SilcBuffer */ + sb = (SilcBuffer)silc_calloc(1, sizeof(*sb)); + + /* Allocate the actual data area */ + sb->head = (unsigned char *)silc_calloc(len, sizeof(*sb->head)); + + /* Set pointers to the new buffer */ + sb->truelen = len; + sb->data = sb->head; + sb->tail = sb->head; + sb->end = sb->head + sb->truelen; + + return sb; +} + +/* Free's a SilcBuffer */ + +extern inline +void silc_buffer_free(SilcBuffer sb) +{ + if (sb) { + memset(sb->head, 'F', sb->truelen); + silc_free(sb->head); + silc_free(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 @@ -163,11 +191,13 @@ typedef SilcBufferObject *SilcBuffer; */ 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; @@ -193,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; @@ -223,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; @@ -253,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; @@ -279,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 @@ -299,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 @@ -319,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 */ -SilcBuffer silc_buffer_alloc(unsigned int len); -void silc_buffer_free(SilcBuffer sb); #ifdef SILC_DEBUG -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