1 /* 2 * A simple FIFO implementation. 3 * 4 * Copyright (C) 2004 Stelian Pop <stelian (at) popies.net> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 * 20 */ 21 struct fifo { 22 unsigned char *buffer; /* the buffer holding the data */ 23 unsigned int size; /* the size of the allocated buffer */ 24 unsigned int in; /* data is added at offset (in % size) */ 25 unsigned int out; /* data is extracted from off. (out % size) */ 26 }; 27 28 struct fifo *fifo_alloc(unsigned int); 29 unsigned int fifo_put(struct fifo *, void *, unsigned int); 30 unsigned int fifo_get(struct fifo *, void *, unsigned int); 31 void fifo_free(struct fifo *); 32 33 static inline unsigned int fifo_len(struct fifo *fifo) 34 { 35 return fifo->in - fifo->out; 36 } 37 38 static inline unsigned int fifo_room(struct fifo *fifo) 39 { 40 return fifo->size - fifo->in + fifo->out; 41 } 42 43 #ifndef min 44 #define min(x,y) ({ \ 45 typeof(x) _x = (x); \ 46 typeof(y) _y = (y); \ 47 (void) (&_x == &_y); \ 48 _x < _y ? _x : _y; }) 49 #endif 50 51 #ifndef max 52 #define max(x,y) ({ \ 53 typeof(x) _x = (x); \ 54 typeof(y) _y = (y); \ 55 (void) (&_x == &_y); \ 56 _x > _y ? _x : _y; }) 57 58 #endif 59