/* Simple c-program to calculate the DOY (day of year)
   for a given date. Program call is:
   day2doy day month year
   dunzlaff(at)physik.uni-kiel.de
 */

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

int is_leap_year(int year);

main(int argc, char *argv[]) {
  int month_array[12]={0, 31, 28, 31, 30, 31, 30 ,31, 31, 30, 31, 30};
  int day_of_month;
  int month;
  int year;
  int doy=0;
  int i;
 
  if (argc < 2)
    {
      printf("Usage: date2doy day month year\n");
      exit(0);
    }
  
  day_of_month = atoi(argv[1]);
  month = atoi(argv[2]);
  year = atoi(argv[3]);

  if (day_of_month > 30 && month_array[month-1] == 0)
    {
      printf("Illegal date!\n");
      exit(0);
    }

  if (day_of_month > month_array[month-1] && month > 1)
    {
      printf("Illegal date!\n");
      exit(0);
    }

  if (month < 1 || month > 12)
    {
      printf("Illegal date!\n");
      exit(0);
    }

  for (i=0; i <= month-1; i++)
    { 
      doy=doy+month_array[i];
    }
  doy=doy+day_of_month;

  if (month > 2) 
    {
      doy=doy+is_leap_year(year);
    }
  printf("%d\n", doy);
}

int is_leap_year(int year) {
  if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
    return 1;
  else
    return 0;
}
