GNU General Public License for more details.
*/
+/* $Id$ */
+/* Optimized buffer managing routines. These are short inline functions. */
#ifndef SILCBUFFER_H
#define SILCBUFFER_H
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
*/
-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 */
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
*/
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;
*/
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;
*/
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;
*/
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;
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
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
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