blob: 79aa78554bc188223fec56b2b5dfeb2769a70277 [file] [log] [blame]
adamdunkels56807862004-08-09 20:50:11 +00001
2#include "uipbuf.h"
3
4#include <string.h>
5
6/*---------------------------------------------------------------------------*/
7void
8uipbuf_setup(struct uipbuf_buffer *buf,
9 u8_t *bufptr, u16_t bufsize)
10{
11 buf->buffer = buf->ptr = bufptr;
12 buf->bufsize = buf->left = bufsize;
13}
14/*---------------------------------------------------------------------------*/
15u8_t
16uipbuf_bufdata(struct uipbuf_buffer *buf, u16_t len,
17 u8_t **dataptr, u16_t *datalen)
18{
19 if(*datalen < buf->left) {
20 memcpy(buf->ptr, *dataptr, *datalen);
21 buf->ptr += *datalen;
22 buf->left -= *datalen;
23 *dataptr += *datalen;
24 *datalen = 0;
25 return UIPBUF_NOT_FULL;
26 } else if(*datalen == buf->left) {
27 memcpy(buf->ptr, *dataptr, *datalen);
28 buf->ptr += *datalen;
29 buf->left = 0;
30 *dataptr += *datalen;
31 *datalen = 0;
32 return UIPBUF_FULL;
33 } else {
34 memcpy(buf->ptr, *dataptr, buf->left);
35 buf->ptr += buf->left;
36 *datalen -= buf->left;
37 *dataptr += buf->left;
38 buf->left = 0;
39 return UIPBUF_FULL;
40 }
41
42}
43/*---------------------------------------------------------------------------*/
44u8_t
45uipbuf_bufdata_endmarker(struct uipbuf_buffer *buf, u8_t endmarker,
46 u8_t **dataptr, u16_t *datalen)
47{
48 u8_t c;
49
50 while(buf->left > 0 && *datalen > 0) {
51 c = *buf->ptr = **dataptr;
52 ++*dataptr;
53 ++buf->ptr;
54 --*datalen;
55 --buf->left;
56
57 if(c == endmarker) {
58 return UIPBUF_FOUND;
59 }
60 }
61
62 if(*datalen == 0) {
63 return UIPBUF_NOT_FOUND;
64 }
65
66 while(*datalen > 0) {
67 if(**dataptr == endmarker) {
68 return UIPBUF_FOUND | UIPBUF_FULL;
69 }
70 --*datalen;
71 ++*dataptr;
72 }
73
74 return UIPBUF_FULL;
75}
76/*----------------------------------------------------------------------------*/u16_t
77uipbuf_len(struct uipbuf_buffer *buf)
78{
79 return buf->bufsize - buf->left;
80}
81/*----------------------------------------------------------------------------*/