updates.
[silc.git] / lib / silcutil / silcbuffer.h
index 8658e608a4f8c788f65e6888086b856d8d60bef2..a6ca1897e2fc3444e7650aa4566874a2da303b04 100644 (file)
@@ -17,6 +17,8 @@
   GNU General Public License for more details.
 
 */
   GNU General Public License for more details.
 
 */
+/* $Id$ */
+/* Optimized buffer managing routines.  These are short inline functions. */
 
 #ifndef SILCBUFFER_H
 #define SILCBUFFER_H
 
 #ifndef SILCBUFFER_H
 #define SILCBUFFER_H
    the allocated data area. Following short description of the fields
    of the buffer.
 
    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.
 
 
        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
 
        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;
   unsigned char *head;
   unsigned char *data;
   unsigned char *tail;
   unsigned char *end;
-} SilcBufferObject;
-
-typedef SilcBufferObject *SilcBuffer;
+} *SilcBuffer, SilcBufferStruct;
 
 /* Macros */
 
 
 /* Macros */
 
@@ -126,32 +126,24 @@ typedef SilcBufferObject *SilcBuffer;
    the buffer area to the end of the buffer. */
 #define SILC_BUFFER_END(x) ((x)->end - (x)->head)
 
    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
 
 extern inline
-SilcBuffer silc_buffer_alloc(unsigned int len)
+SilcBuffer silc_buffer_alloc(uint32 len)
 {
   SilcBuffer sb;
 {
   SilcBuffer sb;
-  unsigned char *data;
 
   /* Allocate new SilcBuffer */
 
   /* Allocate new SilcBuffer */
-  sb = silc_calloc(1, sizeof(*sb));
+  sb = (SilcBuffer)silc_calloc(1, sizeof(*sb));
 
   /* Allocate the actual data area */
 
   /* Allocate the actual data area */
-  data = silc_calloc(len, sizeof(*data));
+  sb->head = (unsigned char *)silc_calloc(len, sizeof(*sb->head));
 
   /* Set pointers to the new buffer */
   sb->truelen = len;
 
   /* 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;
 }
 
   return sb;
 }
@@ -168,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. 
 /* 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. 
@@ -186,11 +191,13 @@ void silc_buffer_free(SilcBuffer sb)
 */
 
 extern inline 
 */
 
 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;
 
 {
   unsigned char *old_data = sb->data;
 
+#ifdef SILC_DEBUG
   assert(len <= (sb->tail - sb->data));
   assert(len <= (sb->tail - sb->data));
+#endif
 
   sb->data += len;
   sb->len -= len;
 
   sb->data += len;
   sb->len -= len;
@@ -216,11 +223,13 @@ unsigned char *silc_buffer_pull(SilcBuffer sb, unsigned int len)
 */
 
 extern inline 
 */
 
 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;
 
 {
   unsigned char *old_data = sb->data;
 
+#ifdef SILC_DEBUG
   assert((sb->data - len) >= sb->head);
   assert((sb->data - len) >= sb->head);
+#endif
 
   sb->data -= len;
   sb->len += len;
 
   sb->data -= len;
   sb->len += len;
@@ -246,11 +255,13 @@ unsigned char *silc_buffer_push(SilcBuffer sb, unsigned int len)
 */
 
 extern inline 
 */
 
 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;
 
 {
   unsigned char *old_tail = sb->tail;
 
+#ifdef SILC_DEBUG
   assert((sb->end - sb->tail) >= len);
   assert((sb->end - sb->tail) >= len);
+#endif
 
   sb->tail += len;
   sb->len += len;
 
   sb->tail += len;
   sb->len += len;
@@ -276,11 +287,13 @@ unsigned char *silc_buffer_pull_tail(SilcBuffer sb, unsigned int len)
 */
 
 extern inline
 */
 
 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;
 
 {
   unsigned char *old_tail = sb->tail;
 
+#ifdef SILC_DEBUG
   assert((sb->tail - len) >= sb->data);
   assert((sb->tail - len) >= sb->data);
+#endif
 
   sb->tail -= len;
   sb->len -= len;
 
   sb->tail -= len;
   sb->len -= len;
@@ -302,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,
 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);
   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 
 }
 
 /* Puts data at the start of the valid data area. Returns a pointer 
@@ -322,10 +337,12 @@ unsigned char *silc_buffer_put_head(SilcBuffer sb,
 extern inline
 unsigned char *silc_buffer_put(SilcBuffer sb, 
                               unsigned char *data,
 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);
   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
 }
 
 /* Puts data at the tail of the buffer. Returns pointer to the copied
@@ -342,31 +359,12 @@ unsigned char *silc_buffer_put(SilcBuffer sb,
 extern inline
 unsigned char *silc_buffer_put_tail(SilcBuffer sb, 
                                    unsigned char *data,
 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
 #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
 #endif
+  return (unsigned char *)memcpy(sb->tail, data, len);
+}
 
 #endif
 
 #endif