#include <stdio.h>
#include <time.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char** argv){
  if (argc<5){printf("Please add input file and three output files to command line arguments\n");exit(1);}

  int run=1;  // How many times to copy the input file for each test
  int bufsz=5;
  char array[bufsz];
  int b=0;
  int i;
  time_t unbuf_s,unbuf_e,buf1_s,buf1_e,buf2_s,buf2_e;
  FILE * read_f;
  FILE * write_f;

  //Unbuffered IO
  printf("Unbuffered\n");
  int read_fd=open(argv[1],O_RDONLY);
  int write_fd=open(argv[2],O_WRONLY | O_CREAT);
  unbuf_s=time(NULL);
  for(i=0; i<run; i++){
  do{
    b=read(read_fd, array, bufsz);
    write(write_fd, array, b);
  }while (b>0);
  lseek(read_fd, 0, SEEK_SET);
  }
  unbuf_e=time(NULL);
  close(read_fd);
  close(write_fd);

  //Buffered IO with flushing
  printf("Buffered with flushing\n");
  read_f = fopen(argv[1],"r");
  write_f = fopen(argv[3],"w");
  buf1_s=time(NULL);
  for(i=0; i<run; i++){
  do{
    b=fread(array, 1, bufsz-1, read_f);
    array[b]='\0';
    fwrite(array, 1, b, write_f);
    fflush(write_f);
  }while(!feof(read_f));
  fseek(read_f,0,SEEK_SET);
  }
  buf1_e=time(NULL);
  fclose(read_f);
  fclose(write_f);

  //Buffered IO without flushing
  printf("Buffered without flushing\n");
  read_f = fopen(argv[1],"r");
  write_f = fopen(argv[4],"w");
  buf2_s=time(NULL);
  for(i=0; i<run; i++){
  do{
    b=fread(array, 1, bufsz-1, read_f);
    array[b]='\0';
    fwrite(array, 1, b, write_f);
  }while(!feof(read_f));
  fseek(read_f,0,SEEK_SET);
  }
  buf2_e=time(NULL);
  printf("DONE\n");
  fclose(read_f);
  fclose(write_f);


  printf("Time for Unbuffered:\t\t%d sec\nTime for Buffered with flush:\t%d sec\nTime for Buffered w/o flush:\t%d sec\n",
          unbuf_e - unbuf_s, buf1_e - buf1_s, buf2_e - buf2_s);

  return 0;
}