diff options
Diffstat (limited to 'libbuf')
-rw-r--r-- | libbuf/Makefile | 29 | ||||
-rw-r--r-- | libbuf/buf.c | 534 | ||||
-rw-r--r-- | libbuf/buf.h | 89 | ||||
-rw-r--r-- | libbuf/buf_misc.c | 272 | ||||
-rw-r--r-- | libbuf/buf_misc.h | 64 |
5 files changed, 988 insertions, 0 deletions
diff --git a/libbuf/Makefile b/libbuf/Makefile new file mode 100644 index 0000000..ed2f1de --- /dev/null +++ b/libbuf/Makefile @@ -0,0 +1,29 @@ +CPP=g++ +CC=gcc +LD=ld +CFLAGS=-fPIC -g3 -Wall -Wwrite-strings -fno-exceptions -fno-unwind-tables -fpermissive +CPPFLAGS=-fPIC -g3 -Wall -Wwrite-strings -fpermissive -fno-rtti -fno-exceptions -fno-unwind-tables + +make: + $(CPP) $(CPPFLAGS) -c buf.c + $(CPP) $(CPPFLAGS) -c buf_misc.c + #$(CPP) $(CFLAGS) -c buf_sys.c + #$(CC) $(CFLAGS) -fPIC -lc -ldl buf_sys.o buf_misc.o buf.o -shared -o libbuf.so + $(CC) $(CFLAGS) -fPIC -lc -ldl buf.o buf_misc.o -shared -o libbuf.so + $(LD) -r buf.o buf_misc.o -o libbuf.o + +t: buf.c buf_misc.c buf_sys.c + $(CPP) $(CPPFLAGS) test.c -c + $(CPP) $(CPPFLAGS) test_line.c -c + $(CC) $(CFLAGS) buf.o test.o -o test + #$(CC) $(CFLAGS) buf.o buf_misc.o buf_sys.o test_circ.c -o test_circ + #$(CC) $(CFLAGS) buf.o buf_misc.o buf_sys.o test_circ.c -o test_sys + $(CC) $(CFLAGS) buf.o buf_misc.o test_line.o -o test_line + +leak: + valgrind --leak-check=full --track-origins=yes --log-file=log.txt ./test + +clean: + rm -rf *.so *.o test test_circ test_sys + + diff --git a/libbuf/buf.c b/libbuf/buf.c new file mode 100644 index 0000000..83457e9 --- /dev/null +++ b/libbuf/buf.c @@ -0,0 +1,534 @@ +#include "buf.h" + +/* +bbuf* bbuf_new(int size) +{ + bbuf *ret = NULL; + ret = malloc(sizeof(bbuf)); + if (!ret) + { + return NULL; + } + ret->buf = malloc(size); + if (!ret->buf) + { + free(ret); + return NULL; + } + ret->buf_size = size; + ret->size = 0; + return ret; +} + +//set buffer value +int bbuf_set(bbuf *a, char *val, int size) +{ + if (!a) + return -1; + + if (!a->buf) + return -1; + + if (size<0) + return -1; + + if (size > a->buf_size) + { + a->size = a->buf_size; + } else + { + a->size = size; + } + memcpy(a->buf, val, a->size); + + return a->size; +} + + +//get copy of buffer +bbuf *bbuf_copy(bbuf *buf) +{ + bbuf *ret = NULL; + + if (!buf) + { + return NULL; + } + + ret = malloc(sizeof(bbuf)); + memcpy(ret, buf, sizeof(bbuf)); + ret->buf = malloc(buf->buf_size); + if (!ret->buf) + { + free(ret); + return NULL; + } + memcpy(ret->buf, buf->buf, buf->buf_size); + ret->size = buf->size; + ret->buf_size = buf->buf_size; + + return ret; +} + + +//get buffer from buffer, mapped pointer, plz dont modify +int bbuf_get(bbuf *buf, char **val, int *size) +{ + if (!buf) + { + return -1; + } + + if (!val) + { + return -1; + } + + *size = buf->size; + *val = buf->buf; + + return 0; +} + + +//resize buffer +int bbuf_realloc(bbuf *buf, int size) +{ + int ret = -1; + char *ptr=NULL; + if (!buf) + return -1; + if (size < 0) + return -1; + if (buf->buf_size == size) + return size; + + ret = buf->buf_size; + ptr = realloc(buf->buf, size); + if (ptr != NULL) + { + buf->buf = ptr; + ret = size; + } + + return ret; +} + +int bbuf_reduce(bbuf *buf) +{ + printf("Not implemented\n"); + return -1; +} + + +//increase buffer for size +int bbuf_inc(bbuf *a, char *b, int size) +{ + printf("Not implemented\n"); + return -1; +} + + +//decrease buffer for size +int bbuf_dec(bbuf *a, char *b, int size) +{ + printf("Not implemented\n"); + return -1; +} + +int bbuf_set_max(bbuf *buf) +{ + if (buf == NULL) + { + return -1; + } + + buf->buf_size = buf->size; + return 0; +} + + +int bbuf_memset(bbuf *buf, char c) +{ + if (buf == NULL) + { + return -1; + } + memset(buf->buf, c, buf->size); + return 0; +} + +int bbuf_concat(bbuf *a, bbuf *b) +{ + printf("Not implemented\n"); + return -1; +} + +int bbuf_size(bbuf *a) +{ + if (a == NULL) + { + return -1; + } + + //return used size + return a->buf_size; +} + +int bbuf_print(bbuf *a) +{ + int i; + + if (NULL == a) + { + return -1; + } + + for (i=0;i<a->buf_size;i++) + { + char ch = a->buf[i]; + if (isalpha(ch)) + { + printf("%c",ch); + } else + { + printf("."); + } + } + + return 0; +} + +//free buffer +void bbuf_free(bbuf *buf) +{ + if (buf == NULL) + { + return; + } + if (buf->buf != NULL) + { + memset(buf->buf, 0, buf->buf_size); + free(buf->buf); + buf->buf = NULL; + memset(buf, 0, sizeof(bbuf)); + free(buf); + buf = NULL; + } +} +*/ + +Buf::Buf(int size) +{ + this->buf = (char *)malloc(size); + if (!this->buf) + { + //put error here + } + + this->buf_size = size; + this->cur_size = 0; +} + +Buf::~Buf() +{ + if (this->buf != NULL) + { + ::memset(this->buf, 0, this->buf_size); + free(this->buf); + this->buf = NULL; + } +} + +int Buf::set(char *val, int size) +{ + if (!val) + { + return -1; + } + + if (size<0) + { + return -1; + } + + if (size > this->buf_size) + { + this->cur_size = this->buf_size; + } else + { + this->cur_size = size; + } + memcpy(this->buf, val, this->cur_size); + + return this->cur_size; +} + +int Buf::set(char *val) +{ + int size = strlen(val); + if (size > this->buf_size) + { + this->cur_size = this->buf_size; + } else + { + this->cur_size = size; + } + memcpy(this->buf, val, this->cur_size); + return this->cur_size; +} + +Buf* Buf::copy() +{ + Buf *ret = new Buf(this->buf_size); + char *data=NULL; + int data_size=0; + + this->get_ptr(&data, &data_size); + ret->set(data, data_size); + data=NULL; + return ret; +} + +int Buf::get_ptr(char **val, int *size) +{ + if (!val) + { + return -1; + } + + *val = this->buf; + *size = this->cur_size; + + return 0; +} + +int Buf::realloc(int size) +{ + char *ptr=NULL; + if (size < 0) + { + return -1; + } + if (this->buf_size == size) + { + return this->buf_size; + } + + ptr = (char *)::realloc(this->buf, size); + if (ptr != NULL) + { + this->buf = ptr; + this->buf_size = size; + } + + return this->buf_size; +} + +int Buf::reduce() +{ + printf("Not implemented\n"); + return -1; +} + +int Buf::inc(int size) +{ + printf("Not implemented\n"); + return -1; +} + +int Buf::dec(int size) +{ + printf("Not implemented\n"); + return -1; +} + +int Buf::set_max() +{ + this->cur_size = this->buf_size; + return 0; +} + +int Buf::memset(char c) +{ + ::memset(this->buf, c, this->cur_size); + return 0; +} + +int Buf::concat(Buf *b) +{ + + int i=0,j=this->cur_size; + int get_size=b->cursize(); + + for (i=0;i<get_size;i++) + { + char tc; + int r = b->getc(i,&tc); + if (r==0) + { + this->pushc(tc); + if (j+1>=this->buf_size) + { + break; + } + } + } + + return i; +} + +int Buf::size() +{ + return this->buf_size; +} + +int Buf::cursize() +{ + return this->cur_size; +} + +int Buf::print() +{ + int i; + + for (i=0;i<this->buf_size;i++) + { + char ch = this->buf[i]; + if (isalpha(ch)) + { + printf("%c",ch); + } else + { + printf("."); + } + } + + return 0; +} + +int Buf::setc(int idx, char c) +{ + if ((idx < 0) || (idx > this->cur_size)) + { + return -1; + } + + buf[idx] = c; + + return 0; +} + +int Buf::pushc(char c) +{ + if (this->cur_size<this->buf_size) + { + this->buf[this->cur_size] = c; + this->cur_size+=1; + return 0; + } + return -1; +} + +int Buf::getc(int idx, char *c) +{ + if ((idx < 0) || (idx > this->cur_size)) + { + return -1; + } + + *c = buf[idx]; + + return 0; +} + +int Buf::findc(char c, int *idx) +{ + int i=0; + + for (i=0;i<this->cur_size;i++) + { + if (buf[i] == c) + { + //found + *idx = i; + return 1; + } + } + + //not found + return 0; +} + +int Buf::popsubstring(int sz, char **val, int *size) +{ + int ret=-1; + + if (sz>this->cur_size) + { + sz = this->cur_size; + } + + *val = (char *)malloc(sz); + memcpy(*val,buf,sz); + *size = sz; + shiftleft(sz); + ret = sz; + + return ret; +} + +int Buf::shiftleft(int n) +{ + int i=0; + + if ((n>this->cur_size) || (n<0)) + { + //cant shift + return -1; + } + int mvsz = cur_size-n; + for (i=0;i<mvsz;i++) + { + char c = buf[n+i]; + //printf("%c",c); + buf[i] = c; + } + this->cur_size -= n; + + //amount of shifted bytes + return n; +} + +int Buf::zero() +{ + this->memset(0); + return 0; +} + +bool Buf::isempty() +{ + if (this->buf == NULL) + return true; + if (this->cur_size <= 0) + return true; + if (this->buf_size <= 0) + return true; + return true; +} + +int Buf::empty() +{ + this->cur_size = 0; + return 0; +} + +int Buf::set_size(int size) +{ + if (size < 0) + return -1; + if (size > this->buf_size) + return -1; + this->cur_size = size; + return 0; +}
\ No newline at end of file diff --git a/libbuf/buf.h b/libbuf/buf.h new file mode 100644 index 0000000..ba5c7e7 --- /dev/null +++ b/libbuf/buf.h @@ -0,0 +1,89 @@ +#ifndef __BUF_H +#define __BUF_H + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include <unistd.h> + +/* +typedef struct bbuf { + int size; //total size + int buf_size; //used size + char *buf; +} bbuf; +*/ + +//operations on plain buffers also operations on bufer to buffer should be +//supoorted + +/* +//create new buffer without content +bbuf* bbuf_new(int size); + +//set buffer value +int bbuf_set(bbuf *a, char *val, int size); +//get copy of buffer +bbuf *bbuf_copy(bbuf *buf); +//get buffer from buffer +int bbuf_get(bbuf *buf, char **val, int *size); +//resize buffer +int bbuf_realloc(bbuf *buf, int size); +//set to minimal size +int bbuf_reduce(bbuf *buf); +//increase buffer for size +int bbuf_inc(bbuf *a, char *b, int size); +//decrease buffer for size +int bbuf_dec(bbuf *a, char *b, int size); +//free buffer +int bbuf_set_max(bbuf *buf); +int bbuf_memset(bbuf *buf, char c); + +int bbuf_concat(bbuf *a, bbuf *b); + +int bbuf_size(bbuf *a); + +int bbuf_print(bbuf *a); + +void bbuf_free(bbuf *buf); +*/ + +class Buf +{ +private: + int cur_size; + int buf_size; + char *buf; +public: + Buf(int size); + ~Buf(); + + int set(char *val, int size); + int set(char *val); + Buf* copy(); + int get_ptr(char **val, int *size); + int realloc(int size); + int reduce(); + int inc(int size); + int dec(int size); + + int set_max(); + int memset(char c); + int concat(Buf *b); + int size(); + int cursize(); + int print(); + int setc(int idx, char c); + int pushc(char c); + int getc(int idx, char *c); + int findc(char c, int *idx); + int popsubstring(int sz, char **val, int *size); + int shiftleft(int n); + int zero(); + bool isempty(); + int empty(); + int set_size(int size); +}; + +#endif
\ No newline at end of file diff --git a/libbuf/buf_misc.c b/libbuf/buf_misc.c new file mode 100644 index 0000000..386be72 --- /dev/null +++ b/libbuf/buf_misc.c @@ -0,0 +1,272 @@ +#include "buf_misc.h" + +/* +int bbuf_line_new(bbuf_line *buf, int size) +{ + bbuf *newbuf=NULL; + bbuf_line *bline=NULL; + + newbuf = bbuf_new(size); + if (newbuf == NULL) + { + + return -1; + } + + bline = malloc(sizeof(bbuf_line)); + if (bline == NULL) + { + return -1; + } + + memset(bline, 0, sizeof(bbuf_line)); + + bline->buf = newbuf; + + buf = bline; + + return 0; +} + +int bbuf_line_pattern(bbuf_line *buf, char *patt, int size) +{ + return -1; +} + +int bbuf_line_add(bbuf_line *buf_line, bbuf *new_data) +{ + + return -1; +} + + +int bbuf_line_get_line(bbuf_line *buf_line, bbuf *line) +{ + + return -1; +} + + +int bbuf_line_free(bbuf_line *buf) +{ + + return -1; +} + +*/ + +BufLine::BufLine(int size) +{ + buf = new Buf(size); + sep=0x0; + memset(pattern,0,BUF_PATTER_SIZE); +} + +BufLine::~BufLine() +{ + delete buf; +} + +int BufLine::setpattern(char *pattern) +{ + return -1; +} + +int BufLine::setseperator(char s) +{ + this->sep = s; + return 0; +} + +int BufLine::add(char *string, int size) +{ + return -1; +} + +int BufLine::add(Buf *newdata) +{ + buf->concat(newdata); + return 0; +} + +int BufLine::pop_line(char **val, int *size) +{ + int idx; + if (1 == buf->findc('\n',&idx)) + { + buf->popsubstring(idx,val,size); + buf->shiftleft(1);//remove seperator character + return 0; + } + return -1; +} + +int BufLine::print() +{ + buf->print(); + return -1; +} + +/* +RETURN_IF_PATTERN_FOUND(*detect_pattern)(char *INPUT_BUFFER, int INPUT_SIZE) +*/ +int BufLine::pop_pattern(int (*detect_pattern)(char *, int, int*), char **val, int *size) +{ + int detected=0; + + char *buf; + int buf_size = 0; + int data_size = 0; + + this->buf->get_ptr(&buf, &buf_size); + if ((detected = detect_pattern(buf, buf_size, &data_size)) != 1) + { + return -1; + } + + this->buf->popsubstring(data_size, val, size); + + return 0; +} + +/* +int bbuf_circ_new(bbuf_circ **circ, int size) +{ + bbuf *buf = NULL; + bbuf_circ *cbuf = NULL; + + buf = bbuf_new(size); + if (buf == NULL) + { + return -1; + } + + cbuf = malloc(sizeof(bbuf_circ)); + if (cbuf == NULL) + { + return -1; + } + + cbuf->buf = buf; + cbuf->head = 0; + cbuf->tail = 0; + + *circ = cbuf; + + return 0; +} + +int bbuf_circ_add(bbuf_circ *circ, bbuf *new_data) +{ + int i=0; + int cnt=0; + + if (circ == NULL) + { + return -1; + } + + if (new_data == NULL) + { + return -1; + } + + if (bbuf_size(new_data) <= 0) + { + return -1; + } + + for (i=0;i<bbuf_size(new_data);i++) + { + if (0 == bbuf_circ_put(circ, new_data->buf[i])) + { + cnt++; + } + } + + return cnt; +} + +int bbuf_circ_get_line(bbuf_circ *circ, bbuf *line) +{ + +} + +int bbuf_circ_reset(bbuf_circ *circ) +{ + if (circ == NULL) + { + return -1; + } + + circ->head = 0; + circ->tail = 0; + + return 0; +} + + +int bbuf_circ_get(bbuf_circ *circ, char *data) +{ + if (circ == NULL) + { + return -1; + } + + if (data == NULL) + { + return -1; + } + + if (0 == bbuf_circ_empty(circ)) + { + *data = circ->buf->buf[circ->tail]; + circ->tail = (circ->tail+1)%bbuf_size(circ->buf); + return 0; + } + + return -1; +} + +int bbuf_circ_put(bbuf_circ *circ, char data) +{ + if (NULL == circ) + { + return -1; + } + + circ->buf->buf[circ->head] = data; + circ->head = (circ->head+1)%bbuf_size(circ->buf); + + if (circ->head == circ->tail) + { + circ->tail = (circ->tail+1)%bbuf_size(circ->buf); + } + + return 0; +} + +int bbuf_circ_empty(bbuf_circ *circ) +{ + if (circ == NULL) + { + return -1; + } + + return (circ->tail == circ->head); +} + +int bbuf_circ_full(bbuf_circ *circ) +{ + //one lost byte + return ((circ->head+1)%bbuf_size(circ->buf) == (circ->tail)); +} + +int bbuf_circ_free(bbuf_circ *circ) +{ + bbuf_free(circ->buf); + circ->buf = NULL; + free(circ); + circ = NULL; +} +*/
\ No newline at end of file diff --git a/libbuf/buf_misc.h b/libbuf/buf_misc.h new file mode 100644 index 0000000..ded41d7 --- /dev/null +++ b/libbuf/buf_misc.h @@ -0,0 +1,64 @@ +#ifndef __LIBBUF_MISC_H +#define __LIBBUF_MISC_H + +#include "buf.h" + +#define BUF_PATTER_SIZE 2 + +/* +//line buffer, put data get line out +typedef struct bbuf_line +{ + bbuf *buf; + char pattern[BUF_PATTER_SIZE]; + char sep; //seperator character +} bbuf_line; + +int bbuf_line_new(bbuf_line *buf, int size); +int bbuf_line_pattern(bbuf_line *buf, char *patt, int size); +int bbuf_line_add(bbuf_line *buf_line, bbuf *new_data); +int bbuf_line_get_line(bbuf_line *buf_line, bbuf *line); +int bbuf_line_free(bbuf_line *buf); +*/ + +class BufLine +{ +private: + Buf *buf; + char pattern[BUF_PATTER_SIZE]; + char sep; //seperator character +public: + BufLine(int size); + ~BufLine(); + int setpattern(char *pattern); + int setseperator(char s); + int add(char *string, int size); + int add(Buf *newdata); + int pop_line(char **val, int *size); + int print(); + int pop_pattern(int (*detect_pattern)(char *, int, int*), char **val, int *size); +}; + + +//formating buf ops + +//circular buffer +/* +typedef struct bbuf_circ +{ + bbuf *buf; + int head; + int tail; +} bbuf_circ; + +int bbuf_circ_new(bbuf_circ **circ, int size); +int bbuf_circ_add(bbuf_circ *circ, bbuf *new_data); +int bbuf_circ_get_line(bbuf_circ *circ, bbuf *line); +int bbuf_circ_reset(bbuf_circ *circ); +int bbuf_circ_get(bbuf_circ *circ, char *data); +int bbuf_circ_put(bbuf_circ *circ, char data); +int bbuf_circ_empty(bbuf_circ *circ); +int bbuf_circ_full(bbuf_circ *circ); +int bbuf_circ_free(bbuf_circ *circ); +*/ +#endif |