libds

a collection of simple data structures
Log | Files | Refs | LICENSE

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 }