V10/cmd/trace/trace7.c
#include <stdio.h>
#include "trace.h"
#include "trace.d"
struct Swiffle *slist, *slast, *flast;
int nswiff = 0, fswiff = 0;
struct Swiffle *
unswiffle(avoid)
struct STATE *avoid;
{
register struct Swiffle *try;
register int i;
struct Swiffle *result = (struct Swiffle *) NULL;
for (i = nswiff, try = slist; i > 0; i--, try = try->next)
if (try->st != avoid)
{ result = try;
getput(try, i);
break;
}
return result;
}
swiffle(this, that)
struct STATE *this;
struct VISIT *that;
{
struct Swiffle *getswiff(), *try;
try = getswiff();
try->st = this;
try->vi = that;
if (nswiff++ == 0)
slist = try;
else
{ slast->next = try;
try->last = slast;
}
slast = try;
}
getput(try, n)
struct Swiffle *try;
{
/* unlink from slist: */
if (try == slist)
slist = try->next;
else
try->last->next = try->next;
if (n > 1)
try->next->last = try->last;
if (try == slast)
{ if (try == slist)
slast = (struct Swiffle *) NULL;
else
slast = try->last;
}
nswiff--;
/* relink in flist: */
try->next = (struct Swiffle *) NULL;
if (fswiff++ == 0)
try->last = (struct Swiffle *) NULL;
else
{ flast->next = try;
try->last = flast;
}
flast = try;
}
struct Swiffle *
getswiff()
{ struct Swiffle *try;
char *Smalloc();
if (fswiff == 0)
try = (struct Swiffle *) Smalloc(sizeof(struct Swiffle));
else
{ fswiff--;
try = flast;
if ((flast = try->last) != NULL)
flast->next = (struct Swiffle *) NULL;
}
try->next = try->last = (struct Swiffle *) NULL;
return try;
}