mirror of https://github.com/sipwise/sems.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
1.1 KiB
63 lines
1.1 KiB
#include "fifo_buffer.h"
|
|
#include <string.h>
|
|
|
|
fifo_buffer::fifo_buffer(unsigned int size)
|
|
: size(size), free_space(size)
|
|
{
|
|
data = new unsigned char [size];
|
|
data_end = data + size;
|
|
p_head = p_tail = data;
|
|
}
|
|
|
|
fifo_buffer::~fifo_buffer()
|
|
{
|
|
delete [] data;
|
|
}
|
|
|
|
int fifo_buffer::write(const void* buf, unsigned int len)
|
|
{
|
|
if(len > free_space) {
|
|
// write all or nothing!
|
|
return -1;
|
|
}
|
|
|
|
if((p_head >= p_tail) &&
|
|
(len > data_end - p_head)) {
|
|
|
|
// split write
|
|
unsigned int buf_end = data_end - p_head;
|
|
memcpy(p_head, buf, buf_end);
|
|
memcpy(data, (unsigned char*)buf + buf_end, len - buf_end);
|
|
p_head = data + len - buf_end;
|
|
}
|
|
else {
|
|
|
|
//direct write
|
|
memcpy(p_head,buf,len);
|
|
p_head += len;
|
|
}
|
|
|
|
free_space -= len;
|
|
return len;
|
|
}
|
|
|
|
int fifo_buffer::writev(const struct iovec *iov, int iovcnt)
|
|
{
|
|
unsigned int len=0;
|
|
|
|
for(int i=0; i<iovcnt; i++) {
|
|
len += iov[i].iov_len;
|
|
}
|
|
|
|
if(len > free_space) {
|
|
// write all or nothing!
|
|
return -1;
|
|
}
|
|
|
|
for(int i=0; i<iovcnt; i++) {
|
|
write(iov[i].iov_base,iov[i].iov_len);
|
|
}
|
|
|
|
return len;
|
|
}
|