summaryrefslogtreecommitdiff
path: root/src/base/buffer.c
diff options
context:
space:
mode:
authororoborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-08-01 16:53:49 +0000
committeroroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-08-01 16:53:49 +0000
commit6b805af42cba72e190d94ffa6d1dd7e44d9dfb61 (patch)
treef1ba527033730bd1d8d77a90758def337d0459c4 /src/base/buffer.c
parentbdd968b726362f55454853799ec7869cd14b9a4c (diff)
- experimentalna podpora TCP
- implicitne sa to kompiluje s UDP ( makro SUPPORT_UDP v server.c a client.c ) - ak che niekto skusat TCP, nech si zakomentuje makro SUPPORT_UDP v server.c a client.c a prida makro SUPPORT_TCP - docasna nefunkcnost IPv6 git-svn-id: http://opensvn.csie.org/tuxanci_ng@186 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src/base/buffer.c')
-rwxr-xr-xsrc/base/buffer.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/src/base/buffer.c b/src/base/buffer.c
new file mode 100755
index 0000000..13d3225
--- /dev/null
+++ b/src/base/buffer.c
@@ -0,0 +1,127 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "buffer.h"
+
+buffer_t * newBuffer(int n)
+{
+ buffer_t *new;
+
+ new = malloc(sizeof(buffer_t));
+ memset(new, 0, sizeof(buffer_t));
+ new->alloc = n;
+ new->data = malloc(n);
+ memset(new->data , 0, n);
+
+ return new;
+}
+
+int addBuffer(buffer_t *p, char *data, int len)
+{
+ assert( p != NULL );
+ assert( data != NULL );
+ assert( len >= 0 );
+
+ if( p->size + len <= p->alloc )
+ {
+ memcpy(p->data + p->size, data, len);
+ p->size += len;
+ return 0;
+ }
+
+ return -1;
+}
+
+int cutBuffer(buffer_t *p, int len)
+{
+ assert( p != NULL );
+ assert( len >= 0 );
+
+ if( p->size - len >= 0 )
+ {
+ memmove(p->data, p->data + len, p->size - len);
+ p->size -= len;
+ return 0;
+ }
+
+ return -1;
+}
+
+int getBufferCount(buffer_t *p)
+{
+ char *begin;
+ char *end;
+ int count;
+ int size;
+
+ assert( p != NULL );
+
+ count = 0;
+ begin = p->data;
+ size = p->size;
+
+ while( ( end = memchr(begin, '\n', size) ) != NULL )
+ {
+ count++;
+ size -= ( (end+1) - begin);
+ begin = end+1;
+ }
+
+ //printf("count = %d\n", count);
+ //printf("data = %s\n", p->data);
+ return count;
+}
+
+int getBufferLine(buffer_t *p, char *line, int len)
+{
+ char *end;
+ int ret_len;
+
+ assert( p != NULL );
+ assert( line != NULL );
+ assert( len >= 0 );
+
+ end = NULL;
+
+ end = memchr(p->data, '\n', p->size);
+
+ if( end == NULL ) return -1;
+
+ ret_len = (int) (end - p->data)+1;
+ if( ret_len > len-1 ) ret_len = len-1;
+
+ memset(line, 0, len);
+ memcpy(line, p->data, ret_len);
+
+ cutBuffer(p, ret_len);
+
+ return ret_len;
+}
+
+int getBufferData(buffer_t *p, char *line, int len)
+{
+ assert( p != NULL );
+ assert( line != NULL );
+ assert( len >= 0 );
+
+ if( p->size < len )
+ {
+ len = p->size;
+ }
+
+ memcpy(line, p->data, len);
+ cutBuffer(p, len);
+
+ return len;
+}
+
+void destroyBuffer(buffer_t *p)
+{
+ assert( p != NULL );
+
+ if( p->data != NULL )free(p->data);
+ free(p);
+}