/*  d2d (simple frontend for _date2day_)
    (c) Armin.Obersteiner@giga.or.at

    input: <day>.<month>.<year>
    output: Monday-Sunday, Error
*/

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

char *d[7]=
    {
        "Monday",
        "Tuesday",
        "Wednesday",
        "Thursday",
        "Friday",
        "Saturday",
        "Sunday"
    };
 
char prg[256];

int date2day(int day,int month,int year);
int sjahr(int year);

void main(int argc, char *argv[])
{
  int day,month,year;
  char da[10],mo[10],ye[20];

  if(argc!=2)
   {
      printf("USAGE: %s <day>.<month>.<year>\n",argv[0]);
      printf("       example: %s 27.3.1995\n",argv[0]);
      printf("       first usable date: 1.1.1801\n");
   }
   else
   {
      int h;

      strcpy(prg,argv[0]);

      strcpy(da,strtok(argv[1],"."));
      strcpy(mo,strtok(NULL,"."));
      strcpy(ye,strtok(NULL," \0\n"));

      day=atoi(da);
      month=atoi(mo);
      year=atoi(ye);

      h=date2day(day,month,year);

      if(h)
      {
           printf("%s\n",d[h-1]);
      }
      else
      {
           printf("Date NOT valid !!\n");
      }
   }
}

/*  date2day
    (c) Armin.Obersteiner@giga.or.at

    input: <int> day,month,year
    output:<int> 0,1-7

    0: error (before 1.1.1801 - this should be enough
              if somebody knows a "day" before that please mail it to me)

    1-7: Monday-Sunday
*/

int date2day(int day,int month,int year)
{
    int md[12]={31,28,31,30,31,30,31,31,30,31,30,31};
 
    int j,i=0;
    int jahr=0;
    int s;

    if(year<1801) return 0;
    if( (month<1) || (month>12) ) return 0;
    if(day<1) return 0;
 
    s=sjahr(year);

    if( (day>md[month-1]) )
    {
        if(!s) return 0;
        if( (s) && (month=2) && (day>29) ) return 0;
    }

    for(j=1801;j<year;j++) if(sjahr(j)) i++;

    jahr=(year-1801)*365+i+day;

    for(i=1;i<month;i++) jahr=jahr+md[i-1];
    if(s && (month>2)) jahr=jahr+1;

    switch((int)fmod((double)jahr,(double)7))
    {
        case 0: return 4;	 /* 1.1.1801 is a Thursday ->4 */
                    break;
        case 1: return 5;  
                    break;
        case 2: return 6;
                    break;
        case 3: return 7;
                    break;
        case 4: return 1;
                    break;
        case 5: return 2;
                    break;
        case 6: return 3;
                    break;
    }
}

/*  sjahr
    (c) Armin.Obersteiner@giga.or.at

    input:  <int> year
    output: <int> 0,1

    0: normal year
    1: leap-year
*/

int sjahr(int year)
{
    int schalt=0;

    if(fmod((double)year,(double)4)==0) schalt=1;
    if(fmod((double)year,(double)100)==0) if(fmod((double)year,(double)400)!=0) schalt=0;

    return schalt;
}

