#include <stdio.h>
#include <stdlib.h>

#include "address.h"

char * copy_string(char * input)
{
  int length = string_length(input);
  char * result = (char *) malloc(sizeof(char) * (length + 1));

  int i;
  for (i = 0; i <= length; i++)
  {
    result[i] = input[i];
  }

  return result;
}


int string_length(char * my_string)
{
  int counter = 0;
  while(1)
  {
    if (my_string[counter] != 0)
    {
      counter++;
    }
    else
    {
      break;
    }
  }

  return counter;
}


void input_address(struct address * a1)
{
  char buffer[1000];

  printf("enter street number:\n");
  scanf("%d", &a1->street_number);

  printf("enter street name:\n");
  scanf("%s", buffer);
  a1->street_name = copy_string(buffer);

  printf("enter city:\n");
  scanf("%s", buffer);
  a1->city = copy_string(buffer);

  printf("enter state:\n");
  scanf("%s", buffer);
  a1->state = copy_string(buffer);

}


void print_address(struct address a1)
{
  printf("%d %s, %s, %s\n\n", a1.street_number, a1.street_name, a1.city, a1.state);
}


struct address shallow_copy(struct address a1)
{
  struct address result = a1;
  return result;
}


struct address deep_copy(struct address a1)
{
  struct address result = a1;
  result.street_name = copy_string(a1.street_name);
  result.city = copy_string(a1.city);
  result.state = copy_string(a1.state);
  return result;
}


void foo1(struct address * a1)
{
  a1->street_number = 20;
}


void foo2(struct address a1)
{
  a1.street_name[0] = 'X';
}


void foo3(struct address * a1)
{
  free(a1->state);
  a1->state = copy_string("Massachusetts");
}


int main()
{
  struct address a1;
  input_address(&a1);

  // backup plan: if you cannot get input_address to work, just use the next lines:
  // a1.street_number = 20;
  // a1.street_name = copy_string("No_Name_Street");
  // a1.city = copy_string("Arlington");
  // a1.state = copy_string("Texas");

  printf("a1, at step 0:\n");
  print_address(a1);

  foo1(&a1);
  printf("a1, at step 1:\n");
  print_address(a1);

  struct address a2 = shallow_copy(a1);
  struct address a3 = deep_copy(a1);

  foo2(a2);
  printf("a2, at step 2:\n");
  print_address(a2);

  foo3(&a3);
  printf("a3, at step 3:\n");
  print_address(a3);

  free(a1.street_name);
  free(a1.city);
  free(a1.state);
  free(a3.street_name);
  free(a3.city);
  free(a3.state);
}


