Advertisement
shiftry123

lab3 main.c

May 2nd, 2017
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.88 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #include "states.h"
  5. #include "buffer.h"
  6.  
  7. //tablica na wskazniki do funkcji obslugujacych stany maszyny
  8. int(*states[])(void) = {
  9.     open_connection_state,
  10.     wait_for_request_state,
  11.     get_request_state,
  12.     find_handler_state,
  13.     send_response_state,
  14.     send_error_state,
  15. };
  16.  
  17. //wskaznik na bufor cykliczny przechowujacy stany i informacje o tym co zwrocily funkcje obslugujace stany
  18. cyclic_buffer* buffer;
  19.  
  20. //funkcja ktora na podstawie parametrow 'current_state' i 'return_code' dobiera odpowiedni stan,
  21. //do ktorego powinna przejsc maszyna
  22. int handle_transition(codes current_state, return_codes return_code) {
  23.     //zapisanie aktualnego stanu i sygnalu do bufora cyklicznego
  24.     write_to_buffer(buffer, create_transition(current_state, return_code));
  25.     if (current_state == open) {
  26.         static int time = 0;
  27.         time++;
  28.         //jesli za dlugo czekanie na polaczenie to timeout
  29.         if (time == 30) {
  30.             time = 0;
  31.             return send_error;
  32.         }
  33.  
  34.         if (return_code == error) return open;
  35.         else if (return_code == done) return wait_for_request;
  36.     }
  37.     else if (current_state == wait_for_request) {
  38.         //zmienna liczaca jak dlugo maszyna stanow jest w stanie czekania na zadanie
  39.         static int time = 0;
  40.         time++;
  41.         //jesli za dlugo czekanie na rzadanie to timeout
  42.         if (time == 10) {
  43.             time = 0;
  44.             return send_error;
  45.         }
  46.         else if (return_code == request_available) return get_request;
  47.         else if (return_code == no_request) return wait_for_request;
  48.     }
  49.     else if (current_state == get_request) {
  50.         if (return_code == done) return find_handler;
  51.         else if (return_code == error) return send_error;
  52.     }
  53.     else if (current_state == find_handler) {
  54.         if (return_code == handler_available) return send_response;
  55.         else if (return_code == no_handler) return send_error;
  56.     }
  57.     else if (current_state == send_response) {
  58.         return close;
  59.     }
  60.     else if (current_state == send_error) {
  61.         return close;
  62.     }
  63.     return 0;
  64. }
  65.  
  66. int main(void) {
  67.  
  68.     //zmienna przechowujaca numer aktualnego stanu
  69.     codes current_state = open;
  70.     //zmienna przechowujaca numer sygnalu zwroconego przez stan
  71.     return_codes return_code;
  72.     //wskaznik na funkcje zwracajaca wartosc 'int' i nie przyjmujaca argumentow
  73.     int(*state_handler)(void);
  74.     //incjalizacja bufora cyklicznego
  75.     buffer = init_buffer();
  76.  
  77.     //glowna petla programu
  78.     while (1) {
  79.         //jesli aktualny stan to stan wyjsciowy to koniec programu
  80.         if (current_state == close) {
  81.             //niezapisane wartosci z bufora zapisywane do pliku
  82.             clean_buffer(buffer);
  83.             break;
  84.         }
  85.         //dobieranie odpowiedniej funkcji obslugujacej stan na podstawie kodu aktualnego stanu
  86.         state_handler = states[current_state];
  87.         //sygnal zwrocony przez funkcje
  88.         return_code = (return_codes)state_handler();
  89.         //dobranie odpowiedniego stanu na podstawie kodu stanu aktualnego i kodu zwroconego sygnalu
  90.         current_state = handle_transition(current_state, return_code);
  91.     }
  92.  
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement