rem: } }   rec = WMHashGet(notificationCenter->observerTable, observer);  if (rec == orec) { if (orec->nextAction) { WMHashInsert(notificationCenter->nameTable, observer, orec->nextAction); } else { WMHashRemove(notificationCenter->nameTable, observer);
context: WMRemoveNotificationObserverWithName(void *observer, char *name, void *object){    NotificationObserver *orec, *tmp, *rec;    /* get the list of actions the observer is doing */    orec = WMHashGet(notificationCenter->observerTable, observer);    while (orec) {	tmp = orec->nextAction;	if (orec->name == name && orec->object == object) {	    if (!name && !object) {		if (notificationCenter->nilList == orec)		    notificationCenter->nilList = orec->next;	    } else if (!name) {		rec = WMHashGet(notificationCenter->objectTable, orec->object);		if (rec==orec) {		    assert(rec->prev==NULL);		    /* replace table entry */		    if (orec->next) {			WMHashInsert(notificationCenter->objectTable, orec->object,				     orec->next);		    } else {			WMHashRemove(notificationCenter->objectTable, 				     orec->object);		    }		}	    } else {		rec = WMHashGet(notificationCenter->nameTable, orec->name);		if (rec==orec) {		    assert(rec->prev==NULL);		    /* replace table entry */		    if (orec->next) {			WMHashInsert(notificationCenter->nameTable, orec->name,				     orec->next);		    } else {			WMHashRemove(notificationCenter->nameTable, orec->name);		    }		}	    }	    	    /* update the action list for the observer */	    rec = WMHashGet(notificationCenter->observerTable, observer);	    	    if (rec == orec) {		if (orec->nextAction) {		    WMHashInsert(notificationCenter->nameTable, observer,				 orec->nextAction);		} else {		    WMHashRemove(notificationCenter->nameTable, observer);		}	    }	    if (orec->prev)		orec->prev->next = orec->next;	    if (orec->next)		orec->next->prev = orec->prev;	    free(orec);	}	orec = tmp;    }}