/* $Id$ */
/*
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 */
#include "top.h"
#include "queue.h"

empty_queue(q)
	register queue q;
{
	q->head = q->tail = (instr_p) 0;
	q->qlen = 0;
}

int empty(q)
	queue q;
{
	return q->qlen == 0;
}

remove_head(q)
	register queue q;
{
	if ( (q->head = q->head->fw) == (instr_p) 0) {
		q->tail = (instr_p) 0;
	} else {
		q->head->bw = (instr_p) 0;
	}
	q->qlen--;
}

add(q,instr)
	register queue q;
	register instr_p instr;
{
	if (q->qlen++ == 0) {
		q->head = q->tail = instr;
		instr->bw = (instr_p) 0;
	} else {
		q->tail->fw = instr;
		instr->bw = q->tail;
		q->tail = instr;
	}
	instr->fw = (instr_p) 0;
}

insert(q,instr)
	register queue q;
	register instr_p instr;
{
	if (q->qlen++ == 0) {
		q->head = q->tail = instr;
		instr->fw = (instr_p) 0;
	} else {
		q->head->bw = instr;
		instr->fw = q->head;
		q->head = instr;
	}
	instr->bw = (instr_p) 0;
}

join_queues(q1,q2)
	register queue q1,q2;
{
	if (q1->qlen > 0) {
		q2->qlen += q1->qlen;
		q1->tail->fw = q2->head;
		if (q2->qlen > 0) {
			q2->head->bw = q1->tail;
		} else {
			q2->tail = q1->tail;
		}
		q2->head = q1->head;
		empty_queue(q1);
	}
}