home *** CD-ROM | disk | FTP | other *** search
- /* queues.c 28-10-91 Artificial Life simulator */
- /** Tierra Simulator V3.0: Copyright (c) 1991 Thomas S. Ray **/
-
- #include "license.h"
-
- #ifndef lint
- static char sccsid[] = "%W% %G%";
- #endif
-
- #include "tierra.h"
- #include "extern.h"
-
- void IncrSliceQueue() /* increment slicer queue */
- { ThisSlice = (cells + ThisSlice)->q.n_time;
- while(!(cells + ThisSlice)->ld) /* get dead cells out of queue */
- RmvFrmSlicer(ThisSlice);
- }
-
- void EntBotSlicer(ci)
- I32s ci;
- { Pcells ce; /* new cell being added to bottom of slicer queue */
- Pcells tc; /* ThisSlice cell */
- Pcells pc; /* previous slice cell */
-
- ce = cells + ci; tc = cells + ThisSlice; pc = cells + tc->q.p_time;
- #ifdef ERROR
- if(ce->q.n_time != ce->q.p_time && NumCells > 1)
- { sprintf(mes[0],
- "Tierra EntBotSlicer() error: cell already in slicer queue");
- if (!hangup)
- FEMessage(1);
- else
- { sprintf(mes[1],"system being saved to disk");
- FEMessage(2);
- }
- while(hangup) ;
- WriteSoup(1);
- exit(0);
- }
- #endif
- pc->q.n_time = ci; /* previous slice points to ce */
- ce->q.p_time = tc->q.p_time; /* ce points back at previous slice */
- ce->q.n_time = ThisSlice; /* ce points to this slice */
- tc->q.p_time = ci; /* this slice points back at ce */
- }
-
- void UpReaper(ci) /* move cell up the reaper queue */
- I32s ci;
- { I32s pi2, pi, ni; /* 2 previous, previous and next cells in reaper */
- Pcells pe2;
- Pcells pe;
- Pcells ne;
- Pcells ce;
-
- if(ci == TopReap) return;
- ce = cells + ci; /* ce is cell to be moved up in reaper */
- #ifdef ERROR
- if(ce->q.n_reap == ce->q.p_reap && NumCells > 1)
- { sprintf(mes[0],"Tierra UpReaper() error: cell not in reaper queue");
- if (!hangup)
- FEMessage(1);
- else
- { sprintf(mes[1],"system being saved to disk");
- FEMessage(2);
- }
- while(hangup) ;
- WriteSoup(1);
- exit(0);
- }
- #endif
- ni = ce->q.n_reap; /* ni is index of next cell in reaper */
- ne = cells + ni; /* ne is next cell in reaper */
- pi = ce->q.p_reap; /* pi is index of previous cell in reaper */
- pe = cells + pi; /* pe is previous cell in reaper */
- pi2 = pe->q.p_reap; /* pi2 is index of 2nd previous cell in reaper */
- pe2 = cells + pi2; /* pe2 is 2nd previous cell in reaper */
- ne->q.p_reap = pi; /* ni points back to pi */
- ce->q.p_reap = pi2; /* ci points back to pi2 */
- ce->q.n_reap = pi; /* ci points ahead to pi */
- pe->q.p_reap = ci; /* pi points back to ci */
- pe->q.n_reap = ni; /* pi points ahead to ni */
- pe2->q.n_reap = ci; /* pi2 points ahead to ci */
- if(ci == BottomReap)
- BottomReap = pi;
- if(pi == TopReap)
- TopReap = ci;
- }
-
- void DownReaper(ci)
- I32s ci;
- { I32s pi, ni, ni2; /* 2 previous, previous and next cells in reaper */
- Pcells pe;
- Pcells ce;
- Pcells ne;
- Pcells ne2;
-
- if(ci == BottomReap) return;
- ce = cells + ci; /* ce is cell to be moved down in reaper */
- #ifdef ERROR
- if(ce->q.n_reap == ce->q.p_reap && NumCells > 1)
- { sprintf(mes[0],"Tierra DownReaper() error: cell not in reaper queue");
- if (!hangup)
- FEMessage(1);
- else
- { sprintf(mes[1],"system being saved to disk");
- FEMessage(2);
- }
- while(hangup) ;
- WriteSoup(1);
- exit(0);
- }
- #endif
- ni = ce->q.n_reap; /* ni is index of next cell in reaper */
- ne = cells + ni; /* ne is next cell in reaper */
- ni2 = ne->q.n_reap; /* ni2 is index of 2nd next cell in reaper */
- ne2 = cells + ni2; /* ne2 is 2nd next cell in reaper */
- pi = ce->q.p_reap; /* pi is index of previous cell in reaper */
- pe = cells + pi; /* pe is previous cell in reaper */
- pe->q.n_reap = ni; /* pi points ahead to ni */
- ce->q.n_reap = ni2; /* ci points ahead to ni2 */
- ce->q.p_reap = ni; /* ci points back to ni */
- ne->q.n_reap = ci; /* ni points ahead to ci */
- ne->q.p_reap = pi; /* ni points back to pi */
- ne2->q.p_reap = ci; /* ni2 points back to ci */
- if(ci == TopReap)
- TopReap = ni;
- if(ni == BottomReap)
- BottomReap = ci;
- }
-
- void UpRprIf(ci)
- I32s ci;
- { if((cells + ci)->d.flags >= (cells + (cells + ci)->q.p_reap)->d.flags)
- UpReaper(ci);
- }
-
- void DownReperIf(ci)
- I32s ci;
- { if((cells + ci)->d.flags <= (cells + (cells + ci)->q.n_reap)->d.flags)
- DownReaper(ci);
- }
-
- void EntBotReaper(ci)
- I32s ci;
- { Pcells ce; /* cell to be added to the bottom of reaper queue */
- Pcells be; /* cell presently at bottom of reaper queue */
-
- ce = cells + ci; be = cells + BottomReap;
- #ifdef ERROR
- if(ce->q.n_reap != ce->q.p_reap && NumCells > 1)
- { sprintf(mes[0],
- "Tierra EntBotReaper() error: cell already in reaper queue");
- if (!hangup)
- FEMessage(1);
- else
- { sprintf(mes[1],"system being saved to disk");
- FEMessage(2);
- }
- while(hangup) ;
- WriteSoup(1);
- exit(0);
- }
- #endif
- ce->q.p_reap = BottomReap; /* new cell points back to old BottomReap */
- ce->q.n_reap = 1; /* new cell points ahead to dummy bottom */
- be->q.n_reap = ci; /* old BottomReap cell now points ahead to ce */
- (cells + 1)->q.p_reap = ci;
- BottomReap = ci; /* BottomReap is now ci */
- }
-
- void RmvFrmReaper(ci)
- I32s ci;
- { Pcells ce; /* cell to be removed from reaper queue */
- Pcells nc; /* next cell in reaper queue */
- Pcells pc; /* previous cell in reaper queue */
-
- ce = cells + ci; nc = cells + ce->q.n_reap; pc = cells + ce->q.p_reap;
- #ifdef ERROR
- if(ce->q.n_reap == ce->q.p_reap && NumCells > 1)
- { sprintf(mes[0],
- "Tierra RmvFrmReaper() error: cell not in reaper queue");
- if (!hangup)
- FEMessage(1);
- else
- { sprintf(mes[1],"system being saved to disk");
- FEMessage(2);
- }
- while(hangup) ;
- WriteSoup(1);
- exit(0);
- }
- #endif
- if(ci == TopReap) /* TopReap changed to next cell in queue */
- TopReap = ce->q.n_reap;
- if(ci == BottomReap) /* BottomReap changed to previous cell in queue */
- BottomReap = ce->q.p_reap;
- /* 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 = ci; /* initialize reap queue this cell */
- #ifdef ERROR
- if(ce->q.n_time != ce->q.p_time && NumCells > 1)
- { sprintf(mes[0],
- "Tierra RmvFrmReaper() error: cell still in slicer queue");
- if (!hangup)
- FEMessage(1);
- else
- { sprintf(mes[1],"system being saved to disk");
- FEMessage(2);
- }
- while(hangup) ;
- WriteSoup(1);
- exit(0);
- }
- #endif
- }
-
- void RmvFrmSlicer(ci)
- I32s ci;
- { Pcells ce; /* cell to be removed from slicer queue */
- Pcells nc; /* next cell in slicer queue */
- Pcells pc; /* previous cell in slicer queue */
-
- ce = cells + ci; nc = cells + ce->q.n_time; pc = cells + ce->q.p_time;
- #ifdef ERROR
- if(ce->q.n_time == ce->q.p_time && NumCells > 1)
- { sprintf(mes[0],
- "Tierra RmvFrmSlicer() error: cell not in slicer queue");
- if (!hangup)
- FEMessage(1);
- else
- { sprintf(mes[1],"system being saved to disk");
- FEMessage(2);
- }
- while(hangup) ;
- WriteSoup(1);
- exit(0);
- }
- #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(ci == ThisSlice)
- ThisSlice = ce->q.n_time;
- ce->q.n_time = ce->q.p_time = ci; /* initialize slice queue this cell */
- }
-