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

Reply via email to