Advertisement
shiftry123

lab3 buffer.c

May 2nd, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.87 KB | None | 0 0
  1. #include "buffer.h"
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4.  
  5. char* codes_names[] = { "open", "wait_for_request", "get_request", "find_handler", "send_response", "send_error", "close" };
  6. char* return_codes_names[] = { "error", "no_request", "request_available", "no_handler", "handler_available", "done" };
  7.  
  8. //inkrementacja wskaznika bufora cyklicznego
  9. void increment_pointer(cyclic_buffer* buffer, transition** pointer) {
  10.     if (*(pointer) == buffer->end) {
  11.         (*(pointer)) = buffer->start;
  12.     }
  13.     else {
  14.         (*(pointer))++;
  15.     }
  16. }
  17.  
  18. transition* create_transition(codes c, return_codes rc) {
  19.     transition* new_transition = malloc(sizeof(transition));
  20.     new_transition->current = c;
  21.     new_transition->return_value = rc;
  22.     //funkcja zwraca wskaznik na strukture 'transition'
  23.     return new_transition;
  24. }
  25.  
  26. cyclic_buffer* init_buffer() {
  27.     cyclic_buffer* new_buffer = malloc(sizeof(cyclic_buffer));
  28.     new_buffer->start = &new_buffer->elements[0];
  29.     new_buffer->end = &new_buffer->elements[63];
  30.     new_buffer->write_pointer = new_buffer->start;
  31.     new_buffer->read_pointer = new_buffer->start;
  32.     return new_buffer;
  33. }
  34.  
  35. void write_to_buffer(cyclic_buffer* buffer, transition* element) {
  36.     //tworzenie nowego wskaznika na miejsce do zapisu nowego elementu
  37.     transition* temp = buffer->write_pointer;
  38.     //inkrementacja tymczasowego wskaznika
  39.     increment_pointer(buffer, &temp);
  40.    
  41.     //jesli bufor jest zapelniony to 10 elementow zapisywanych do pliku
  42.     if (temp == buffer->read_pointer) {
  43.         //otwarcie pliku z przejsciami stanow
  44.         FILE* transitions;
  45.         fopen_s(&transitions, "transitions.txt", "w");
  46.         for (int i = 0; i < 10; i++) {
  47.             char file_buffer[64];
  48.             sprintf_s(file_buffer, sizeof(file_buffer), "Current state: %s\nReturn code: %s\n", codes_names[buffer->read_pointer->current], return_codes_names[buffer->read_pointer->return_value]);
  49.             //zapisanie przejscia do pliku
  50.             fputs(file_buffer, transitions);
  51.             //inkrementacja wskaznika odczytu z bufora
  52.             increment_pointer(buffer, &(buffer->read_pointer));
  53.         }
  54.         //zamkniecie pliku
  55.         fclose(transitions);
  56.     }
  57.  
  58.     //zapisanie nowego elementu do bufora
  59.     *(buffer->write_pointer) = *element;
  60.     free(element);
  61.     element = NULL;
  62.  
  63.     //inkrementacja wskaznika zapisu do bufora
  64.     increment_pointer(buffer, &(buffer->write_pointer));
  65. }
  66.  
  67.  
  68. void clean_buffer(cyclic_buffer* buffer) {
  69.     FILE* transitions;
  70.     fopen_s(&transitions, "transitions.txt", "w");
  71.     while(buffer->read_pointer != buffer->write_pointer) {
  72.         char file_buffer[64];
  73.         sprintf_s(file_buffer, sizeof(file_buffer), "Current state: %s\nReturn code: %s\n", codes_names[buffer->read_pointer->current], return_codes_names[buffer->read_pointer->return_value]);
  74.         //zapisanie przejscia do pliku
  75.         fputs(file_buffer, transitions);
  76.         //inkrementacja wskaznika odczytu z bufora
  77.         increment_pointer(buffer, &(buffer->read_pointer));
  78.     }
  79.     //zamkniecie pliku
  80.     fclose(transitions);
  81.     free(buffer);
  82.     buffer = NULL;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement