blob: 2c4480fd0c9a22931244e8d949117de5ac1d45d4 [file] [log] [blame]
/*
* 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;
}