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
Currently valid data area is considered to be the main data area in
the buffer. However, the entire buffer is of course valid data and can
be used as such. Usually head section of the buffer includes different
- kind of headers or similiar. Data section includes the main data of
+ kind of headers or similar. Data section includes the main data of
the buffer. Tail section can be seen as a reserve space of the data
section. Tail section can be pulled towards end thus the data section
becomes larger.
*/
-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 */
+
+static 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 */
+
+static 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. */
+
+static 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)
+static inline
+unsigned char *silc_buffer_pull(SilcBuffer sb, uint32 len)
{
unsigned char *old_data = sb->data;
- assert(len <= (sb->tail - sb->data));
+#ifdef SILC_DEBUG
+ assert(len <= (uint32)(sb->tail - sb->data));
+#endif
sb->data += len;
sb->len -= len;
^
*/
-extern inline
-unsigned char *silc_buffer_push(SilcBuffer sb, unsigned int len)
+static inline
+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)
+static inline
+unsigned char *silc_buffer_pull_tail(SilcBuffer sb, uint32 len)
{
unsigned char *old_tail = sb->tail;
- assert((sb->end - sb->tail) >= len);
+#ifdef SILC_DEBUG
+ assert((uint32)(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)
+static inline
+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;
Puts data to the head section.
*/
-extern inline
+static inline
unsigned char *silc_buffer_put_head(SilcBuffer sb,
- unsigned char *data,
- unsigned int len)
+ const unsigned char *data,
+ uint32 len)
{
- assert((sb->data - sb->head) >= len);
- return memcpy(sb->head, data, len);
+#ifdef SILC_DEBUG
+ assert((uint32)(sb->data - sb->head) >= len);
+#endif
+ return (unsigned char *)memcpy(sb->head, data, len);
}
/* Puts data at the start of the valid data area. Returns a pointer
Puts data to the data section.
*/
-extern inline
+static inline
unsigned char *silc_buffer_put(SilcBuffer sb,
- unsigned char *data,
- unsigned int len)
+ const unsigned char *data,
+ uint32 len)
{
- assert((sb->tail - sb->data) >= len);
- return memcpy(sb->data, data, len);
+#ifdef SILC_DEBUG
+ assert((uint32)(sb->tail - sb->data) >= len);
+#endif
+ return (unsigned char *)memcpy(sb->data, data, len);
}
/* Puts data at the tail of the buffer. Returns pointer to the copied
Puts data to the tail section.
*/
-extern inline
+static inline
unsigned char *silc_buffer_put_tail(SilcBuffer sb,
- unsigned char *data,
- unsigned int len)
+ const unsigned char *data,
+ 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((uint32)(sb->end - sb->tail) >= len);
#endif
+ return (unsigned char *)memcpy(sb->tail, data, len);
+}
#endif