void* stack_pop(stack_t* s) { void* ret = list_getElem((list_t*)s, 0, true); list_remove((list_t*)s, ret); return ret; }
void stack_onEvent(void * sub, stack_t * sender, enum event_type type, int last_val) { int count; char message[80]; stack_t * stmp; stmp = (stack_t *)sub; if(type == OVER) { if(stmp->top < STACK_MAX_SIZE - 1) { sprintf(message, "Event OVER: Stack %i is FULL.\n", sender->num); printf(message); stack_push(stmp, last_val); } else { //Sub stack1 count = list_getCount(stmp->dual); for(int i = 0; i < count; i++) { event_t * ev = list_getElem(stmp->dual, i); if(ev->callback != NULL) { cb_fn fn = (cb_fn)ev->callback; sprintf(message, "%s", (char *)ev->receiver); fn(ev->receiver, stmp, DUAL, 1); } } //Sub stack 2 count = list_getCount(sender->dual); for(int i = 0; i < count; i++) { event_t * ev = list_getElem(sender->dual, i); if(ev->callback != NULL) { cb_fn fn1 = (cb_fn)ev->callback; sprintf(message, "%s", (char *)ev->receiver); fn1(ev->receiver, sender, DUAL, 1); } } } } if(type == EMPTY) { if(stmp->top >= STACK_MAX_SIZE) { sprintf(message, "Event EMPTY: Stack %i is EMPTY\n", sender->num); printf(message); stack_push(sender, stack_pop(stmp)); } else { //Sub stack1 count = list_getCount(stmp->dual); for(int i = 0; i < count; i++) { event_t * ev = list_getElem(stmp->dual, i); if(ev->callback != NULL) { cb_fn fn = (cb_fn)ev->callback; sprintf(message, "%s", (char *)ev->receiver); fn(ev->receiver, stmp, DUAL, 0); } } //Sub stack 2 count = list_getCount(sender->dual); for(int i = 0; i < count; i++) { event_t * ev = list_getElem(sender->dual, i); if(ev->callback != NULL) { cb_fn fn1 = (cb_fn)ev->callback; sprintf(message, "%s", (char *)ev->receiver); fn1(ev->receiver, sender, DUAL, 0); } } } } if(type == DUAL) { user_t * user = (user_t *)sub; if(last_val) sprintf(message, "Event DUAL: User %s. Stack %i is FULL.\n", user->name, sender->num); else sprintf(message, "Event DUAL: User %s. Stack %i is EMPTY.\n", user->name, sender->num); printf(message); } }
void* stack_get(stack_t* s) { return list_getElem((list_t*)s, 0, false); }