fifo.c (1115B)
1 #include <stdlib.h> 2 #include <string.h> 3 4 struct fifo { 5 unsigned char *buf; 6 size_t sz; 7 size_t cap; 8 }; 9 10 struct fifo * 11 fifo_init(size_t cap) 12 { 13 struct fifo *fifo; 14 15 fifo = malloc(sizeof(*fifo)); 16 if (!fifo) 17 return NULL; 18 if (cap > 0) { 19 fifo->buf = malloc(cap); 20 if (!fifo->buf) { 21 free(fifo); 22 return NULL; 23 } 24 } 25 fifo->sz = 0; 26 fifo->cap = cap; 27 return fifo; 28 } 29 30 void 31 fifo_free(struct fifo *fifo) 32 { 33 free(fifo->buf); 34 free(fifo); 35 } 36 37 int 38 fifo_add(struct fifo *fifo, const void *buf, size_t sz) 39 { 40 void *tmp; 41 42 if (sz == 0) 43 return 0; 44 if (fifo->cap - fifo->sz >= sz) { 45 memcpy(fifo->buf + fifo->sz, buf, sz); 46 fifo->sz += sz; 47 return 0; 48 } 49 tmp = realloc(fifo->buf, fifo->cap + sz); 50 if (!tmp) 51 return -1; 52 fifo->buf = tmp; 53 memcpy(fifo->buf + fifo->sz, buf, sz); 54 fifo->sz += sz; 55 fifo->cap += sz; 56 return 0; 57 } 58 59 int 60 fifo_remove(struct fifo *fifo, void *buf, size_t sz) 61 { 62 if (sz == 0) 63 return 0; 64 if (fifo->sz < sz) 65 return -1; 66 memcpy(buf, fifo->buf, sz); 67 memmove(fifo->buf, fifo->buf + sz, fifo->sz - sz); 68 fifo->sz -= sz; 69 return 0; 70 } 71 72 size_t 73 fifo_size(struct fifo *fifo) 74 { 75 return fifo->sz; 76 }