1 #include "fifo_buffer.h"
2 #include <string.h>
3
fifo_buffer(unsigned int size)4 fifo_buffer::fifo_buffer(unsigned int size)
5 : size(size), free_space(size)
6 {
7 data = new unsigned char [size];
8 data_end = data + size;
9 p_head = p_tail = data;
10 }
11
~fifo_buffer()12 fifo_buffer::~fifo_buffer()
13 {
14 delete [] data;
15 }
16
write(const void * buf,unsigned int len)17 int fifo_buffer::write(const void* buf, unsigned int len)
18 {
19 if(len > free_space) {
20 // write all or nothing!
21 return -1;
22 }
23
24 if((p_head >= p_tail) &&
25 (len > data_end - p_head)) {
26
27 // split write
28 unsigned int buf_end = data_end - p_head;
29 memcpy(p_head, buf, buf_end);
30 memcpy(data, (unsigned char*)buf + buf_end, len - buf_end);
31 p_head = data + len - buf_end;
32 }
33 else {
34
35 //direct write
36 memcpy(p_head,buf,len);
37 p_head += len;
38 }
39
40 free_space -= len;
41 return len;
42 }
43
writev(const struct iovec * iov,int iovcnt)44 int fifo_buffer::writev(const struct iovec *iov, int iovcnt)
45 {
46 unsigned int len=0;
47
48 for(int i=0; i<iovcnt; i++) {
49 len += iov[i].iov_len;
50 }
51
52 if(len > free_space) {
53 // write all or nothing!
54 return -1;
55 }
56
57 for(int i=0; i<iovcnt; i++) {
58 write(iov[i].iov_base,iov[i].iov_len);
59 }
60
61 return len;
62 }
63