⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queues.c

📁 地球模拟器
💻 C
字号:
/* queues.c   9-9-92  Tierra Simulator *//* Tierra Simulator V4.0: Copyright (c) 1991, 1992 Tom Ray & Virtual Life */#ifndef lintstatic char     sccsid[] = "@(#)queues.c	1.5     7/21/92";#endif#include "license.h"#include "tierra.h"#include "extern.h"#ifdef MEM_CHK#include <memcheck.h>#endifvoid IncrSliceQueue() /* increment slicer queue */{   ThisSlice = &cells[ThisSlice->q.n_time.a][ThisSlice->q.n_time.i];    while(!ThisSlice->ld) /* get dead cells out of queue */        RmvFrmSlicer(ThisSlice);}void EntBotSlicer(ce)Pcells  ce; /* new cell being added to bottom of slicer queue */{   Pcells  tc; /* ThisSlice cell */    Pcells  pc; /* previous slice cell */    tc = ThisSlice; pc = &cells[tc->q.p_time.a][tc->q.p_time.i];#ifdef ERROR    if((ce->q.n_time.a != ce->q.p_time.a || ce->q.n_time.i != ce->q.p_time.i)        && NumCells > 1)    {   FEError(-800,EXIT,WRITE,            "Tierra EntBotSlicer() error: cell already in slicer queue");    }#endif    pc->q.n_time = ce->q.this; /* previous slice points to ce */    ce->q.p_time = tc->q.p_time; /* ce points back at previous slice */    ce->q.n_time = ThisSlice->q.this; /* ce points to this slice */    tc->q.p_time = ce->q.this; /* this slice points back at ce */}void UpReaper(ce) /* move cell up the reaper queue */Pcells  ce; /* ce is cell to be moved up in reaper */{   Pcells  pe2, pe, ne;    if(ce == TopReap) return;#ifdef ERROR    if(ce->q.n_reap.a == ce->q.p_reap.a && ce->q.n_reap.i == ce->q.p_reap.i        && NumCells > 1)    {   FEError(-801,EXIT,WRITE,        "Tierra UpReaper() error: cell not in reaper queue");    }#endif    ne = &cells[ce->q.n_reap.a][ce->q.n_reap.i];/*ne is next cell in reaper */    pe = &cells[ce->q.p_reap.a][ce->q.p_reap.i];        /* pe is previous cell in reaper */    pe2 = &cells[pe->q.p_reap.a][pe->q.p_reap.i];        /* pe2 is 2nd previous cell in reaper */    ne->q.p_reap = pe->q.this;  /* ne points back to pe */    ce->q.p_reap = pe2->q.this; /* ce points back to pe2 */    ce->q.n_reap = pe->q.this;  /* ce points ahead to pe */    pe->q.p_reap = ce->q.this;  /* pe points back to ce */    pe->q.n_reap = ne->q.this;  /* pe points ahead to ne */    pe2->q.n_reap = ce->q.this; /* pe2 points ahead to ce */    if(ce == BottomReap)        BottomReap = pe;    if(pe == TopReap)        TopReap = ce;}void DownReaper(ce)Pcells  ce; /* ce is cell to be moved down in reaper */{   Pcells  pe, ne, ne2;    if(ce == BottomReap) return;#ifdef ERROR    if(ce->q.n_reap.a == ce->q.p_reap.a && ce->q.n_reap.i == ce->q.p_reap.i        && NumCells > 1)    {   FEError(-802,EXIT,WRITE,        "Tierra DownReaper() error: cell not in reaper queue");    }#endif    ne = &cells[ce->q.n_reap.a][ce->q.n_reap.i];/*ne is next cell in reaper */    ne2 = &cells[ne->q.n_reap.a][ne->q.n_reap.i];        /* ne2 is 2nd next cell in reaper */    pe = &cells[ce->q.p_reap.a][ce->q.p_reap.i];        /* pe is previous cell in reaper */    pe->q.n_reap = ne->q.this;  /* pe points ahead to ne */    ce->q.n_reap = ne2->q.this; /* ce points ahead to ne2 */    ce->q.p_reap = ne->q.this;  /* ce points back to ne */    ne->q.n_reap = ce->q.this;  /* ne points ahead to ce */    ne->q.p_reap = pe->q.this;  /* ne points back to pe */    ne2->q.p_reap = ce->q.this; /* ne2 points back to ce */    if(ce == TopReap)        TopReap = ne;    if(ne == BottomReap)        BottomReap = ce;}void UpRprIf(ce)Pcells  ce;{   if(ce->d.flags >= cells[ce->q.p_reap.a][ce->q.p_reap.i].d.flags)        UpReaper(ce);}void DownReperIf(ce)Pcells  ce;{   if(ce->d.flags <= cells[ce->q.n_reap.a][ce->q.n_reap.i].d.flags)        DownReaper(ce);}void EntBotReaper(ce)Pcells  ce; /* cell to be added to the bottom of reaper queue */{   Pcells  be = BottomReap; /* cell presently at bottom of reaper queue */#ifdef ERROR    if((ce->q.n_reap.a != ce->q.p_reap.a || ce->q.n_reap.i != ce->q.p_reap.i)        && NumCells > 1)    {   FEError(-803,EXIT,WRITE,            "Tierra EntBotReaper() error: cell already in reaper queue");    }#endif    ce->q.p_reap = BottomReap->q.this;        /* new cell points back to old BottomReap */    ce->q.n_reap = BottomDummy->q.this;        /* new cell points ahead to dummy bottom */    be->q.n_reap = ce->q.this;/* old BottomReap cell now points ahead to ce */    BottomDummy->q.p_reap = ce->q.this;    BottomReap = ce; /* BottomReap is now ce */}void RmvFrmReaper(ce)Pcells  ce; /* cell to be removed from reaper queue */{   Pcells  nc; /* next cell in reaper queue */    Pcells  pc; /* previous cell in reaper queue */    nc = &cells[ce->q.n_reap.a][ce->q.n_reap.i];    pc = &cells[ce->q.p_reap.a][ce->q.p_reap.i];#ifdef ERROR    if(ce->q.n_reap.a == ce->q.p_reap.a && ce->q.n_reap.i == ce->q.p_reap.i        && NumCells > 1)    {   FEError(-804,EXIT,WRITE,            "Tierra RmvFrmReaper() error: cell not in reaper queue");    }#endif    if(ce == TopReap) /* TopReap changed to next cell in queue */        TopReap = &cells[ce->q.n_reap.a][ce->q.n_reap.i];    if(ce == BottomReap) /* BottomReap changed to previous cell in queue */        BottomReap = &cells[ce->q.p_reap.a][ce->q.p_reap.i];        /* previous cell points ahead to next cell: */    pc->q.n_reap = ce->q.n_reap;        /* next cell points back to previous cell: */    nc->q.p_reap = ce->q.p_reap;    ce->q.p_reap = ce->q.n_reap = ce->q.this;        /* initialize reap queue this cell */#ifdef ERROR    if((ce->q.n_time.a != ce->q.p_time.a || ce->q.n_time.i != ce->q.p_time.i)        && NumCells > 1)    {   FEError(-805,EXIT,WRITE,            "Tierra RmvFrmReaper() error: cell still in slicer queue");    }#endif}void RmvFrmSlicer(ce)Pcells  ce; /* cell to be removed from slicer queue */{   Pcells  nc; /* next cell in slicer queue */    Pcells  pc; /* previous cell in slicer queue */    nc = &cells[ce->q.n_time.a][ce->q.n_time.i];    pc = &cells[ce->q.p_time.a][ce->q.p_time.i];#ifdef ERROR    if(ce->q.n_time.a == ce->q.p_time.a && ce->q.n_time.i == ce->q.p_time.i        && NumCells > 1)    {   FEError(-806,EXIT,WRITE,            "Tierra RmvFrmSlicer() error: cell not in slicer queue");    }#endif        /* previous cell points ahead to next cell: */    pc->q.n_time = ce->q.n_time;        /* next cell points back to previous cell: */    nc->q.p_time = ce->q.p_time;    if(ce == ThisSlice)        ThisSlice = &cells[ce->q.n_time.a][ce->q.n_time.i];    ce->q.n_time = ce->q.p_time = ce->q.this;         /* initialize slice queue this cell */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -