/************************************************************************ ** ** FILE : celldel.c ** ** ZWECK : ** ** AUTOR : Michael C. Ancutici ** Universitaet Stuttgart, Fakultaet Informatik ** ** DATUM : 14.03.93 ** *************************************************************************/ #include "celldel.h" #include "cell.H" #include "celltype.h" #include "cellorg.h" #include "cellrefr.h" #include #define CellOListToRList( v) do { \ CellObjToRList( v); \ v = v->next; \ } while (v) /************************************************************************* ** FUNKTION: CellObjDel ** ZWECK: Entfernt ein Objekt aus einer Celle ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void CellObjDel( p, typ, nr) OBJECT **p; char typ; int nr; { register OBJECT *d, *v; OBJECT *vv; int i = 0; vv = v = d = *p; while (d) { if ( (d->Nr1 == nr) && (d->typ == typ) ) break; CellObjToRList( d); vv = v; v = d; d = d->next; i++; } /**** BIS d SIND JETZT ALLE OBJEKTE IN DER REFRESHLISTE ***************/ /**** OBJEKT IN LISTE ? ***********************************************/ if (!d) return; /**** AN 1. STELLE ? **************************************************/ if (i == 0) { if ( !(d->next) ) /* d = ENDSTUECK ? */ *p = NULL; else { /* d = MITTELSTUECK ! */ *p = v = d->next; free( d); CellOListToRList( v); /* REST IN DIE REFRESH-LISTE */ } return; } /**** AN 2. STELLE UND ENDSTUECK ? ************************************/ if ( (i == 1) && ( !(d->next) ) ) { *p = CellGetOrg( v); return; } /**** AB HIER IST *p NICHT MEHR BETROFFEN *****************************/ /**** AN 2. STELLE MITTELSTUECK ODER AN STELLE i >= 3 *****************/ if ( !(d->next) ) /* d = ENDSTUECK ? */ vv->next = CellGetOrg( v); else { /* d = MITTELSTUECK ! */ v->next = vv = d->next; free( d); CellOListToRList( vv); /* REST IN DIE REFRESH-LISTE */ } } /************************************************************************* ** FUNKTION: CellKDel ** ZWECK: Entfernt ein Kanten-Objekt aus einer Celle ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ void CellKDel( p, O) OBJECT **p; OBJECT *O; { register OBJECT *d, *v; OBJECT *vv; int i = 0; vv = v = d = *p; while (d) { if ( (d->typ == O->typ) && (d->Nr1 == O->Nr1) && (d->Nr2 == O->Nr2) ) break; CellObjToRList( d); vv = v; v = d; d = d->next; i++; } /**** BIS d SIND JETZT ALLE OBJEKTE IN DER REFRESHLISTE ***************/ /**** OBJEKT IN LISTE ? ***********************************************/ if (!d) return; /**** AN 1. STELLE ? **************************************************/ if (i == 0) { if ( !(d->next) ) /* d = ENDSTUECK ? */ *p = NULL; else { /* d = MITTELSTUECK ! */ *p = v = d->next; free( d); CellOListToRList( v); /* REST IN DIE REFRESH-LISTE */ } return; } /**** AN 2. STELLE UND ENDSTUECK ? ************************************/ if ( (i == 1) && ( !(d->next) ) ) { *p = CellGetOrg( v); return; } /**** AB HIER IST *p NICHT MEHR BETROFFEN *****************************/ /**** AN 2. STELLE MITTELSTUECK ODER AN STELLE i >= 3 *****************/ if ( !(d->next) ) /* d = ENDSTUECK ? */ vv->next = CellGetOrg( v); else { /* d = MITTELSTUECK ! */ v->next = vv = d->next; free( d); CellOListToRList( vv); /* REST IN DIE REFRESH-LISTE */ } }