http://d.hatena.ne.jp/w_o/20060419#p1
ネタ受け。組み込み屋ならスマートにムダを消せないとね。
struct q
{
char *buf;
int buflen;
int head;
int tail;
};
void init( struct q *q, char *buf, int len ) {
q->head = 0;
q->tail = 0;
q->buf = buf;
q->buflen = len;
}
void push( struct q *q, char c ) {
if ( q->head == q->tail + q->len ) {
/* 知らない */
return;
}
q->buf[q->head%q->len] = c; //< これがミソ
q->head++;
}
int pop( struct q *q ) {
int ret;
if ( q->head == q->tail )
return -1; //< いや、これはどうかと・・・
if ( q->tail == q->len ) {
q->tail = 0;
q->head -= q->len; //< これもミソ.
}
ret = q->buf[q->tail];
q->tail++;
return ret;
}
// ちなみに、pushが複雑になった分はsizeで取り戻す。
int size( struct q *q ) {
return q->tail - q->head;
}