#ifndef _QUEUE_H #define _QUEUE_H struct queue { int start; int end; int size; int count; char data[0]; }; #define NEWQUEUE(name,size) \ char name ## _data[sizeof(struct queue)+size]; \ struct queue* name = (struct queue*)&name ## _data; static inline void init_queue(struct queue *q,int size){ q->start = q->end = q->count = 0; q->size = size; } static inline char queue_get(struct queue *q){ int ret; ret = q->data[q->start]; q->start++; q->count--; if(q->start == q->size) q->start = 0; return(ret); } static inline void queue_add(struct queue *q,char x){ q->data[q->end] = x; q->end++; q->count++; if(q->end == q->size) q->end = 0; } static inline int queue_full(struct queue *q){ return(q->count == q->size); } static inline int queue_empty(struct queue *q){ return(q->count == 0); } #endif