/****************************************************************************
 * Copyright (C) 1998 WIDE Project. All rights reserved.
 * Copyright (C) 1999,2000,2001,2002 University of Tromso. All rights reserved.
 * Copyright (C) 2002 Invenia Innovation AS. All rights reserved.
 *
 * Author: Feike W. Dillema, feico@pasta.cs.uit.no.
 *         based on newbie code by Yusuke DOI, Keio Univ. Murai Lab.
 ****************************************************************************/
/*
 * <$Id: queue.c,v 3.16 2002/12/11 16:39:50 dillema Exp $>
 */

#include "totd.h"

Q_Set *queue_create (void) {
        char *fn = "queue_create()";
	Q_Set *qs_tmp;

	qs_tmp = malloc (sizeof (Q_Set));
	if (!qs_tmp)
		syslog (LOG_ERR, "%s: Cannot allocate memory", fn);
	else if (!(qs_tmp->head = qs_tmp->tail = malloc (sizeof (G_Queue)))) {
		syslog (LOG_ERR, "%s: Cannot allocate memory", fn);
		free (qs_tmp);
	} else {
		qs_tmp->head->next = NULL;
		qs_tmp->head->p = NULL;
		/* SUCCESS */
		return qs_tmp;
	}

	/* FAILURE */
	return (NULL);
}

int enqueue (Q_Set *qs, void *p) {
        char *fn = "enqueue()";
	G_Queue *gq_tmp;

	gq_tmp = malloc (sizeof (G_Queue));
	if (!gq_tmp)
		syslog (LOG_ERR, "%s: Cannot allocate memory", fn);
	else {
		gq_tmp->next = NULL;
		gq_tmp->p = NULL;

		qs->tail->p = p;
		qs->tail->next = gq_tmp;
		qs->tail = gq_tmp;

		/* SUCCESS */
		return 0;
	}
	/* FAILURE */
	return (-1);
}

void *dequeue (Q_Set *qs) {
	void *p;
	G_Queue *gq_tmp;

	if (!qs->head->next)
		return NULL;

	do {
		p = qs->head->p;
		gq_tmp = qs->head;
		qs->head = qs->head->next;
		free (gq_tmp);
	} while (!p && qs->head != qs->tail);

	return p;
}

void *queue_peek (Q_Set *qs) {

	if (!qs->head->next)
		return NULL;

	return qs->head->p;
}

void *queue_disable (G_Queue *gq) {
	void *p;

	p = gq->p;
	gq->p = NULL;
	return p;
}

void queue_destroy (Q_Set *qs, void (*freefnc) (void *)) {
	void *p;

	if (!qs)
		return;

	while ((p = dequeue (qs)))
		(*freefnc) (p);

	if (qs->head) {
		/* watchdog */
		free (qs->head);
	}
	free (qs);
}


syntax highlighted by Code2HTML, v. 0.9.1