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