Select Git revision
Forked from
Peter Gerwinski / hp
Source project has a limited visibility.
fifo.c 1.72 KiB
#include <stdio.h>
#include <stdlib.h>
#define FIFO_SIZE 42
typedef struct
{
int x, y;
}
pair;
pair fifo[FIFO_SIZE];
int fifo_read_pointer = 0;
int fifo_write_pointer = 0;
void fatal_error (char *msg)
{
fprintf (stderr, "%s\n", msg);
exit (1);
}
void push_pair (int x, int y)
{
if (fifo_write_pointer < 0 || fifo_write_pointer >= FIFO_SIZE)
fatal_error ("push_pair: fifo inconsistence");
else
{
printf ("pushing (%d,%d)\n", x, y);
fifo[fifo_write_pointer].x = x;
fifo[fifo_write_pointer].y = y;
fifo_write_pointer++;
if (fifo_write_pointer >= FIFO_SIZE)
fifo_write_pointer = 0;
if (fifo_write_pointer == fifo_read_pointer)
fatal_error ("fifo overflow");
}
}
pair pop_pair (void)
{
pair nix;
if (fifo_read_pointer < 0 || fifo_read_pointer >= FIFO_SIZE)
{
fatal_error ("pop_pair: fifo inconsistence");
return nix;
}
else if (fifo_read_pointer == fifo_write_pointer)
{
fatal_error ("fifo underflow");
return nix;
}
else
{
printf ("popping (%d,%d)\n", fifo[fifo_read_pointer].x, fifo[fifo_read_pointer].y);
pair value = fifo[fifo_read_pointer];
fifo[fifo_read_pointer].x = 0;
fifo[fifo_read_pointer].y = 0;
fifo_read_pointer++;
if (fifo_read_pointer >= FIFO_SIZE)
fifo_read_pointer = 0;
return value;
}
}
void dump_stack (void)
{
int i;
printf ("dump_stack:");
for (i = 0; i < FIFO_SIZE; i++)
printf (" (%d,%d)", fifo[i].x, fifo[i].y);
printf ("\n");
}
int main (void)
{
dump_stack ();
push_pair (3, 0);
dump_stack ();
push_pair (7, 2);
dump_stack ();
push_pair (23, 23);
dump_stack ();
pop_pair ();
dump_stack ();
pop_pair ();
dump_stack ();
push_pair (42, 137);
dump_stack ();
pop_pair ();
dump_stack ();
pop_pair ();
dump_stack ();
return 0;
}