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.
82 lines
2.0 KiB
82 lines
2.0 KiB
#include "buffer.h" |
|
|
|
void buffer_init(buffer_t *buffer, unsigned int len) |
|
{ |
|
buffer->data = (unsigned char *)BUFFER_MALLOC(len); |
|
buffer->buffer_size = len; |
|
buffer->buffer_in_cnt = 0; |
|
buffer->buffer_out_cnt = 0; |
|
buffer->buffer_in_index = 0; |
|
buffer->buffer_out_index = 0; |
|
} |
|
|
|
void buffer_reset(buffer_t *buffer) |
|
{ |
|
buffer->buffer_in_cnt = 0; |
|
buffer->buffer_out_cnt = 0; |
|
buffer->buffer_in_index = 0; |
|
buffer->buffer_out_index = 0; |
|
} |
|
|
|
int buffer_in(buffer_t *buffer, unsigned char *data, unsigned int len) |
|
{ |
|
if (buffer->buffer_in_cnt + len - buffer->buffer_out_cnt > buffer->buffer_size) |
|
{ |
|
return -1; |
|
} |
|
|
|
unsigned int i; |
|
for (i = 0; i < len; i++) |
|
{ |
|
buffer->data[(buffer->buffer_in_index + i) % buffer->buffer_size] = data[i]; |
|
} |
|
buffer->buffer_in_index = (buffer->buffer_in_index + len) % buffer->buffer_size; |
|
buffer->buffer_in_cnt += len; |
|
return 0; |
|
} |
|
|
|
int buffer_out(buffer_t *buffer, unsigned char *data, unsigned int *len, unsigned int max_len) |
|
{ |
|
if (buffer->buffer_out_cnt >= buffer->buffer_in_cnt) |
|
{ |
|
return -1; |
|
} |
|
|
|
*len = buffer->buffer_in_cnt - buffer->buffer_out_cnt; |
|
if (*len > max_len) |
|
{ |
|
*len = max_len; |
|
} |
|
|
|
unsigned int i; |
|
for (i = 0; i < *len; i++) |
|
{ |
|
if (data) |
|
data[i] = buffer->data[(buffer->buffer_out_index + i) % buffer->buffer_size]; |
|
} |
|
buffer->buffer_out_index = (buffer->buffer_out_index + *len) % buffer->buffer_size; |
|
buffer->buffer_out_cnt += *len; |
|
return 0; |
|
} |
|
|
|
int buffer_out_without_decrease(buffer_t *buffer, unsigned char *data, unsigned int *len, unsigned int max_len) |
|
{ |
|
if (buffer->buffer_out_cnt >= buffer->buffer_in_cnt) |
|
{ |
|
return -1; |
|
} |
|
|
|
*len = buffer->buffer_in_cnt - buffer->buffer_out_cnt; |
|
if (*len > max_len) |
|
{ |
|
*len = max_len; |
|
} |
|
|
|
unsigned int i; |
|
for (i = 0; i < *len; i++) |
|
{ |
|
if (data) |
|
data[i] = buffer->data[(buffer->buffer_out_index + i) % buffer->buffer_size]; |
|
} |
|
return 0; |
|
}
|
|
|