Andrew Lentvorski wrote:
Circular buffer is what I was looking for.
I wrote this some years ago for a college class. adapt it as necessary.
it's fixed size, but that could be changed rather easily.
cheers.
-kelsey
/* begin queue.h */
typedef struct {
int front;
int rear;
int count;
int data[10];
} queue;
void q_setup(queue *);
int q_remove(queue *);
void q_add(queue *, int);
int q_empty(queue *);
int q_size(queue *);
/* end queue.h */
/* begin queue.c */
#include "queue.h"
#include <stdio.h>
#include <string.h>
#define DEBUG
/* queue implementation as a circular array. */
/* i hope this works. */
/* initialize all values to 0 */
void q_setup(queue *q)
{
int i;
q->count = 0;
q->front = 0;
q->rear = 0;
for (i = 0; i < 10; i++) {
q->data[i] = 0;
}
}
/* pull the first item out of the queue */
int q_remove(queue *q)
{
int retval;
if (q->count > 0) {
retval = q->data[q->front];
q->count = q->count - 1;;
if (q->front == 9)
q->front = 0;
else
q->front = q->front + 1;
} else {
#ifdef DEBUG
printf("No items in queue!\n");
return -1;
#endif
}
return retval;
}
/* add an item to the end of the queue */
void q_add(queue *q, int i)
{
if (q->count < 10) {
if (q_empty(q)) {
q->count = 1;
q->data[0] = i;
q->front = 0;
q->rear = 1;
} else {
q->count = q->count + 1;;
q->data[q->rear] = i;
if (q->rear == 9)
q->rear = 0;
else
q->rear = q->rear + 1;
}
} else {
#ifdef DEBUG
printf("too many items in queue!\n");
#endif
}
}
/* test to see if the queue is empty */
int q_empty(queue *q)
{
return (q->count == 0);
}
/* see how many items are in the queue */
int q_size(queue *q)
{
return q->count;
}
/* end queue.c */
/* begin queuetest.c -- yes, i wrote unit tests for it */
/* simple queue test algorithm, doesn't really mean anything */
/* ugly, but it does what it needs to do */
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
int main(int argc, const char *argv[])
{
int i;
queue *q;
q = (queue *)malloc(sizeof(queue));
q_setup(q);
for (i = 0; i < 10; i++) {
q_add(q, i);
}
for (i = 0; i < 10; i++) {
printf("%d ", q_remove(q));
fflush(stdout);
}
printf("\n");
printf("Did the output look OK?\n");
printf("Trying to add too many items to the queue.\n");
for (i = 10; i < 21; i++) {
q_add(q, i);
}
for (i = 0; i < 10; i++) {
printf("%d ", q_remove(q));
fflush(stdout);
}
printf("\n");
printf("Trying to remove too many items from the queue.\n");
for (i = 20; i < 30; i++) {
q_add(q, i);
}
for (i = 0; i < 11; i++) {
printf("%d ", q_remove(q));
fflush(stdout);
}
printf("\n");
printf("Did the output look OK?\n");
printf("Testing circular functionality\n");
for (i = 0; i < 10; i++) {
q_add(q, i);
}
for (i = 0; i < 5; i++) {
printf("%d ", q_remove(q));
fflush(stdout);
}
for (i = 10; i < 15; i++) {
q_add(q, i);
}
for (i = 0; i < 10; i++) {
printf("%d ", q_remove(q));
fflush(stdout);
}
printf("\n");
printf("Did the output look OK?\n");
return 0;
}
/* end queuetest.c */
--
[email protected]
http://www.kernel-panic.org/cgi-bin/mailman/listinfo/kplug-list