#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct record
{
   int age;
   char name[12];
   int department;
};

const int size_of_record = 20;

void print_record (struct record a)
{
   printf("Record: age = %10d, name = %12s, department = %10d\n", 
           a.age, a.name, a.department);
}

// constructs an integer out of the contents of four bytes of memory.
int characters_to_integer(char * buffer)
{
   int result;
   memcpy(&result, buffer, 4);
   return result;
}

// stores the four bytes representing an integer into an array of characters.
int integer_to_characters(int number, char * buffer)
{
   memcpy(buffer, &number, 4);
}   

// If a record could not be read, we make result.age = -1, 
// to mark that the record is invalid.
struct record read_record(FILE * file_handle)
{
   struct record result;  

   char input_buffer[size_of_record];
   int items = fread(input_buffer, sizeof(char), size_of_record, file_handle);
   if (items != size_of_record)
   {
      result.age = -1;
      return result;
   }

   result.age = characters_to_integer(& (input_buffer [0]));
   memcpy(result.name, &(input_buffer [4]), 12);
   result.department = characters_to_integer(& (input_buffer [16]));
  
   return result;
}

void save_record(FILE * file_handle, struct record a)
{
   char output_buffer[size_of_record];
   integer_to_characters(a.age, &(output_buffer[0]));
   memcpy(&(output_buffer[4]), a.name, 12);
   integer_to_characters(a.department, &(output_buffer[16]));
   fwrite(output_buffer, sizeof(char), size_of_record, file_handle);
}

// This is a helper function, that can be used 
// (and modified) so as to create some test files.
void helper(char * filename)
{
   FILE * handle = fopen(filename, "wb");
   struct record item;

   item.age = 56;
   strcpy(item.name, "john smith");
   item.department = 6;
   save_record(handle, item);

   item.age = 46;
   strcpy(item.name, "mary jones");
   item.department = 12;
   save_record(handle, item);

   item.age = 36;
   strcpy(item.name, "tim davis");
   item.department = 5;
   save_record(handle, item);

   item.age = 26;
   strcpy(item.name, "pam clark");
   item.department = 10;
   save_record(handle, item);
   
   fclose(handle);
}

// this is the function you need to write, that:
// - takes in a record called "item",
// - does whatever conversions are needed (as specified by the value of number)
// - writes the data to the output handle.
void convert_and_save(struct record item, FILE * output_handle, int number);

int main(int argc, char ** argv)
{
   int number = atoi(argv[1]);
   char * input_file  = argv[2];   
   char * output_file = argv[3];

   
   FILE * input_handle = fopen (input_file, "rb");
   FILE * output_handle = fopen(output_file, "wb");

   while(1)
   {
      struct record item = read_record(input_handle);
      if (item.age == -1)
      {
          break;
      }
      printf("\nread: ");
      print_record(item);
      
      // This is where your function is called.
      convert_and_save(item, output_handle, number);
   }

   fclose(input_handle);
   fclose(output_handle);
   
   return 0;
}
