This is a new version of the ring buffer. Using function templates the FIFO ring buffer is able to handle almost any type of data.
template<typename T> struct cbuffer_t { T * data; T * first; T * next; int max; }; template<typename T> extern cbuffer_t<T> * cBufferInit(int); template<typename T> extern int cBufferPush(cbuffer_t<T> *, T ); template<typename T> extern int cBufferPop(cbuffer_t<T> *, T *); template<typename T> cbuffer_t<T> * cBufferInit(int max) { cbuffer_t<T> * buffer = (cbuffer_t<T>*)malloc(sizeof(cbuffer_t<T>)); buffer->data = (T*)malloc(max * sizeof(T)); buffer->first = (T*)0; buffer->next = buffer->data; buffer->max = max; return buffer; } template<typename T> int cBufferPush(cbuffer_t<T> *buffer, T data) { int x = (int)(buffer->next - buffer->first); if (buffer->first == buffer->next || buffer->next - buffer->first == buffer->max) return -1; *buffer->next = data; buffer->first = buffer->first == (T*)0 ? buffer->next : buffer->first; buffer->next = buffer->next + 1 == buffer->data + buffer->max ? buffer->data : buffer->next + 1; return 0; } template<typename T> int cBufferPop(cbuffer_t<T> *buffer, T *data) { if (buffer->first == (T*)0) return -1; *data = *buffer->first; buffer->first = buffer->first + 1 == buffer->data + buffer->max ? buffer->data : buffer->first + 1; buffer->first = buffer->first == buffer->next ? (T*)0 : buffer->first; return 0; }