diff options
| author | oroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-08-01 16:53:49 +0000 |
|---|---|---|
| committer | oroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e> | 2008-08-01 16:53:49 +0000 |
| commit | 6b805af42cba72e190d94ffa6d1dd7e44d9dfb61 (patch) | |
| tree | f1ba527033730bd1d8d77a90758def337d0459c4 /src/base/buffer.c | |
| parent | bdd968b726362f55454853799ec7869cd14b9a4c (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-x | src/base/buffer.c | 127 |
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); +} |