Code auditing weekend results and fixes committing.
[silc.git] / lib / silcutil / silcbuffer.h
index 179c3d0e0567065917c4d402e077eef0887ad61d..6060e667658818d34731eb336a1b9308a123ae45 100644 (file)
@@ -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
@@ -116,18 +118,6 @@ typedef struct SilcBufferStruct {
   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;
@@ -138,12 +128,39 @@ 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 sb;
+
+  /* Allocate new SilcBuffer */
+  sb = silc_calloc(1, sizeof(*sb));
+
+  /* Allocate the actual data area */
+  sb->head = 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);
+  }
+}
 
 /* Pulls current data area towards end. The length of the currently
    valid data area is also decremented. Returns pointer to the data
@@ -167,7 +184,9 @@ unsigned char *silc_buffer_pull(SilcBuffer sb, unsigned int len)
 {
   unsigned char *old_data = sb->data;
 
+#ifdef SILC_DEBUG
   assert(len <= (sb->tail - sb->data));
+#endif
 
   sb->data += len;
   sb->len -= len;
@@ -197,7 +216,9 @@ unsigned char *silc_buffer_push(SilcBuffer sb, unsigned int len)
 {
   unsigned char *old_data = sb->data;
 
+#ifdef SILC_DEBUG
   assert((sb->data - len) >= sb->head);
+#endif
 
   sb->data -= len;
   sb->len += len;
@@ -227,7 +248,9 @@ unsigned char *silc_buffer_pull_tail(SilcBuffer sb, unsigned int len)
 {
   unsigned char *old_tail = sb->tail;
 
+#ifdef SILC_DEBUG
   assert((sb->end - sb->tail) >= len);
+#endif
 
   sb->tail += len;
   sb->len += len;
@@ -257,7 +280,9 @@ unsigned char *silc_buffer_push_tail(SilcBuffer sb, unsigned int len)
 {
   unsigned char *old_tail = sb->tail;
 
+#ifdef SILC_DEBUG
   assert((sb->tail - len) >= sb->data);
+#endif
 
   sb->tail -= len;
   sb->len -= len;
@@ -281,7 +306,9 @@ unsigned char *silc_buffer_put_head(SilcBuffer sb,
                                    unsigned char *data,
                                    unsigned int len)
 {
+#ifdef SILC_DEBUG
   assert((sb->data - sb->head) >= len);
+#endif
   return memcpy(sb->head, data, len);
 }
 
@@ -301,7 +328,9 @@ unsigned char *silc_buffer_put(SilcBuffer sb,
                               unsigned char *data,
                               unsigned int len)
 {
+#ifdef SILC_DEBUG
   assert((sb->tail - sb->data) >= len);
+#endif
   return memcpy(sb->data, data, len);
 }
 
@@ -321,29 +350,10 @@ unsigned char *silc_buffer_put_tail(SilcBuffer sb,
                                    unsigned char *data,
                                    unsigned int len)
 {
+#ifdef SILC_DEBUG
   assert((sb->end - sb->tail) >= len);
+#endif
   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);
-#endif
-
 #endif