 #include <stdio.h>
 #include "Date.h"
 #ifdef _AMIGA
   #ifdef LIBTEST
     #include "Date_pragmas.h"
     #include <proto/exec.h>
   #endif
 #endif


 int readintyear(void)

 {
  int year=0;

  printf("(integer)year: ");
  scanf("%d",&year);
  return(year);
 }


 unsigned short readshortcardmonth(void)

 {
  unsigned int month=0;

  printf("(shortcard)month: ");
  scanf("%u",&month);
  return((unsigned short)month);
 }


 unsigned short readshortcardday(void)

 {
  unsigned int day=0;

  printf("(shortcard)day: ");
  scanf("%u",&day);
  return((unsigned short)day);
 }


 Weekdays readweekday(void)

 {
  unsigned int wday=0;

  do
   {
    printf("weekday: 1=Monday; ...7=Sunday: ");
    scanf("%u",&wday);
   }
  while (wday > 7);
  return((Weekdays)wday);
 }


 int readintdays(void)

 {
  int days=0;

  printf("(integer)days: ");
  scanf("%d",&days);
  return(days);
 }


 unsigned int readcardyear(void)

 {
  unsigned int year=0;

  printf("(cardinal)year: ");
  scanf("%u",&year);
  return(year);
 }


 unsigned long readlongcarddays(void)

 {
  unsigned long day=0;

  printf("(longcard)days: ");
  scanf("%lu",&day);
  return(day);
 }


 unsigned short readshortcardhour(void)

 {
  unsigned int hour=0;

  printf("(shortcard)hour: ");
  scanf("%u",&hour);
  return((unsigned short)hour);
 }


 unsigned short readshortcardmin(void)

 {
  unsigned int min=0;

  printf("(shortcard)min: ");
  scanf("%u",&min);
  return((unsigned short)min);
 }


 unsigned short readshortcardsec(void)

 {
  unsigned int sec=0;

  printf("(shortcard)sec: ");
  scanf("%u",&sec);
  return((unsigned short)sec);
 }


 float readrealtime(void)

 {
  float jd=0.0;

  printf("(real)time: ");
  scanf("%f",&jd);
  return(jd);
 }


 short readshortintdegree(void)

 {
  int degree=0;

  printf("(shortint)degree: ");
  scanf("%d",&degree);
  return((short)degree);
 }


 unsigned long readlongcardsecs(void)

 {
  unsigned long secs=0;

  printf("(longcard)secs: ");
  scanf("%lu",&secs);
  return(secs);
 }


 float readrealmeridian(void)

 {
  float jd=0.0;

  printf("(real)meridian: ");
  scanf("%f",&jd);
  return(jd);
 }


 float readrealpos(void)

 {
  float jd=0.0;

  printf("(real)ps: ");
  scanf("%f",&jd);
  return(jd);
 }


 Languages readlanguage(void)
  {
   unsigned int lang=0;

  do
   {
    printf("language: 0=locale.library; 1=English; 2=Deutsch; 3=francais; 4=espanol; 5=portugues; 6=dansk 7=italiano 8=nederlands 9=norsk 10=svenska 11=polski 12=suomalainen: ");
    scanf("%u",&lang);
   }
  while (lang > 10);
  return((Languages)lang);
  }


 unsigned long readjd(void)
  {
   unsigned long jd=0;

   printf("(unsigned long)jd: ");
   scanf("%lu",&jd);
   return(jd);
  }


 MoonPhases readmoonphase(void)

 {
  unsigned int moon=0;

  do
   {
    printf("moon: 0=new; 1=first quarter; 2=full; 3=last quarter: ");
    scanf("%u",&moon);
   }
  while (moon > 3);
  return((MoonPhases)moon);
 }


 DateTexts readdt(void)
  {
   unsigned int dt=0;

  do
   {
    printf("date text: 0=DAY; 1=MONTH; 2=YEAR; 3=WEEK; 4=WEEKDAY; 5=HOUR; 6=MINUTE; 7=SECOND; 8=YESTERDAY; 9=TODAY; 10=TOMORROW : ");
    scanf("%u",&dt);
   }
  while (dt > 10);
  return((DateTexts)dt);
  }


 bool readplural(void)
  {
   unsigned int plural;

  do
   {
    printf("plural: 0=false; 1=true: ");
    scanf("%u",&plural);
   }
  while (plural > 1);
  return((bool)plural);
  }


 long readlongsecs(void)

 {
  long secs=0;

  printf("secs: ");
  scanf("%ld",&secs);
  return(secs);
 }


 void main(void)

 {
  unsigned int		input=0,repeat=0;
  Weekdays		wd;
  unsigned short	d=0,m=0,h=0,s=0,len,d2,m2,h2,s2;
  int			y=0,y2;
  char                  text[20];
  unsigned long		jd;
  long			secs;

  #ifndef __SASC_650
    _DateInit();
  #endif
  #ifdef _AMIGA
    #ifdef LIBTEST
      static struct Library *DateBase;

      DateBase = OpenLibrary("date.library",0);
      if (DateBase != NULL)
       {
    #endif
  #endif
  do
   {
    printf("----------------------------------------------------------------\n");
    printf("01 : JulianLeapYear            | 02 : GregorianLeapYear\n");
    printf("03 : HeisLeapYear              | 04 : JulianMonthDays\n");
    printf("05 : GregorianMonthDays        | 06 : HeisMonthDays\n");
    printf("07 : JulianYearDays            | 08 : GregorianYearDays\n");
    printf("09 : HeisYearDays              | 10 : JulianDayDiff\n");
    printf("11 : GregorianDayDiff          | 12 : HeisDayDiff\n");
    printf("13 : Compare2Dates             | 14 : Compare2Times\n");
    printf("15 : DateText                  | 16 : JulianWeekday\n");
    printf("17 : GregorianWeekday          | 18 : HeisWeekday\n");
    printf("19 : JulianDaysBeforeWeekday   | 20 : GregorianDaysBeforeWeekday\n");
    printf("21 : HeisDaysBeforeWeekday     | 22 : JulianDaysAfterWeekday\n");
    printf("23 : GregorianDaysAfterWeekday | 24 : HeisDaysAfterWeekday\n");
    printf("25 : JulianDiffDate            | 26 : GregorianDiffDate\n");
    printf("27 : HeisDiffDate              | 28 : JYearToScaliger\n");
    printf("29 : GYearToScaliger           | 30 : HYearToScaliger\n");
    printf("31 : ScaligerYearToJ           | 32 : ScaligerYearToG\n");
    printf("33 : ScaligerYearToH           | 34 : JSYearToJD\n");
    printf("35 : GSYearToJD                | 36 : HSYearToJD\n");
    printf("37 : JDtoMJD                   | 38 : MJDtoJD\n");
    printf("39 : JulianToJD                | 40 : GregorianToJD\n");
    printf("41 : HeisToJD                  | 42 : TimeToJD\n");
    printf("43 : JDToTime                  | 44 : GregorianMoonAge\n");
    printf("45 : GregorianEaster           | 46 : TimeZoneFactor\n");
    printf("47 : LMT                       | 48 : TimeToSec\n");
    printf("49 : SecToTime                 | 50 : JulianWeek\n");
    printf("51 : GregorianWeek             | 52 : HeisWeek\n");
    printf("53 : WeekdayText               | 54 : MonthText\n");
    printf("55 : WeekdayShortText          | 56 : MonthShortText\n");
    printf("57 : JDToJulian                | 58 : JDToGregorian\n");
    printf("59 : JDToHeis                  | 60 : JulianEaster\n");
    printf("61 : HeisEaster                | 62 : GregorianMoonPhase\n");
    printf("63 : TimeDiff                  | 64 : DiffTime\n");
    printf("00 : Quit\n");
    printf("It's your turn: ");
    scanf("%u",&input);
    printf("----------------------------------------------------------------\n");
    do
     {
      switch (input)
        {
         case  0 : break;
         case  1 : if (JulianLeapYear(readintyear()))
                     printf("TRUE\n");
 	           else
 	             printf("FALSE\n");
	           break;
         case  2 : if (GregorianLeapYear(readintyear()))
	             printf("TRUE\n");
 	           else
 	             printf("FALSE\n");
                   break;
         case  3 : if (HeisLeapYear(readintyear()))
 	             printf("TRUE\n");
 	           else
 	             printf("FALSE\n");
	           break;
         case  4 : printf("%hu\n",JulianMonthDays(readshortcardmonth(),readintyear()));
                   break;
         case  5 : printf("%hu\n",GregorianMonthDays(readshortcardmonth(),readintyear()));
                   break;
         case  6 : printf("%hu\n",HeisMonthDays(readshortcardmonth(),readintyear()));
                   break;
         case  7 : printf("%u\n",JulianYearDays(readintyear()));
                   break;
         case  8 : printf("%u\n",GregorianYearDays(readintyear()));
	           break;
         case  9 : printf("%u\n",HeisYearDays(readintyear()));
	           break;
         case 10 : printf("%ld\n",JulianDayDiff(readshortcardday(),readshortcardmonth(),readintyear(),readshortcardday(),readshortcardmonth(),readintyear()));
	           break;
         case 11 : printf("%ld\n",GregorianDayDiff(readshortcardday(),readshortcardmonth(),readintyear(),readshortcardday(),readshortcardmonth(),readintyear()));
	           break;
         case 12 : printf("%ld\n",HeisDayDiff(readshortcardday(),readshortcardmonth(),readintyear(),readshortcardday(),readshortcardmonth(),readintyear()));
	           break;
         case 13 : printf("Date1:\n");
                   d = readshortcardday();
                   m = readshortcardmonth();
                   y = readintyear();
                   printf("Date2:\n");
                   d2 = readshortcardday();
                   m2 = readshortcardmonth();
                   y2 = readintyear();
                   printf("\nDate1 ");
                   if (Compare2Dates(d,m,y,d2,m2,y2) == -1)
                     printf("<");
                   else if (Compare2Dates(d,m,y,d2,m2,y2) == 1)
                     printf(">");
                   else
                     printf("=");
                   printf(" Date2\n");
	           break;
         case 14 : printf("Time1:\n");
                   h = readshortcardhour();
                   m = readshortcardmin();
                   s = readshortcardsec();
                   printf("Time2:\n");
                   h2 = readshortcardhour();
                   m2 = readshortcardmin();
                   s2 = readshortcardsec();
                   printf("\nTime1 ");
                   if (Compare2Times(h,m,s,h2,m2,s2) == -1)
                     printf("<");
                   else if (Compare2Times(h,m,s,h2,m2,s2) == 1)
                     printf(">");
                   else
                     printf("=");
                   printf(" Time2\n");
	           break;
         case 15 : DateText(readdt(),text,readlanguage(),readplural());
                   printf("%s\n",text);
	           break;
         case 16 : wd = JulianWeekday(readshortcardday(),readshortcardmonth(),readintyear());
      	           switch (wd)
      	             {
                      case dayerr    : printf("dayerr!\n");
	                               break;
                      case Monday    : printf("Monday\n");
	                               break;
                      case Tuesday   : printf("Tuesday\n");
	                               break;
                      case Wednesday : printf("Wednesday\n");
	                               break;
                      case Thursday  : printf("Thursday\n");
	                               break;
                      case Friday    : printf("Friday\n");
	                               break;
                      case Saturday  : printf("Saturday\n");
	                               break;
                      case Sunday    : printf("Sunday\n");
                                       break;
                      default        : printf("Illegal Code!\n");
                     }
	           break;
         case 17 : wd = GregorianWeekday(readshortcardday(),readshortcardmonth(),readintyear());
      	           switch (wd)
      	             {
                      case dayerr    : printf("dayerr!\n");
	                               break;
                      case Monday    : printf("Monday\n");
	                               break;
                      case Tuesday   : printf("Tuesday\n");
	                               break;
                      case Wednesday : printf("Wednesday\n");
	                               break;
                      case Thursday  : printf("Thursday\n");
	                               break;
                      case Friday    : printf("Friday\n");
	                               break;
                      case Saturday  : printf("Saturday\n");
	                               break;
                      case Sunday    : printf("Sunday\n");
                                       break;
                      default        : printf("Illegal Code!\n");
                     }
	           break;
         case 18 : wd = HeisWeekday(readshortcardday(),readshortcardmonth(),readintyear());
      	           switch (wd)
      	             {
                      case dayerr    : printf("dayerr!\n");
	                               break;
                      case Monday    : printf("Monday\n");
	                               break;
                      case Tuesday   : printf("Tuesday\n");
	                               break;
                      case Wednesday : printf("Wednesday\n");
	                               break;
                      case Thursday  : printf("Thursday\n");
	                               break;
                      case Friday    : printf("Friday\n");
	                               break;
                      case Saturday  : printf("Saturday\n");
	                               break;
                      case Sunday    : printf("Sunday\n");
                                       break;
                      default        : printf("Illegal Code!\n");
                     }
	           break;
         case 19 : printf("%hu\n",JulianDaysBeforeWeekday(readshortcardday(),readshortcardmonth(),readintyear(),readweekday()));
	           break;
         case 20 : printf("%hu\n",GregorianDaysBeforeWeekday(readshortcardday(),readshortcardmonth(),readintyear(),readweekday()));
	           break;
         case 21 : printf("%hu\n",HeisDaysBeforeWeekday(readshortcardday(),readshortcardmonth(),readintyear(),readweekday()));
	           break;
         case 22 : printf("%hu\n",JulianDaysAfterWeekday(readshortcardday(),readshortcardmonth(),readintyear(),readweekday()));
	           break;
         case 23 : printf("%hu\n",GregorianDaysAfterWeekday(readshortcardday(),readshortcardmonth(),readintyear(),readweekday()));
	           break;
         case 24 : printf("%hu\n",HeisDaysAfterWeekday(readshortcardday(),readshortcardmonth(),readintyear(),readweekday()));
	           break;
         case 25 :
                   #ifndef __cplusplus
                     JulianDiffDate(readshortcardday(),readshortcardmonth(),readintyear(),readintdays(),&d,&m,&y);
                   #else
                     JulianDiffDate(readshortcardday(),readshortcardmonth(),readintyear(),readintdays(),d,m,y);
                   #endif
                   printf("%hu.%hu.%d\n",d,m,y);
	           break;
         case 26 :
                   #ifndef __cplusplus
                     GregorianDiffDate(readshortcardday(),readshortcardmonth(),readintyear(),readintdays(),&d,&m,&y);
                   #else
                     GregorianDiffDate(readshortcardday(),readshortcardmonth(),readintyear(),readintdays(),d,m,y);
                   #endif
                   printf("%hu.%hu.%d\n",d,m,y);
	           break;
         case 27 :
                   #ifndef __cplusplus
                     HeisDiffDate(readshortcardday(),readshortcardmonth(),readintyear(),readintdays(),&d,&m,&y);
                   #else
                     HeisDiffDate(readshortcardday(),readshortcardmonth(),readintyear(),readintdays(),d,m,y);
                   #endif
                   printf("%hu.%hu.%d\n",d,m,y);
	           break;
         case 28 : printf("%u\n",JYearToScaliger(readintyear()));
	           break;
         case 29 : printf("%u\n",GYearToScaliger(readintyear()));
	           break;
         case 30 : printf("%u\n",HYearToScaliger(readintyear()));
	           break;
         case 31 : printf("%d\n",ScaligerYearToJ(readcardyear()));
	           break;
         case 32 : printf("%d\n",ScaligerYearToG(readcardyear()));
	           break;
         case 33 : printf("%d\n",ScaligerYearToH(readcardyear()));
	           break;
         case 34 : printf("%lu\n",JSYearToJD(readcardyear()));
	           break;
         case 35 : printf("%lu\n",GSYearToJD(readcardyear()));
	           break;
         case 36 : printf("%lu\n",HSYearToJD(readcardyear()));
	           break;
         case 37 : printf("%lu\n",JDtoMJD(readlongcarddays()));
	           break;
         case 38 : printf("%lu\n",MJDtoJD(readlongcarddays()));
	           break;
         case 39 : printf("%lu\n",JulianToJD(readshortcardday(),readshortcardmonth(),readintyear()));
	           break;
         case 40 : printf("%lu\n",GregorianToJD(readshortcardday(),readshortcardmonth(),readintyear()));
	           break;
         case 41 : printf("%lu\n",HeisToJD(readshortcardday(),readshortcardmonth(),readintyear()));
	           break;
         case 42 : printf("%f\n",TimeToJD(readshortcardhour(),readshortcardmin(),readshortcardsec()));
                   break;
         case 43 :
                   #ifndef __cplusplus
                     JDToTime(readrealtime(),&h,&m,&s);
                   #else
                     JDToTime(readrealtime(),h,m,s);
                   #endif
                   printf("%hu:%hu:%hu\n",h,m,s);
	           break;
         case 44 : printf("%hu\n",GregorianMoonAge(readshortcardday(),readshortcardmonth(),readintyear()));
	           break;
         case 45 :
                   #ifndef __cplusplus
                     GregorianEaster(readintyear(),&d,&m);
                   #else
                     GregorianEaster(readintyear(),d,m);
                   #endif
                   printf("%hu.%hu.\n",d,m);
	           break;
         case 46 : printf("%hd\n",TimeZoneFactor(readshortintdegree()));
	           break;
         case 47 : printf("%lu\n",LMT(readlongcardsecs(),readrealmeridian(),readrealpos()));
	           break;
         case 48 : printf("%lu\n",TimeToSec(readshortcardhour(),readshortcardmin(),readshortcardsec()));
	           break;
         case 49 :
                   #ifndef __cplusplus
                     SecToTime(readlongcardsecs(),&h,&m,&s);
                   #else
                     SecToTime(readlongcardsecs(),h,m,s);
                   #endif
                   printf("%hu:%hu:%hu\n",h,m,s);
	           break;
	 case 50 : printf("%hu\n",JulianWeek(readshortcardday(),readshortcardmonth(),readintyear()));
		   break;
	 case 51 : printf("%hu\n",GregorianWeek(readshortcardday(),readshortcardmonth(),readintyear()));
		   break;
	 case 52 : printf("%hu\n",HeisWeek(readshortcardday(),readshortcardmonth(),readintyear()));
		   break;
	 case 53 : len = WeekdayText(readweekday(),text,readlanguage());
	           printf("%hu : %s\n",len,text);
	           break;
	 case 54 : len = MonthText(readshortcardmonth(),text,readlanguage());
	           printf("%hu : %s\n",len,text);
	           break;
	 case 55 : len = WeekdayShortText(readweekday(),text,readlanguage());
	           printf("%hu : %s\n",len,text);
	           break;
	 case 56 : len = MonthShortText(readshortcardmonth(),text,readlanguage());
	           printf("%hu : %s\n",len,text);
	           break;
	 case 57 :
                   #ifndef __cplusplus
                     JDToJulian(readjd(),&d,&m,&y);
                   #else
                     JDToJulian(readjd(),d,m,y);
                   #endif
	           printf("%hu.%hu.%d\n",d,m,y);
	           break;
	 case 58 :
                   #ifndef __cplusplus
                     JDToGregorian(readjd(),&d,&m,&y);
                   #else
                     JDToGregorian(readjd(),d,m,y);
                   #endif
	           printf("%hu.%hu.%d\n",d,m,y);
	           break;
	 case 59 :
                   #ifndef __cplusplus
                     JDToHeis(readjd(),&d,&m,&y);
                   #else
                     JDToHeis(readjd(),d,m,y);
                   #endif
	           printf("%hu.%hu.%d\n",d,m,y);
	           break;
	 case 60 :
                   #ifndef __cplusplus
                     JulianEaster(readintyear(),&d,&m);
                   #else
                     JulianEaster(readintyear(),d,m);
                   #endif
                   printf("%hu.%hu.\n",d,m);
	           break;
	 case 61 :
                   #ifndef __cplusplus
                     HeisEaster(readintyear(),&d,&m);
                   #else
                     HeisEaster(readintyear(),d,m);
                   #endif
                   printf("%hu.%hu.\n",d,m);
	           break;
	 case 62 : jd = GregorianMoonPhase(readshortcardday(),readshortcardmonth(),readintyear(),readmoonphase());
                   #ifndef __cplusplus
	             JDToGregorian(jd,&d,&m,&y);
                   #else
	             JDToGregorian(jd,d,m,y);
                   #endif
	           printf("%hu.%hu.%d\n",d,m,y);
	           break;
	 case 63 : secs = TimeDiff(readshortcardhour(),readshortcardmin(),readshortcardsec(),readshortcardhour(),readshortcardmin(),readshortcardsec());
                   if (secs < 0)
                     secs = -secs;
                   #ifndef __cplusplus
	             SecToTime(secs,&h,&m,&s);
	           #else
	             SecToTime(secs,h,m,s);
	           #endif
	           printf("%ld = %hu:%hu:%hu\n",secs,h,m,s);
	           break;
	 case 64 :
	           #ifndef __cplusplus
                     DiffTime(readshortcardhour(),readshortcardmin(),readshortcardsec(),readlongsecs(),&h,&m,&s);
                   #else
                     DiffTime(readshortcardhour(),readshortcardmin(),readshortcardsec(),readlongsecs(),h,m,s);
                   #endif
	           printf("%hu:%hu:%hu\n",h,m,s);
	           break;
         default : printf("Wong number! Try again!\n");
        }
      if (input > 0)
        {
         printf("0 : Menu; >0 : test again - ");
         scanf("%u",&repeat);
        }
      else
        repeat = 0;
     }
    while (repeat != 0);
   }
  while (input != 0);
  #ifndef __SASC_650
    _DateCleanup();
  #endif
  #ifdef _AMIGA
    #ifdef LIBTEST
        CloseLibrary(DateBase);
       }
    #endif
  #endif
 }
