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

typedef struct {
  int hour, minute, second;
  int day, month, year;
} DateTime;


// allocate the requested space and check the result
void *mymalloc (int size) {
  void *result = malloc (size);

  // assert is a quick and dirty way to do error-checking
  assert (result != NULL);
  return result;
}


// make a new DateTime object
DateTime *make_datetime(int hour, int minute, int second)
{
  DateTime *dt = (DateTime *) mymalloc (sizeof(DateTime));

  dt->hour = hour;
  dt->minute = minute;
  dt->second = second;

  dt->day = 14;
  dt->month = 10;
  dt->year = 1066;          // Battle of Hastings 
}


// compute the difference, in minutes, between two DateTime objects
double diff_datetime(DateTime *d1, DateTime *d2)
{
  int dyear = d1->year - d2->year;
  int dmonth = d1->month - d2->month;
  int dday = d1->day - d2->day;
  int dhour = d1->hour - d2->hour;
  int dminute = d1->minute - d2->minute;
  int dsecond = d1->second - d2->second;

  double diff = 
      dyear * 525948.766 
    + dmonth * 43829.0639
    + dday * 1440
    + dhour * 60
    + dminute
    + dsecond / 60.0;

  return diff;
}

// print the contents of a DateTime object
void print_datetime(DateTime *dt)
{
  printf("%0.2d:%0.2d:%0.2d, %d/%d/%d", dt->hour, dt->minute, dt->second,
	 dt->day, dt->month, dt->year);
}

int main()
{
  DateTime *currenttime = make_datetime(10, 12, 20);
  DateTime *lunchtime = make_datetime(11, 59, 59);

  printf ("The current time is ");
  print_datetime(currenttime);

  printf ("\nLunch time is ");
  print_datetime(lunchtime);

  double minutes = diff_datetime(lunchtime, currenttime);
  printf ("\nThere are %g minutes until lunchtime.\n", minutes);
}

