/*
 * libdpkg - Debian packaging suite library routines
 * pkg-queue.c - primitives for pkg queue handling
 *
 * Copyright © 2010 Guillem Jover <guillem@debian.org>
 *
 * This is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <config.h>
#include <compat.h>

#include <stdlib.h>

#include <dpkg/dpkg-db.h>
#include <dpkg/pkg-queue.h>

/**
 * Initialize a package queue.
 *
 * @param queue The queue to initialize.
 */
void
pkg_queue_init(struct pkg_queue *queue)
{
	queue->head = NULL;
	queue->tail = NULL;
	queue->length = 0;
}

/**
 * Destroy a package queue.
 *
 * It frees the contained package list and resets the queue members.
 *
 * @param queue The queue to destroy.
 */
void
pkg_queue_destroy(struct pkg_queue *queue)
{
	pkg_list_free(queue->head);
	pkg_queue_init(queue);
}

/**
 * Check if a package queue is empty.
 *
 * @param queue The queue to check.
 *
 * @return A boolean value.
 */
int
pkg_queue_is_empty(struct pkg_queue *queue)
{
	return (queue->head == NULL);
}

/**
 * Push a new node containing pkginfo to the tail of the queue.
 *
 * @param queue The queue to insert to.
 * @param pkg The package to use fo the new node.
 *
 * @return The newly inserted pkg_list node.
 */
struct pkg_list *
pkg_queue_push(struct pkg_queue *queue, struct pkginfo *pkg)
{
	struct pkg_list *node;

	node = pkg_list_new(pkg, NULL);

	if (queue->tail == NULL)
		queue->head = node;
	else
		queue->tail->next = node;

	queue->tail = node;

	queue->length++;

	return node;
}

/**
 * Pop a node containing pkginfo from the head of the queue.
 *
 * This removes and frees the node from the queue, effectively reducing its
 * size.
 *
 * @param queue The queue to remove from.
 *
 * @return The pkginfo from the removed node, or NULL if the queue was empty.
 */
struct pkginfo *
pkg_queue_pop(struct pkg_queue *queue)
{
	struct pkg_list *node;
	struct pkginfo *pkg;

	if (pkg_queue_is_empty(queue))
		return NULL;

	node = queue->head;
	pkg = node->pkg;

	queue->head = node->next;
	if (queue->head == NULL)
		queue->tail = NULL;

	free(node);
	queue->length--;

	return pkg;
}
