初心者な質問ですいません。キューについて教えてください。

キューについて考える。
組み込みで使うのを想定しておく。mallocは使わない。最初に最大サイズが決まってて、それ以上はどうでもいい。ものとする。

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 == (tail-1) ) {
		/* 知らない */
		return;
	}

	/* ... 端っこの処理とか ... */

	q->buf[q->head] = c;
	q->head++;
}

int pop( struct q *q ) {
	int ret;
	if ( q->head == q->tail )
		return -1

	/* ... 端っこの処理とか ... */

	ret = q->buf[q->tail];
	q->tail++;
	return ret;
}

こんな感じ。よゆーだなー、と思ってやってたんだけど、このやりかただと、じみーな問題がある。バッファのサイズ分使えないのだ。

char buf[5];
init( &q, buf, 5 ); /* これだと四個までしか入れられない… */

はたして、これを簡単に解決する方法はあるだろうか。