|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 3523 (0xdc3) Types: TextFile Names: »cvmove.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Crystal/cvmove.c«
/* cvmove.c * various object motion subroutines *************************************************************************/ #include <stdio.h> #include "cvobj.h" #include "cvlocs.h" extern void bug() ; extern int holding ; /* start toting an object, removing it from the list of things at its * former location. Increment 'holding' unless it was already being * toted. * Primarily used by move(). */ void carry(obj) register struct cvobj *obj; { register struct cvloc *from; register struct conn *this; from = obj->conn1.where ; obj->conn1.where = TAKEN ; if (from == TAKEN) return ; ++holding ; if (from != (struct cvloc *) NULL) { for ( this = &(from->atloc); this->link != &(obj->conn1); this = this->link) if (this->link == NULL) bug(30); this->link = obj->conn1.link ; } obj->conn1.link = NULL ; return; } /* pick up an object by its second location, removing it from the list * of things at its former location. * Primarily used by move2(). */ static void carry2(obj) register struct cvobj *obj; { register struct cvloc *from; register struct conn *this; from = obj->conn2.where ; obj->conn2.where = TAKEN ; if (from == TAKEN) return ; if (from != (struct cvloc *) NULL) { for ( this = &(from->atloc); this->link != &(obj->conn2); this = this->link) if (this->link == NULL) bug(30); this->link = obj->conn2.link ; } obj->conn2.link = NULL ; return; } \f /* place any object anywhere by picking it up and dropping it. * may already be toting it, in which case the carry is a no-op. * * to move the second place of an object, use the object's number plus * OBJSIZ as the object. * * 'move' may be called regardless of where the object was, whether * it's being carried, is lost, is destroyed, or whatever. */ void move(obj,toloc) register struct cvobj *obj; register struct cvloc *toloc; { register struct cvloc *from; from = obj->conn1.where ; if ((from != LOST) && (from != TAKEN)) carry(obj); if (obj->conn1.where == TAKEN) --holding ; obj->conn1.where = toloc ; if (toloc == LOST) return ; obj->conn1.link = toloc->atloc.link ; toloc->atloc.link = &(obj->conn1) ; return; } /* place any object anywhere by picking it up and dropping it by its * second location. May already be toting it, in which case the carry * is a no-op. * * 'move2' may be called regardless of where the object was, whether * it's being carried, is lost, is destroyed, or whatever. */ void move2(obj,toloc) register struct cvobj *obj; register struct cvloc *toloc; { register struct cvloc *from; from = obj->conn2.where ; if ((from != LOST) && (from != TAKEN)) carry2(obj); if (obj->conn2.where == TAKEN) --holding ; obj->conn2.where = toloc ; if (toloc == LOST) return ; obj->conn2.link = toloc->atloc.link ; toloc->atloc.link = &(obj->conn2) ; return; } /* juggle an object by picking it up and putting it down again, the * purpose being to get the object to the front of the chain of things * at its location. */ void juggle(obj) register struct cvobj *obj; { register struct cvloc *where; where = obj->conn1.where ; if (where == NULL) bug(33); move(obj,where); return; } void juggl2(obj) register struct cvobj *obj; { register struct cvloc *where; where = obj->conn2.where ; if (where == NULL) bug(33); move2(obj,where); return; } /* destroy the object by dropping at an inaccessable place */ void destry(obj) register struct cvobj *obj; { move(obj,LOST); } void destr2(obj) register struct cvobj *obj ; { move2(obj,LOST); }