int geteventn() { bitmask = 1; // 0x000000001 (ustawiony tylko pierwszy bit) state_events = events & getmask(state); // getmask zwraca maske aktywnych zdarzen w danym stanie for (i = 0; i < EVENTS_SIZE; i++) { if (state_events & bitmask) // sprawdza czy to zdarzenie jest aktywne { events &= ~bitmask; // jesli jest aktywne to usuwa go z zadan do wykonania i zwraca jego indeks return i; } bitmask <<= 1; // przesuwamy maske, będziemy sprawdzac kolejne zdarzenie } return ~0; // zwraca same 1 (FF) jesli nie wejdzie do tego wczesniejszego returna } int main() { do { key = 0; if ((key = getch() != -1) { if (key == 'A') do_sth1(); if (key == 'B') do_sth2(); } if ((event = geteventn()) != ~0) // dekoder (geteventn zwraca same 1, jezeli nie ma zadnego zdarzenia do wykonania, lub indeks zdarzenia) { // dispatcher last_event = event; last_state = state; (*(state_table[event][state].action))(); // reagujemy na dane zdarzenie wywołując akcje state = state_table[event][state].nextstate; // przechodzimy do kolejnego stanu if (state != last_state) // jezeli zmienilismy stan to zerujemy zmienna events, bo w nowym stanie to zdarzenie moze nie byc juz aktywne events = 0; } } while (true); return 0; }