blob: 79aa78554bc188223fec56b2b5dfeb2769a70277 [file] [log] [blame]
#include "uipbuf.h"
#include <string.h>
/*---------------------------------------------------------------------------*/
void
uipbuf_setup(struct uipbuf_buffer *buf,
u8_t *bufptr, u16_t bufsize)
{
buf->buffer = buf->ptr = bufptr;
buf->bufsize = buf->left = bufsize;
}
/*---------------------------------------------------------------------------*/
u8_t
uipbuf_bufdata(struct uipbuf_buffer *buf, u16_t len,
u8_t **dataptr, u16_t *datalen)
{
if(*datalen < buf->left) {
memcpy(buf->ptr, *dataptr, *datalen);
buf->ptr += *datalen;
buf->left -= *datalen;
*dataptr += *datalen;
*datalen = 0;
return UIPBUF_NOT_FULL;
} else if(*datalen == buf->left) {
memcpy(buf->ptr, *dataptr, *datalen);
buf->ptr += *datalen;
buf->left = 0;
*dataptr += *datalen;
*datalen = 0;
return UIPBUF_FULL;
} else {
memcpy(buf->ptr, *dataptr, buf->left);
buf->ptr += buf->left;
*datalen -= buf->left;
*dataptr += buf->left;
buf->left = 0;
return UIPBUF_FULL;
}
}
/*---------------------------------------------------------------------------*/
u8_t
uipbuf_bufdata_endmarker(struct uipbuf_buffer *buf, u8_t endmarker,
u8_t **dataptr, u16_t *datalen)
{
u8_t c;
while(buf->left > 0 && *datalen > 0) {
c = *buf->ptr = **dataptr;
++*dataptr;
++buf->ptr;
--*datalen;
--buf->left;
if(c == endmarker) {
return UIPBUF_FOUND;
}
}
if(*datalen == 0) {
return UIPBUF_NOT_FOUND;
}
while(*datalen > 0) {
if(**dataptr == endmarker) {
return UIPBUF_FOUND | UIPBUF_FULL;
}
--*datalen;
++*dataptr;
}
return UIPBUF_FULL;
}
/*----------------------------------------------------------------------------*/u16_t
uipbuf_len(struct uipbuf_buffer *buf)
{
return buf->bufsize - buf->left;
}
/*----------------------------------------------------------------------------*/