/************************************************************************ ** ** FILE : cellget.c ** ** ZWECK : ** ** AUTOR : Michael C. Ancutici ** Universitaet Stuttgart, Fakultaet Informatik ** ** DATUM : 14.03.93 ** *************************************************************************/ #include "cellget.h" #include "cell.H" #include "cell.h" #include static OBJECT *pSte, *pTra, *pK; /************************************************************************* ** FUNKTION: PutInList ** ZWECK: ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ static void PutInList( p, typ, nr1, nr2) OBJECT **p; char typ; int nr1, nr2; { OBJECT *g, *v; g = v = *p; /**** WENN OBJEKT NICHT IN LISTE GEHE BIS ZUM ENDE *******************/ while (g) { if ( (g->Nr1 == nr1) && (g->Nr2 == nr2) ) return; v = g; g = g->next; } /**** OBJEKT AN DAS ENDE DER LISTE ANHAENGEN *************************/ g = (OBJECT *)malloc( sizeof( OBJECT)); g->typ = typ; g->Nr1 = nr1; g->Nr2 = nr2; g->next = NULL; /**** ACHTUNG TRICK ! ************************************************/ if (*p) v->next = g; else *p = g; } /************************************************************************* ** FUNKTION: GetCellInhalt ** ZWECK: ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ static char GetCellInhalt( p) OBJECT *p; { char ret = (char) NULL; while (p) { switch (p->typ) { case CE_STELLE: PutInList( &pSte, (ret = CE_STELLE), p->Nr1, 0); break; case CE_TRANSITION: PutInList( &pTra, (ret = CE_TRANSITION), p->Nr1, 0); break; case CE_ST_KANTE: PutInList( &pK, (ret = CE_ST_KANTE), p->Nr1, p->Nr2); break; case CE_TS_KANTE: PutInList( &pK, (ret = CE_TS_KANTE), p->Nr1, p->Nr2); break; } p = p->next; } return ret; } /************************************************************************* ** FUNKTION: AnzObjInList ** ZWECK: ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ static int AnzObjInList( p) OBJECT *p; { int i = 0; while (p) { i++; p = p->next; } return i; } /************************************************************************* ** FUNKTION: CellGetForLook ** ZWECK: ** EINGABE: ** AUSGABE: ** RETURN: ** ANMERK: *************************************************************************/ int CellGetForLook( mx, my, p) int mx, my; OBJECT **p; { int cx = CellXKoord( mx); int cy = CellYKoord( my); int cx1, cx2, cy1, cy2; int x, y; cx1 = (cx > 0) ? cx-1 : cx; cx2 = (cx < CELL_WIDTH-1) ? cx+1 : cx; cy1 = (cy > 0) ? cy-1 : cy; cy2 = (cy < CELL_HEIGHT-1) ? cy+1 : cy; pSte = pTra = pK = NULL; if ( GetCellInhalt( Cell[ cx][ cy]) ) { if (pSte) *p = pSte; else if (pTra) *p = pTra; else *p = pK; return ( AnzObjInList( *p)); } for (x=cx1; x<=cx2; x++) for (y=cy1; y<=cy2; y++) GetCellInhalt( Cell[ x][ y]); if (pSte) *p = pSte; else if (pTra) *p = pTra; else *p = pK; return ( AnzObjInList( *p)); }