 /* Copyright © 1994-1999 Dipl.-Inform. Kai Hofmann. All rights reserved. */

 #include "system.h"
 #include <stdio.h>
 #include <math.h>
 #include <exec/libraries.h>
 #include <proto/exec.h>
 #include <proto/date.h>


 struct Library *DateBase;


 static long readlongyear(void)
  {
   long year=0;

   DEBUG_ENTER("readlongyear")
   printf("(long)year: "); fflush(stdout);
   scanf("%ld",&year);
   DEBUG_EXIT("readlongyear","%ld",year)
   return(year);
  }


 static unsigned short readshortcardmonth(void)
  {
   unsigned short month=0;

   DEBUG_ENTER("readshortcardmonth")
   do
    {
     printf("(unsigned short)month: "); fflush(stdout);
     scanf("%hu",&month);
    }
   while ((month == 0) || (month > 12));
   DEBUG_EXIT("readshortcardmonth","%lu",(unsigned long)month)
   return(month);
  }


 static unsigned short readshortcardday(void)
  {
   unsigned short day=0;

   DEBUG_ENTER("readshortcardday")
   do
    {
     printf("(unsigned short)day: "); fflush(stdout);
     scanf("%hu",&day);
    }
   while ((day == 0) || (day > 31));
   DEBUG_EXIT("readshortcardday","%lu",(unsigned long)day)
   return(day);
  }


 static date_Weekdays readweekday(void)
  {
   unsigned short wday=0;

   DEBUG_ENTER("readweekday")
   do
    {
     printf("weekday: 1=Monday; ...7=Sunday: "); fflush(stdout);
     scanf("%hu",&wday);
    }
   while ((wday == 0) || (wday > 7));
   DEBUG_EXIT("readweekday","%lu",(unsigned long)wday)
   return((date_Weekdays)wday);
  }


 static long readlongdays(void)
  {
   long days=0;

   DEBUG_ENTER("readlongdays")
   printf("(long)days: "); fflush(stdout);
   scanf("%ld",&days);
   DEBUG_EXIT("readlongdays","%ld",days)
   return(days);
  }


 static long readlongmonths(void)
  {
   long months=0;

   DEBUG_ENTER("readlongmonths")
   printf("(long)months: "); fflush(stdout);
   scanf("%ld",&months);
   DEBUG_EXIT("readlongmonths","%ld",months)
   return(months);
  }


 static long readlongyears(void)
  {
   long years=0;

   DEBUG_ENTER("readlongyears")
   printf("(long)years: "); fflush(stdout);
   scanf("%ld",&years);
   DEBUG_EXIT("readlongyears","%ld",years)
   return(years);
  }


 static unsigned long readcardyear(void)
  {
   unsigned long year=0;

   DEBUG_ENTER("readcardyear")
   printf("(unsigned long)year: "); fflush(stdout);
   scanf("%lu",&year);
   DEBUG_EXIT("readcardyear","%lu",year)
   return(year);
  }


 static unsigned short readushortyear(void)
  {
   unsigned short year=0;

   DEBUG_ENTER("readushortyear")
   do
    {
     printf("(unsigned short)year: "); fflush(stdout);
     scanf("%hu",&year);
    }
   while (year > 99);
   DEBUG_EXIT("readushortyear","%lu",(unsigned long)year)
   return(year);
  }


 static unsigned long readlongcarddays(void)
  {
   unsigned long day=0;

   DEBUG_ENTER("readlongcarddays")
   printf("(longcard)days: "); fflush(stdout);
   scanf("%lu",&day);
   DEBUG_EXIT("readlongcarddays","%lu",day)
   return(day);
  }


 static unsigned short readshortcardhour(void)
  {
   unsigned short hour=0;

   DEBUG_ENTER("readshortcardhour")
   do
    {
     printf("(unsigned short)hour: "); fflush(stdout);
     scanf("%hu",&hour);
    }
   while (hour > 23);
   DEBUG_EXIT("readshortcardhour","%lu",(unsigned long)hour)
   return(hour);
  }


 static unsigned short readshortcardmin(void)
  {
   unsigned short min=0;

   DEBUG_ENTER("readshortcardmin")
   do
    {
     printf("(unsigned short)min: "); fflush(stdout);
     scanf("%hu",&min);
    }
   while (min > 59);
   DEBUG_EXIT("readshortcardmin","%lu",(unsigned long)min)
   return(min);
  }


 static unsigned short readshortcardsec(void)
  {
   unsigned short sec=0;

   DEBUG_ENTER("readshortcardsec")
   do
    {
     printf("(unsigned short)sec: "); fflush(stdout);
     scanf("%hu",&sec);
    }
   while (sec > 59);
   DEBUG_EXIT("readshortcardsec","%lu",(unsigned long)sec)
   return(sec);
  }


 static float readrealtime(void)
  {
   float jd=0.0;

   DEBUG_ENTER("readrealtime")
   printf("(float)time: "); fflush(stdout);
   scanf("%f",&jd);
   if (jd >= 1.0)
    {
     jd -= (float)floor((double)jd);
    }
   DEBUG_EXIT("readrealtime","%f",jd)
   return(jd);
  }


 static short readshortdegree(void)
  {
   short degree=0;

   DEBUG_ENTER("readshortdegree")
   do
    {
     printf("(short)degree: "); fflush(stdout);
     scanf("%hd",&degree);
    }
   while ((-180 > degree) || (degree > 180));
   DEBUG_EXIT("readshortdegree","%ld",(long)degree)
   return(degree);
  }


 static unsigned long readlongcardsecs(void)
  {
   unsigned long secs=0;

   DEBUG_ENTER("readlongcardsecs")
   printf("(unsigned long)secs: "); fflush(stdout);
   scanf("%lu",&secs);
   DEBUG_EXIT("readlongcardsecs","%lu",secs)
   return(secs);
  }


 static float readrealmeridian(void)
  {
   float jd=0.0;

   DEBUG_ENTER("readrealmeridian")
   printf("(float)meridian: "); fflush(stdout);
   scanf("%f",&jd);
   DEBUG_EXIT("readrealmeridian","%f",jd)
   return(jd);
  }


 static float readrealpos(void)
  {
   float jd=0.0;

   DEBUG_ENTER("readrealpos")
   printf("(float)ps: "); fflush(stdout);
   scanf("%f",&jd);
   DEBUG_EXIT("readrealpos","%f",jd)
   return(jd);
  }


 static date_Languages readlanguage(void)
  {
   unsigned short lang=0;

   DEBUG_ENTER("readlanguage")
   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 13=magyar 14=greek 15=Esperanto 16=Turkish 17=Latin 18=Russian 19=Czech 20=Catalonian 21=Serbian: "); fflush(stdout);
     scanf("%hu",&lang);
    }
   while (lang >= date_LASTLANGUAGE);
   DEBUG_EXIT("readlanguage","%lu",(unsigned long)lang)
   return((date_Languages)lang);
  }


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

   DEBUG_ENTER("readjd")
   printf("(unsigned long)jd: "); fflush(stdout);
   scanf("%lu",&jd);
   DEBUG_EXIT("readjd","%lu",jd)
   return(jd);
  }


 static date_MoonPhases readmoonphase(void)
  {
   unsigned short moon=0;

   DEBUG_ENTER("readmoonphase")
   do
    {
     printf("moon: 0=new; 1=first quarter; 2=full; 3=last quarter: "); fflush(stdout);
     scanf("%hu",&moon);
    }
   while (moon > 3);
   DEBUG_EXIT("readmoonphase","%lu",(unsigned long)moon)
   return((date_MoonPhases)moon);
  }


 static date_DateTexts readdt(void)
  {
   unsigned short dt=0;

   DEBUG_ENTER("readdt")
   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 : "); fflush(stdout);
     scanf("%hu",&dt);
    }
   while (dt > 10);
   DEBUG_EXIT("readdt","%lu",(unsigned long)dt)
   return((date_DateTexts)dt);
  }


 static date_WordClass readwordclass(void)
  {
   unsigned short wc;

   DEBUG_ENTER("readwordclass")
   do
    {
     printf("word class: 0=SINGULAR; 1=PLURAL; 2=PERIODICAL: "); fflush(stdout);
     scanf("%hu",&wc);
    }
   while (wc > 2);
   DEBUG_EXIT("readwordclass","%lu",(unsigned long)wc)
   return((date_WordClass)wc);
  }


 static long readlongsecs(void)
  {
   long secs=0;

   DEBUG_ENTER("readlongsecs")
   printf("(long)secs: "); fflush(stdout);
   scanf("%ld",&secs);
   DEBUG_EXIT("readlongsecs","%ld",secs)
   return(secs);
  }


 static date_Countries readcountry(void)
  {
   unsigned short country=0;

   DEBUG_ENTER("readcountry")
   do
    {
     printf("country: 0=unknown; 1=Italia; 2=Deutschland; 3=Schweiz; 4=Danmark; 5=Nederland; 6=GreatBritain; 7=USA; 8=Sweden: "); fflush(stdout);
     scanf("%hu",&country);
    }
   while (country >= date_LASTCOUNTRY);
   DEBUG_EXIT("readcountry","%lu",(unsigned long)country)
   return((date_Countries)country);
  }


 static void writeweekday(date_Weekdays wd)
  {
   DEBUG_ENTER("writeweekday")
   switch (wd)
    {
     case date_dayerr    : printf("dayerr!\n");
                           break;
     case date_Monday    : printf("Monday\n");
                           break;
     case date_Tuesday   : printf("Tuesday\n");
                           break;
     case date_Wednesday : printf("Wednesday\n");
                           break;
     case date_Thursday  : printf("Thursday\n");
                           break;
     case date_Friday    : printf("Friday\n");
                           break;
     case date_Saturday  : printf("Saturday\n");
                           break;
     case date_Sunday    : printf("Sunday\n");
                           break;
     default             : printf("Illegal Code!\n");
    }
   DEBUG_EXIT("writeweekday","",0UL)
  }


 static void writebool(bool b)
  {
   DEBUG_ENTER("writebool")
   if (b)
    {
     printf("true\n");
    }
   else
    {
     printf("false\n");
    }
   DEBUG_EXIT("writebool","",0UL)
  }


 static short readshortzonemin(void)
  {
   short min=0;

   DEBUG_ENTER("readshortzonemin")
   do
    {
     printf("short)zone min: "); fflush(stdout);
     scanf("%hd",&min);
    }
   while ((-780 > min) || (min > 780));
   DEBUG_EXIT("readshortzonemin","%ld",(long)min)
   return(min);
  }


 static bool readbooldst(void)
  {
   unsigned short dst=false;

   DEBUG_ENTER("readbooldst")
   do
    {
     printf("(bool)DST: "); fflush(stdout);
     scanf("%hu",&dst);
    }
   while (dst > 1);
   DEBUG_EXIT("readbooldst","%lu",(unsigned long)dst)
   return((bool)dst);
  }


 static unsigned short readshortcardchangehour(void)
  {
   unsigned short hour=0;

   DEBUG_ENTER("readshortcardchangehour")
   do
    {
     printf("(unsigned short)change hour: "); fflush(stdout);
     scanf("%hu",&hour);
    }
   while (hour > 23);
   DEBUG_EXIT("readshortcardchangehour","%lu",(unsigned long)hour)
   return(hour);
  }


 static time_ChangeDay readshortcardchangeday(short d)
  {
   unsigned short changeday=0;

   DEBUG_ENTER("readshortcardchangeday")
   do
    {
     printf("change ");
     if (d < 0)
      {
       printf("previous ");
      }
     else if (d > 0)
      {
       printf("next ");
      }
     printf("day: 0=Normal; 1=WinterToSummer; 2=SummerToWinter: "); fflush(stdout);
     scanf("%hu",&changeday);
    }
   while (changeday > 2);
   DEBUG_EXIT("readshortcardchangeday","%lu",(unsigned long)changeday)
   return((time_ChangeDay)changeday);
  }


 static char *readtimeformatstring(void)
  {
   static char text[40] = "";

   DEBUG_ENTER("readtimeformatstring")
   printf("\n%%q     - hour using 24-hour style\n");
   printf("%%H     - hour using 24-hour style with leading 0s\n");
   printf("%%Q     - hour using 12-hour style\n");
   printf("%%I     - hour using 12-hour style with leading 0s\n");
   printf("%%p     - AM or PM strings\n");
   printf("%%M     - the number of minutes with leading 0s\n");
   printf("%%S     - number of seconds with leadings 0s\n");
   printf("%%R     - same as '%%H:%%M'\n");
   printf("%%T     - same as '%%H:%%M:%%S'\n");
   printf("%%X     - same as '%%H:%%M:%%S'\n");
   printf("%%r     - same as '%%I:%%M:%%S %%p'\n");

   printf("%%Th1f  - hour using 12h style with leading 0s\n");
   printf("%%Th1v  - hour using 12h style without leading 0s\n");
   printf("%%Th2f  - hour using 24h style with leading 0s\n");
   printf("%%Th2v  - hour using 24h style without leading 0s\n");
   printf("%%Tpso  - a/p\n");
   printf("%%Tpsu  - A/P\n");
   printf("%%Tplo  - am/pm\n");
   printf("%%Tplu  - AM/PM\n");
   printf("%%Tmf   - minute with leading 0s\n");
   printf("%%Tmv   - minute without leading 0s\n");
   printf("%%Tsf   - second with leading 0s\n");
   printf("%%Tsv   - second without leading 0s\n");
   printf("%%Tj0   - jd time starting with '0.'\n");
   printf("%%Tj.   - jd time starting with '.'\n");
   printf("%%Tzh?? - timezone hours only\n");
   printf("%%Tzm?  - timezone: 0100 (always with leading 0s)\n");
   printf("%%TzM?? - timezone: 01:00\n");
   printf("%%Tz??f - timezone: use leading 0s\n");
   printf("%%Tz??v - timezone: don not use leading 0s\n");
   printf("%%Tz?z? - timezone: use Z   for UTC\n");
   printf("%%Tz?0? - timezone: use +00 for UTC\n");
   printf("%%Tc1   - Use DST for s->w switch\n");
   printf("%%Tc2   - Use I/II for s->w switch\n");
   printf("%%Tc3   - Use a/b for s->w switch (24h only) - on 12h falls back to 2\n");

   printf("\nTimeFormat string: "); fflush(stdout);
   scanf("%s",text);
   DEBUG_EXIT("readtimeformatstring","%s",text)
   return(text);
  }


 static char *readparsestring(void)
  {
   static char text[47] = "";

   DEBUG_ENTER("readparsestring")
   printf("String to parse: "); fflush(stdout);
   scanf("\n%[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.- /:äöüßÄÖÜß]",text);
   DEBUG_EXIT("readparsestring","%s",text)
   return(text);
  }


 static char *readdateformatstring(void)
  {
   static char text[40] = "";

   DEBUG_ENTER("readdateformatstring")
   printf("\n%%d    - day number with leading 0s\n");
   printf("%%e    - day number with leading spaces\n");
   printf("%%m    - month number with leading 0s\n");
   printf("%%h    - abbreviated month name\n");
   printf("%%b    - abbreviated month name\n");
   printf("%%B    - month name\n");
   printf("%%y    - year using two digits with leading 0s\n");
   printf("%%Y    - year using four digits with leading 0s\n");
   printf("%%j    - julian date\n");
   printf("%%w    - weekday number\n");
   printf("%%a    - abbreviated weekday name\n");
   printf("%%A    - weekday name\n");
   printf("%%U    - week number, taking Sunday as first day of week\n");
   printf("%%W    - week number, taking Monday as first day of week\n");
   printf("%%x    - same as '%%m/%%d/%%y'\n");
   printf("%%D    - same as '%%m/%%d/%%y'\n");

   printf("%%Ddf  - Day with leading 0s\n");
   printf("%%Ddv  - Day without leading 0s\n");
   printf("%%DDf  - Day within the year with leading 0s\n");
   printf("%%DDv  - Day within the year without leading 0s\n");
   printf("%%Dmf  - Month with leading 0s\n");
   printf("%%Dmv  - Month without leading 0s\n");
   printf("%%Dms  - Month string\n");
   printf("%%Dma  - Abbreviated month string\n");
   printf("%%Dy2f - 2-digit year with leading 0s\n");
   printf("%%Dy2v - 2-digit year without leading 0s\n");
   printf("%%Dy4f - 4-digit year with leading 0s\n");
   printf("%%Dy4v - 4-digit year without leading 0s\n");
   printf("%%Dys  - Scaliger year\n");
   printf("%%Dj   - JD date\n");
   printf("%%DJ   - MJD date\n");
   printf("%%Dwn  - Weekday number (1-7)\n");
   printf("%%Dws  - Weekday string\n");
   printf("%%Dwa  - Abbreviated weekday string\n");
   printf("%%DWf  - Weeknumber with leading 0s\n");
   printf("%%DWv  - Weeknumber without leading 0s\n");
   printf("%%DMf  - Age of the moon (0-30 ?) with leading 0s\n");
   printf("%%DMv  - Age of the moon (0-30 ?) without leading 0s\n");

   printf("\nDateFormat string: "); fflush(stdout);
   scanf("%s",text);
   DEBUG_EXIT("readdateformatstring","%s",text)
   return(text);
  }


 static date_Calendars readcalendartype(void)
  {
   unsigned short calendartype=0;

   DEBUG_ENTER("readcalendartype")
   do
    {
     printf("calendar type: 0=Julian; 1=Gregorian; 2=Heis: "); fflush(stdout);
     scanf("%hu",&calendartype);
    }
   while (calendartype > 2);
   DEBUG_EXIT("readcalendartype","%lu",(unsigned long)calendartype)
   return((date_Calendars)calendartype);
  }


 static unsigned long readlongcardtime(void)
  {
   unsigned long num=0;

   DEBUG_ENTER("readlongcardtime")
   do
    {
     printf("(unsigned long)time: "); fflush(stdout);
     scanf("%lu",&num);
    }
   while (num > 235959);
   DEBUG_EXIT("readlongcardtime","%lu",num)
   return(num);
  }


 static long readlongdate(void)
  {
   long num=0;

   DEBUG_ENTER("readlongdate")
   printf("(long)date: "); fflush(stdout);
   scanf("%ld",&num);
   DEBUG_EXIT("readlongdate","%ld",num)
   return(num);
  }


 int main(void)
  {
   unsigned short	input=0,repeat=0;
   date_Weekdays	wd;
   date_Languages	plang;
   unsigned short	d=0,m=0,h=0,s=0,len,d2,m2,h2,s2;
   long			y=0,y2,ys;
   char                 text[40];
   unsigned long	jd,usecs;
   long			secs;
   bool			dst;
   short		zonemin=0,pos,ds,ms;

   DEBUG_ENTER("main")
   DateBase = OpenLibrary("date.library",33);
   if (DateBase != NULL)
    {
     if (DateBase->lib_Revision >= 300)
      {
       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 : JulianDiffDateRange       | 26 : GregorianDiffDateRange\n");
         printf("27 : HeisDiffDateRange         | 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("65 : SetFirstWeekday           | 66 : SupplementCentury\n");
         printf("67 : SetCountry                | 68 : ValidJulianDate\n");
         printf("69 : ValidGregorianDate        | 70 : ValidHeisDate\n");
         printf("71 : FormatTime                | 72 : ParseTime\n");
         printf("73 : JulianLastMonthDay        | 74 : GregorianLastMonthDay\n");
         printf("75 : HeisLastMonthDay          | 76 : NextValidJulianDate\n");
         printf("77 : NextValidGregorianDate    | 78 : NextValidHeisDate\n");
         printf("79 : PreviousValidJulianDate   | 80 : PreviousValidGregorianDate\n");
         printf("81 : PreviousValidHeisDate     | 82 : FormatDate\n");
         printf("83 : ParseDate                 | 84 : TimeToNum\n");
         printf("85 : NumToTime                 | 86 : DateToNum\n");
         printf("87 : NumToDate                 | 88 : JulianRangeDiff\n");
         printf("89 : GregorianRangeDiff        | 90 : HeisRangeDiff\n");
         printf("91 : LocalToGMT                | 92 : GMTToLocal\n");
         printf("00 : Quit\n");
         printf("It's your turn: "); fflush(stdout);
         scanf("%hu",&input);
         printf("----------------------------------------------------------------\n");
         do
          {
           switch (input)
            {
             case  0 : break;
             case  1 : writebool(date_JulianLeapYear(readlongyear()));
                       break;
             case  2 : writebool(date_GregorianLeapYear(readlongyear()));
                       break;
             case  3 : writebool(date_HeisLeapYear(readlongyear()));
                       break;
             case  4 : printf("%hu\n",date_JulianMonthDays(readshortcardmonth(),readlongyear()));
                       break;
             case  5 : printf("%hu\n",date_GregorianMonthDays(readshortcardmonth(),readlongyear()));
                       break;
             case  6 : printf("%hu\n",date_HeisMonthDays(readshortcardmonth(),readlongyear()));
                       break;
             case  7 : printf("%u\n",date_JulianYearDays(readlongyear()));
                       break;
             case  8 : printf("%u\n",date_GregorianYearDays(readlongyear()));
                       break;
             case  9 : printf("%u\n",date_HeisYearDays(readlongyear()));
                       break;
             case 10 : printf("%ld\n",date_JulianDayDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 11 : printf("%ld\n",date_GregorianDayDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 12 : printf("%ld\n",date_HeisDayDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 13 : printf("Date1:\n");
                       d = readshortcardday();
                       m = readshortcardmonth();
                       y = readlongyear();
                       printf("Date2:\n");
                       d2 = readshortcardday();
                       m2 = readshortcardmonth();
                       y2 = readlongyear();
                       printf("\nDate1 ");
                       if (date_Compare2Dates(d,m,y,d2,m2,y2) == -1)
                        {
                         printf("<");
                        }
                       else if (date_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 (time_Compare2Times(h,m,s,h2,m2,s2) == -1)
                        {
                         printf("<");
                        }
                       else if (time_Compare2Times(h,m,s,h2,m2,s2) == 1)
                        {
                         printf(">");
                        }
                       else
                        {
                         printf("=");
                        }
                       printf(" Time2\n");
                       break;
             case 15 : date_DateText(readdt(),text,readlanguage(),readwordclass());
                       printf("%s\n",text);
                       break;
             case 16 : wd = date_JulianWeekday(readshortcardday(),readshortcardmonth(),readlongyear());
                       writeweekday(wd);
                       break;
             case 17 : wd = date_GregorianWeekday(readshortcardday(),readshortcardmonth(),readlongyear());
                       writeweekday(wd);
                       break;
             case 18 : wd = date_HeisWeekday(readshortcardday(),readshortcardmonth(),readlongyear());
                       writeweekday(wd);
                       break;
             case 19 : printf("%hu\n",date_JulianDaysBeforeWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                       break;
             case 20 : printf("%hu\n",date_GregorianDaysBeforeWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                       break;
             case 21 : printf("%hu\n",date_HeisDaysBeforeWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                       break;
             case 22 : printf("%hu\n",date_JulianDaysAfterWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                       break;
             case 23 : printf("%hu\n",date_GregorianDaysAfterWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                       break;
             case 24 : printf("%hu\n",date_HeisDaysAfterWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                       break;
             case 25 : date_JulianDiffDateRange(readshortcardday(),readshortcardmonth(),readlongyear(),readlongdays(),readlongmonths(),readlongyears(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 26 : date_GregorianDiffDateRange(readshortcardday(),readshortcardmonth(),readlongyear(),readlongdays(),readlongmonths(),readlongyears(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 27 : date_HeisDiffDateRange(readshortcardday(),readshortcardmonth(),readlongyear(),readlongdays(),readlongmonths(),readlongyears(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 28 : printf("%u\n",date_JYearToScaliger(readlongyear()));
                       break;
             case 29 : printf("%u\n",date_GYearToScaliger(readlongyear()));
                       break;
             case 30 : printf("%u\n",date_HYearToScaliger(readlongyear()));
                       break;
             case 31 : printf("%lu\n",date_ScaligerYearToJ(readcardyear()));
                       break;
             case 32 : printf("%lu\n",date_ScaligerYearToG(readcardyear()));
                       break;
             case 33 : printf("%lu\n",date_ScaligerYearToH(readcardyear()));
                       break;
             case 34 : printf("%lu\n",date_JSYearToJD(readcardyear()));
                       break;
             case 35 : printf("%lu\n",date_GSYearToJD(readcardyear()));
                       break;
             case 36 : printf("%lu\n",date_HSYearToJD(readcardyear()));
                       break;
             case 37 : printf("%lu\n",date_JDtoMJD(readlongcarddays()));
                       break;
             case 38 : printf("%lu\n",date_MJDtoJD(readlongcarddays()));
                       break;
             case 39 : printf("%lu\n",date_JulianToJD(readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 40 : printf("%lu\n",date_GregorianToJD(readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 41 : printf("%lu\n",date_HeisToJD(readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 42 : printf("%f\n",time_TimeToJD(readshortcardhour(),readshortcardmin(),readshortcardsec()));
                       break;
             case 43 : time_JDToTime(readrealtime(),ARG(h),ARG(m),ARG(s));
                       printf("%hu:%hu:%hu\n",h,m,s);
                       break;
             case 44 : printf("%hu\n",date_GregorianMoonAge(readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 45 : date_GregorianEaster(readlongyear(),ARG(d),ARG(m));
                       printf("%hu.%hu.\n",d,m);
                       break;
             case 46 : printf("%hd\n",time_TimeZoneFactor(readshortdegree()));
                       break;
             case 47 : printf("%lu\n",time_LMT(readlongcardsecs(),readrealmeridian(),readrealpos()));
                       break;
             case 48 : printf("%lu\n",time_TimeToSec(readshortcardhour(),readshortcardmin(),readshortcardsec()));
                       break;
             case 49 : time_SecToTime(readlongcardsecs(),ARG(h),ARG(m),ARG(s));
                       printf("%hu:%hu:%hu\n",h,m,s);
                       break;
             case 50 : printf("%hu\n",date_JulianWeek(readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 51 : printf("%hu\n",date_GregorianWeek(readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 52 : printf("%hu\n",date_HeisWeek(readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 53 : len = date_WeekdayText(readweekday(),text,readlanguage());
                       printf("%hu : %s\n",len,text);
                       break;
             case 54 : len = date_MonthText(readshortcardmonth(),text,readlanguage());
                       printf("%hu : %s\n",len,text);
                       break;
             case 55 : len = date_WeekdayShortText(readweekday(),text,readlanguage());
                       printf("%hu : %s\n",len,text);
                       break;
             case 56 : len = date_MonthShortText(readshortcardmonth(),text,readlanguage());
                       printf("%hu : %s\n",len,text);
                       break;
             case 57 : date_JDToJulian(readjd(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 58 : date_JDToGregorian(readjd(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 59 : date_JDToHeis(readjd(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 60 : date_JulianEaster(readlongyear(),ARG(d),ARG(m));
                       printf("%hu.%hu.\n",d,m);
                       break;
             case 61 : date_HeisEaster(readlongyear(),ARG(d),ARG(m));
                       printf("%hu.%hu.\n",d,m);
                       break;
             case 62 : jd = date_GregorianMoonPhase(readshortcardday(),readshortcardmonth(),readlongyear(),readmoonphase());
                       date_JDToGregorian(jd,ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 63 : secs = time_TimeDiff(readshortcardhour(),readshortcardmin(),readshortcardsec(),readshortcardhour(),readshortcardmin(),readshortcardsec());
                       if (secs < 0)
                        {
                         secs = -secs;
                        }
                       time_SecToTime(secs,ARG(h),ARG(m),ARG(s));
                       printf("%ld = %hu:%hu:%hu\n",secs,h,m,s);
                       break;
             case 64 : time_DiffTime(readshortcardhour(),readshortcardmin(),readshortcardsec(),readlongsecs(),ARG(h),ARG(m),ARG(s));
                       printf("%hu:%hu:%hu\n",h,m,s);
                       break;
             case 65 : date_SetFirstWeekday(readweekday());
                       break;
             case 66 : printf("%ld\n",date_SupplementCentury(readushortyear(),readlongyear()));
                       break;
             case 67 : date_SetCountry(readcountry());
                       break;
             case 68 : printf("%hu\n",date_ValidJulianDate(readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 69 : printf("%hu\n",date_ValidGregorianDate(readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 70 : printf("%hu\n",date_ValidHeisDate(readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 71 : time_FormatTime(readtimeformatstring(),readshortcardchangeday(0),readshortcardchangehour(),readbooldst(),readshortcardhour(),readshortcardmin(),readshortcardsec(),readshortzonemin(),text);
                       printf("%s\n",text);
                       break;
             case 72 : dst = readbooldst();
                       pos = time_ParseTime(readtimeformatstring(),readparsestring(),readshortcardchangeday(0),readshortcardchangehour(),ARG(dst),ARG(h),ARG(m),ARG(s),ARG(zonemin),text);
                       if (pos == 0)
                        {
                         /* hour, min, sec, zonemin, dst */
                         printf("%hu:%hu:%hu  %hd  %hu\n",h,m,s,zonemin,(unsigned short)dst);
                         printf("Parsed format: %s\n",text);
                        }
                       else if (pos > 0)
                        {
                         printf("Parse error at position: %hd\n",pos-1);
                        }
                       else if (pos == -1)
                        {
                         printf("Parameter error\n");
                        }
                       else if (pos == -2)
                        {
                         printf("Format template string to long\n");
                        }
                       else
                        {
                         printf("Unknown error!\n");
                        }
                       break;
             case 73 : printf("%hu\n",date_JulianLastMonthDay(readshortcardmonth(),readlongyear()));
                       break;
             case 74 : printf("%hu\n",date_GregorianLastMonthDay(readshortcardmonth(),readlongyear()));
                       break;
             case 75 : printf("%hu\n",date_HeisLastMonthDay(readshortcardmonth(),readlongyear()));
                       break;
             case 76 : date_NextValidJulianDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 77 : date_NextValidGregorianDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 78 : date_NextValidHeisDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 79 : date_PreviousValidJulianDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 80 : date_PreviousValidGregorianDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 81 : date_PreviousValidHeisDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
	     case 82 : date_FormatDate(readdateformatstring(),readshortcardday(),readshortcardmonth(),readlongyear(),readlanguage(),text);
	               printf("%s\n",text);
	     	       break;
             case 83 : pos = date_ParseDate(readdateformatstring(),readparsestring(),readlanguage(),readcalendartype(),readjd(),ARG(d),ARG(m),ARG(y),text,ARG(plang));
                       if (pos == 0)
                        {
                         /* day, month, year */
                         printf("Parsed date    : %hu.%hu.%ld\n",d,m,y);
                         printf("Parsed format  : %s\n",text);
                         printf("Parsed language: %hu\n",(unsigned short)plang);
                        }
                       else if (pos > 0)
                        {
                         printf("Parse error at position: %hd\n",pos-1);
                        }
                       else if (pos == -1)
                        {
                         printf("Parameter error\n");
                        }
                       else if (pos == -2)
                        {
                         printf("Format template string to long\n");
                        }
                       else
                        {
                         printf("Unknown error!\n");
                        }
                       break;
             case 84 : printf("%lu\n",time_TimeToNum(readshortcardhour(),readshortcardmin(),readshortcardsec()));
                       break;
             case 85 : time_NumToTime(readlongcardtime(),ARG(h),ARG(m),ARG(s));
                       printf("%hu:%hu:%hu\n",h,m,s);
                       break;
             case 86 : printf("%ld\n",date_DateToNum(readshortcardday(),readshortcardmonth(),readlongyear()));
                       break;
             case 87 : date_NumToDate(readlongdate(),ARG(d),ARG(m),ARG(y));
                       printf("%hu.%hu.%ld\n",d,m,y);
                       break;
             case 88 : date_JulianRangeDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear(),ARG(ds),ARG(ms),ARG(ys));
             	       printf("P%ldY%hdM%hdD\n",ys,ms,ds);
                       break;
             case 89 : date_GregorianRangeDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear(),ARG(ds),ARG(ms),ARG(ys));
             	       printf("P%ldY%hdM%hdD\n",ys,ms,ds);
                       break;
             case 90 : date_HeisRangeDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear(),ARG(ds),ARG(ms),ARG(ys));
             	       printf("P%ldY%hdM%hdD\n",ys,ms,ds);
                       break;
	     case 91 : datetime_LocalToGMT(readjd(),readlongcardsecs(),readbooldst(),readshortzonemin(),&jd,&usecs);
	               printf("GMTJD=%lu GMTsecs=%lu\n",jd,usecs);
	     	       break;
	     case 92 : dst = readbooldst();
		       datetime_GMTToLocal(readjd(),readlongcardsecs(),readshortzonemin(),readshortcardchangeday(-1),readshortcardchangeday(0),readshortcardchangeday(1),readshortcardchangehour(),&jd,&usecs,&dst);
	               printf("%lu:%lu:%hu\n",jd,usecs,(unsigned short)dst);
	     	       break;
             default : printf("Wong number! Try again!\n");
            }
           if ((input > 0) && (input < 93))
            {
             printf("0 : Menu; >0 : test again - "); fflush(stdout);
             scanf("%hu",&repeat);
            }
           else
            {
             repeat = 0;
            }
          }
         while (repeat != 0);
        }
       while (input != 0);
      }
     CloseLibrary(DateBase);
    }
   DEBUG_EXIT("main","",0UL)
   return(0);
  }
