1
0
This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Files
2024-07-22 01:58:46 -03:00

100 lines
1.4 KiB
C
Executable File

/* queue.c - Quick and very very dirty buffer and queue handling */
/* Written 1995-1996 by Werner Almesberger, EPFL-LRC */
#include <stdlib.h>
#include <string.h>
#include "atmd.h"
#include "queue.h"
BUFFER *buffer_create(int length,int key)
{
BUFFER *buf;
buf = alloc_t(BUFFER);
buf->data = alloc(length);
buf->length = length;
buf->key = key;
return buf;
}
BUFFER *buffer_clone(BUFFER *b)
{
BUFFER *buf;
buf = buffer_create(b->length,b->key);
memcpy(buf->data,b->data,b->length);
return buf;
}
void buffer_discard(BUFFER *b)
{
free(b->data);
free(b);
}
void queue_init(QUEUE *q)
{
q->first = q->last = NULL;
}
void queue_put(QUEUE *q,BUFFER *b)
{
Q_INSERT_AFTER(q->first,b,q->last);
q->last = b;
}
void queue_remove(QUEUE *q,BUFFER *b)
{
if (q->last == b) q->last = b->prev;
Q_REMOVE(q->first,b);
}
BUFFER *queue_peek(QUEUE *q)
{
return q->first;
}
BUFFER *queue_get(QUEUE *q)
{
BUFFER *buf;
buf = queue_peek(q);
if (buf) queue_remove(q,buf);
return buf;
}
BUFFER *queue_lookup(QUEUE *q,int key)
{
BUFFER *walk;
for (walk = q->first; walk; walk = walk->next)
if (walk->key == key) break;
return walk;
}
void queue_clear(QUEUE *q)
{
BUFFER *next;
while (q->first) {
next = q->first->next;
buffer_discard(q->first);
q->first = next;
}
q->last = NULL;
}