1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
/* $Id: nodeq.c,v 1.2 2004/12/11 19:26:04 ellson Exp $ $Revision: 1.2 $ */
/* vim:set shiftwidth=4 ts=8: */
/**********************************************************
* This software is part of the graphviz package *
* http://www.graphviz.org/ *
* *
* Copyright (c) 1994-2004 AT&T Corp. *
* and is licensed under the *
* Common Public License, Version 1.0 *
* by AT&T Corp. *
* *
* Information and Software Systems Research *
* AT&T Research, Florham Park NJ *
**********************************************************/
#include <agraph.h>
#include <agutil.h>
/* node Nqueue maintenance */
Nqueue *Nqueue_new(Agraph_t * g)
{
Nqueue *q;
int sz;
q = agnew(g, Nqueue);
sz = agnnodes(g);
if (sz <= 1)
sz = 2;
q->head = q->tail = q->store = agnnew(g, sz, Agnode_t *);
q->limit = q->store + sz;
return q;
}
void Nqueue_free(Agraph_t * g, Nqueue * q)
{
agfree(g, q->store);
agfree(g, q);
}
void Nqueue_insert(Nqueue * q, Agnode_t * n)
{
*(q->tail++) = n;
if (q->tail >= q->limit)
q->tail = q->store;
}
Agnode_t *Nqueue_remove(Nqueue * q)
{
Agnode_t *n;
if (q->head == q->tail)
n = NIL(Agnode_t *);
else {
n = *(q->head++);
if (q->head >= q->limit)
q->head = q->store;
}
return n;
}
|