Advertisement
Guest User

Untitled

a guest
May 22nd, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. #define BLOCK_DIM     64 // dimensione di un blocco di caratteri
  7. #define BUFFER_BLOCKS 16 // blocchi di caratteri in un buffer
  8.  
  9. // cifrario a trasposizione di Giulio Cesare
  10. char GC(char c, int N)
  11. {
  12.  N = N%26; // normalizzazione trasposizione
  13.  
  14.  if (c >= 'a' && c <= 'z')
  15.    {
  16.     c = c + N;
  17.     if (c > 'z')
  18.       c = 'a' + (c - 'z') - 1;
  19.     return c;
  20.    }
  21.  if (c >= 'A' && c <= 'Z')
  22.    {
  23.     c = c + N;
  24.     if (c > 'Z')
  25.       c = 'A' + (c - 'Z') - 1;
  26.     return c;
  27.    }
  28.  return c;
  29. }
  30.  
  31.  
  32. FILE *origine, *destinazione;
  33. int eof_flag;
  34. char input_buffer[BUFFER_BLOCKS*BLOCK_DIM];
  35. int input_buffer_write_index; // indice per la scrittura nel buffer
  36. int input_buffer_read_index; // indice per la lettura dal buffer
  37. int input_buffer_count; // numero di blocchi nel buffer
  38. char output_buffer[BUFFER_BLOCKS*BLOCK_DIM];
  39. int output_buffer_write_index; // indice per la scrittura nel buffer
  40. int output_buffer_read_index; // indice per la lettura dal buffer
  41. int output_buffer_count; // numero di blocchi nel buffer
  42. int N; // valore della trasposizione di Cesare
  43.  
  44. // oggetti per implementazione sezioni critiche di codice
  45. CRITICAL_SECTION input_buffer_mutex;
  46. CRITICAL_SECTION output_buffer_mutex;
  47.  
  48.  
  49. unsigned long WINAPI read_thread(void* arg) // lettura da file
  50. {
  51.  int count;
  52.  
  53.  // lettura di un blocco di dati dal file
  54.  memset(&input_buffer[input_buffer_write_index*BLOCK_DIM], 0, BLOCK_DIM);
  55.  fread(&input_buffer[input_buffer_write_index*BLOCK_DIM], BLOCK_DIM, 1, origine);
  56.  EnterCriticalSection(&input_buffer_mutex);
  57.  // incremento indice di scrittura nel buffer di input
  58.  input_buffer_write_index = ( input_buffer_write_index + 1) % BUFFER_BLOCKS;
  59.  // incremento contatore blocchi di dati nel buffer di input
  60.  input_buffer_count++;
  61.  LeaveCriticalSection(&input_buffer_mutex);
  62.  while (!feof(origine))
  63.       {
  64.        // attesa disponibilita’ spazio nel buffer per nuovi dati
  65.        do {
  66.            EnterCriticalSection(&input_buffer_mutex);
  67.            count = input_buffer_count;
  68.            LeaveCriticalSection(&input_buffer_mutex);
  69.           } while (count >= BUFFER_BLOCKS);
  70.        // lettura di un blocco di dati dal file
  71.        memset(&input_buffer[input_buffer_write_index*BLOCK_DIM], 0, BLOCK_DIM);
  72.        fread(&input_buffer[input_buffer_write_index*BLOCK_DIM], BLOCK_DIM, 1, origine);
  73.        EnterCriticalSection(&input_buffer_mutex);
  74.        // incremento indice di scrittura nel buffer di input
  75.        input_buffer_write_index = (input_buffer_write_index + 1) % BUFFER_BLOCKS;
  76.        // incremento contatore blocchi dati nel buffer di input
  77.        input_buffer_count++;
  78.        LeaveCriticalSection(&input_buffer_mutex);
  79.       }
  80.  // attesa elaborazione dati presenti nel buffer di input
  81.  do {
  82.      EnterCriticalSection(&input_buffer_mutex);
  83.      count = input_buffer_count;
  84.      LeaveCriticalSection(&input_buffer_mutex);
  85.     } while (count > 0);
  86.  // attesa scrittura dati presenti nel buffer di output
  87.  do {
  88.      EnterCriticalSection(&output_buffer_mutex);
  89.      count = output_buffer_count;
  90.      LeaveCriticalSection(&output_buffer_mutex);
  91.     } while (count > 0);
  92.  eof_flag = TRUE;
  93.  ExitThread(0);
  94. }
  95.  
  96. unsigned long WINAPI process_thread(void* arg) // elaborazione dati
  97. {
  98.  int in_count, out_count, i;
  99.  
  100.  while (!eof_flag)
  101.       {
  102.        // verifica presenza dati nel buffer di lettura e disponbilita’ spazio nel buffer per scrittura nuovi dati
  103.        EnterCriticalSection(&input_buffer_mutex);
  104.        in_count = input_buffer_count;
  105.        LeaveCriticalSection(&input_buffer_mutex);
  106.        EnterCriticalSection(&output_buffer_mutex);
  107.        out_count = output_buffer_count;
  108.        LeaveCriticalSection(&output_buffer_mutex);
  109.        if (in_count>0 && out_count<BUFFER_BLOCKS)
  110.          {
  111.           for (i=0; i<BLOCK_DIM; i++)
  112.              //output_buffer[output_buffer_write_index*BLOCK_DIM+i] = input_buffer[input_buffer_read_index*BLOCK_DIM+i];
  113.              output_buffer[output_buffer_write_index*BLOCK_DIM+i] = GC(input_buffer[input_buffer_read_index*BLOCK_DIM+i], N);
  114.           EnterCriticalSection(&input_buffer_mutex);
  115.           // incremento indice di lettura nel buffer di input
  116.           input_buffer_read_index = (input_buffer_read_index + 1) % BUFFER_BLOCKS;
  117.           // decremento contatore blocchi dati nel buffer di input
  118.           input_buffer_count--;
  119.           LeaveCriticalSection(&input_buffer_mutex);
  120.           EnterCriticalSection(&output_buffer_mutex);
  121.           // incremento indice di scrittura nel buffer di output
  122.           output_buffer_write_index = (output_buffer_write_index + 1) % BUFFER_BLOCKS;
  123.           // incremento contatore blocchi dati nel buffer di output
  124.           output_buffer_count++;
  125.           LeaveCriticalSection(&output_buffer_mutex);
  126.          }
  127.       }
  128.  ExitThread(0);
  129. }
  130.  
  131. unsigned long WINAPI write_thread(void* arg) // scruttura su file
  132. {
  133.  int count;
  134.  while (!eof_flag)
  135.       {
  136.        // verifica presenza dati nel buffer di scrittura
  137.        EnterCriticalSection(&output_buffer_mutex);
  138.        count = output_buffer_count;
  139.        LeaveCriticalSection(&output_buffer_mutex);
  140.        if (count>0)
  141.          {
  142.           // scrittura di un blocco di caratteri nel file
  143.           fwrite(&output_buffer[output_buffer_read_index*BLOCK_DIM], BLOCK_DIM, 1, destinazione);
  144.           EnterCriticalSection(&output_buffer_mutex);
  145.           // incremento indice di lettura nel buffer di output
  146.           output_buffer_read_index = (output_buffer_read_index + 1) % BUFFER_BLOCKS;
  147.           // decremento contatore blocchi dati nel buffer di output
  148.           output_buffer_count--;
  149.           LeaveCriticalSection(&output_buffer_mutex);
  150.          }
  151.        }
  152.  ExitThread(0);
  153. }
  154.  
  155.  
  156.  
  157.  
  158. void main (int argc, char* argv[])
  159. {
  160.  HANDLE R_thread, P_thread, W_thread;
  161.  
  162.  if (argc != 4)
  163.    {
  164.     printf( "Uso: %s file-origine file-destinazione valore-trasposizione\r\n",argv[0]);
  165.     return;
  166.    }
  167.  // apertura in lettura file di origine
  168.  origine = fopen(argv[1], "rb");
  169.  if (origine == NULL)
  170.    {
  171.     printf("Errore apertura file \"%s\"\r\n",argv[1]);
  172.     return;
  173.    }
  174.  // apertura in scrittura file di destinazione
  175.  destinazione = fopen(argv[2], "wb");
  176.  if (destinazione == NULL)
  177.    {
  178.     printf("Errore apertura file \"%s\"\r\n",argv[2]);
  179.     fclose(origine);
  180.     return;
  181.    }
  182.  // impostazione valore trasposizione
  183.  N = atoi(argv[3]);
  184.  
  185.  input_buffer_count = 0;
  186.  input_buffer_write_index = 0;
  187.  input_buffer_read_index = 0;
  188.  output_buffer_count = 0;
  189.  output_buffer_write_index = 0;
  190.  output_buffer_read_index = 0;
  191.  eof_flag = FALSE;
  192.  // creazione degli oggetti mutex per l’accesso alle sezioni critiche
  193.  InitializeCriticalSection(&input_buffer_mutex);
  194.  InitializeCriticalSection(&output_buffer_mutex);
  195.  // creazione dei thread corrispondenti alle funzioni di lettura, elaborazione e scrittura
  196.  R_thread = CreateThread(NULL, 1024, &read_thread, NULL, 0, NULL);
  197.  P_thread = CreateThread(NULL, 1024, &process_thread, NULL, 0, NULL);
  198.  W_thread = CreateThread(NULL, 1024, &write_thread, NULL, 0, NULL);
  199.  // attesa della terminazione dei thread
  200.  WaitForSingleObject(R_thread, INFINITE);
  201.  WaitForSingleObject(P_thread, INFINITE);
  202.  WaitForSingleObject(W_thread, INFINITE);
  203.  // distruzione oggetti mutex per accesso sezioni critiche
  204.  DeleteCriticalSection(&input_buffer_mutex);
  205.  DeleteCriticalSection(&output_buffer_mutex);
  206.  // chiusura file
  207.  fclose(origine);
  208.  fclose(destinazione);
  209.  return;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement