/*
------------------------------------------------------------------------------
 dllink.c - routines for dealing with doubly linked, circular lists
 Bob Jenkins, 1990.  Public Domain.
------------------------------------------------------------------------------
*/
#ifndef STANDARD
#include "standard.h"
#endif
#ifndef DLLINK
#include "dllink.h"
#endif

/*
------------------------------------------------------------------------------
  This displays all the nodes in a single string
------------------------------------------------------------------------------
*/
void   l_show(l)
register dllink *l;
{
  register dllink  *count;

  if ((count = l) != 0)
  {
    printf("%d ", count->c);
    count = count->z;
    while (count != l)
    {
      printf("%d ", count->c);
      count = count->z;
    }
  }
  printf("\n");
}


/*
------------------------------------------------------------------------------
    This takes a dllink inp, adds a dllink before it, and places a
    pointer to the added dllink in outp
------------------------------------------------------------------------------
*/
void   l_add(inp,crossings,outp)
register dllink *inp;
word             crossings;
dllink         **outp;
{
  register dllink  *newlink;

  newlink    = (dllink *)malloc(sizeof(dllink));
  newlink->c = crossings;
  if (inp == 0)
  {
    newlink->a = newlink;
    newlink->z = newlink;
    inp        = newlink;
  }
  else
  {
    newlink->a = inp->a;
    newlink->z = inp;
    inp->a->z  = newlink;
    inp->a     = newlink;
  }
  *outp = inp->a;
}




/*
------------------------------------------------------------------------------
  This deletes a given dllink from a loop
------------------------------------------------------------------------------
*/
void   l_del(l)
dllink **l;
{
  register dllink  *ll = *l;

  if (!ll) return;
  if (ll->a != ll)
  {
    ll->z->a = ll->a;
    ll->a->z = ll->z;
  }
  free((char *)ll);
  *l = (dllink *)0;
}