 /* Copyright © 1994-2000 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>


 #define MENU_QUIT				  0
 #define MENU_JULIANLEAPYEAR			  1
 #define MENU_GREGORIANLEAPYEAR			  2
 #define MENU_HEISLEAPYEAR			  3
 #define MENU_JULIANMONTHDAYS			  4
 #define MENU_GREGORIANMONTHDAYS		  5
 #define MENU_HEISMONTHDAYS			  6
 #define MENU_JULIANYEARDAYS			  7
 #define MENU_GREGORIANYEARDAYS			  8
 #define MENU_HEISYEARDAYS			  9
 #define MENU_JULIANDAYDIFF			 10
 #define MENU_GREGORIANDAYDIFF			 11
 #define MENU_HEISDAYDIFF			 12
 #define MENU_COMPARE2DATES			 13
 #define MENU_COMPARE2TIMES			 14
 #define MENU_DATETEXT				 15
 #define MENU_JULIANWEEKDAY			 16
 #define MENU_GREGORIANWEEKDAY			 17
 #define MENU_HEISWEEKDAY			 18
 #define MENU_JULIANDAYSBEFOREWEEKDAY		 19
 #define MENU_GREGORIANDAYSBEFOREWEEKDAY	 20
 #define MENU_HEISDAYSBEFOREWEEKDAY		 21
 #define MENU_JULIANDAYSAFTERWEEKDAY		 22
 #define MENU_GREGORIANDAYSAFTERWEEKDAY		 23
 #define MENU_HEISDAYSAFTERWEEKDAY		 24
 #define MENU_JULIANDIFFDATERANGE		 25
 #define MENU_GREGORIANDIFFDATERANGE		 26
 #define MENU_HEISDIFFDATERANGE			 27
 #define MENU_JYEARTOSCALIGER			 28
 #define MENU_GYEARTOSCALIGER			 29
 #define MENU_HYEARTOSCALIGER			 30
 #define MENU_SCALIGERYEARTOJ			 31
 #define MENU_SCALIGERYEARTOG			 32
 #define MENU_SCALIGERYEARTOH			 33
 #define MENU_JSYEARTOJD			 34
 #define MENU_GSYEARTOJD			 35
 #define MENU_HSYEARTOJD			 36
 #define MENU_JDTOMJD				 37
 #define MENU_MJDTOJD				 38
 #define MENU_JULIANTOJD			 39
 #define MENU_GREGORIANTOJD			 40
 #define MENU_HEISTOJD				 41
 #define MENU_TIMETOJD				 42
 #define MENU_JDTOTIME				 43
 #define MENU_GREGORIANMOONAGE			 44
 #define MENU_GREGORIANEASTER			 45
 #define MENU_TIMEZONEFACTOR			 46
 #define MENU_LMT				 47
 #define MENU_TIMETOSEC				 48
 #define MENU_SECTOTIME				 49
 #define MENU_JULIANWEEK			 50
 #define MENU_GREGORIANWEEK			 51
 #define MENU_HEISWEEK				 52
 #define MENU_WEEKDAYTEXT			 53
 #define MENU_MONTHTEXT				 54
 #define MENU_WEEKDAYSHORTTEXT			 55
 #define MENU_MONTHSHORTTEXT			 56
 #define MENU_JDTOJULIAN			 57
 #define MENU_JDTOGREGORIAN			 58
 #define MENU_JDTOHEIS				 59
 #define MENU_JULIANEASTER			 60
 #define MENU_HEISEASTER			 61
 #define MENU_GREGORIANMOONPHASE		 62
 #define MENU_TIMEDIFF				 63
 #define MENU_DIFFTIME				 64
 #define MENU_SETFIRSTWEEKDAY			 65
 #define MENU_SUPPLEMENTCENTURY			 66
 #define MENU_SETCOUNTRY			 67
 #define MENU_VALIDJULIANDATE			 68
 #define MENU_VALIDGREGORIANDATE		 69
 #define MENU_VALIDHEISDATE			 70
 #define MENU_FORMATTIME			 71
 #define MENU_PARSETIME				 72
 #define MENU_JULIANLASTMONTHDAY		 73
 #define MENU_GREGORIANLASTMONTHDAY		 74
 #define MENU_HEISLASTMONTHDAY			 75
 #define MENU_NEXTVALIDJULIANDATE		 76
 #define MENU_NEXTVALIDGREGORIANDATE		 77
 #define MENU_NEXTVALIDHEISDATE			 78
 #define MENU_PREVIOUSVALIDJULIANDATE		 79
 #define MENU_PREVIOUSVALIDGREGORIANDATE	 80
 #define MENU_PREVIOUSVALIDHEISDATE		 81
 #define MENU_FORMATDATE			 82
 #define MENU_PARSEDATE				 83
 #define MENU_TIMETONUM				 84
 #define MENU_NUMTOTIME				 85
 #define MENU_DATETONUM				 86
 #define MENU_NUMTODATE				 87
 #define MENU_JULIANRANGEDIFF			 88
 #define MENU_GREGORIANRANGEDIFF		 89
 #define MENU_HEISRANGEDIFF			 90
 #define MENU_LOCALTOGMT			 91
 #define MENU_GMTTOLOCAL			 92

 #define MENU_LEAPYEAR				 93
 #define MENU_MONTHDAYS				 94
 #define MENU_YEARDAYS				 95
 #define MENU_DAYDIFF				 96
 #define MENU_WEEKDAY				 97
 #define MENU_DAYSBEFOREWEEKDAY			 98
 #define MENU_DAYSAFTERWEEKDAY			 99
 #define MENU_DIFFDATERANGE			100
 #define MENU_YEARTOSCALIGER			101
 #define MENU_SCALIGERYEARTOYEAR		102
 #define MENU_SYEARTOJD				103
 #define MENU_DATETOJD				104
 #define MENU_EASTER				105
 #define MENU_WEEK				106
 #define MENU_JDTODATE				107
 #define MENU_VALIDDATE				108
 #define MENU_LASTMONTHDAY			109
 #define MENU_NEXTVALIDDATE			110
 #define MENU_PREVIOUSVALIDDATE			111
 #define MENU_RANGEDIFF				112
 #define MENU_WWTODM				113
 #define MENU_JULIANWWTODM			114
 #define MENU_GREGORIANWWTODM			115
 #define MENU_HEISWWTODM			116


 struct Library *DateBase;
 struct Menu
  {
   char *name;
   unsigned short nr;
  };


 static const struct Menu menu[] =
  {
   {"Quit                      ",MENU_QUIT},
   /*
   {"JulianLeapYear            ",MENU_JULIANLEAPYEAR},
   {"JulianMonthDays           ",MENU_JULIANMONTHDAYS},
   {"JulianYearDays            ",MENU_JULIANYEARDAYS},
   {"JulianDayDiff             ",MENU_JULIANDAYDIFF},
   {"JulianWeekday             ",MENU_JULIANWEEKDAY},
   {"JulianDaysBeforeWeekday   ",MENU_JULIANDAYSBEFOREWEEKDAY},
   {"JulianDaysAfterWeekday    ",MENU_JULIANDAYSAFTERWEEKDAY},
   {"JulianDiffDateRange       ",MENU_JULIANDIFFDATERANGE},
   {"JYearToScaliger           ",MENU_JYEARTOSCALIGER},
   {"ScaligerYearToJ           ",MENU_SCALIGERYEARTOJ},
   {"JSYearToJD                ",MENU_JSYEARTOJD},
   {"JulianToJD                ",MENU_JULIANTOJD},
   {"JulianWeek                ",MENU_JULIANWEEK},
   {"JDToJulian                ",MENU_JDTOJULIAN},
   {"JulianEaster              ",MENU_JULIANEASTER},
   {"ValidJulianDate           ",MENU_VALIDJULIANDATE},
   {"JulianLastMonthDay        ",MENU_JULIANLASTMONTHDAY},
   {"NextValidJulianDate       ",MENU_NEXTVALIDJULIANDATE},
   {"PreviousValidJulianDate   ",MENU_PREVIOUSVALIDJULIANDATE},
   {"JulianRangeDiff           ",MENU_JULIANRANGEDIFF},
   {"JulianWWtoDM              ",MENU_JULIANWWTODM},

   {"GregorianLeapYear         ",MENU_GREGORIANLEAPYEAR},
   {"GregorianMonthDays        ",MENU_GREGORIANMONTHDAYS},
   {"GregorianYearDays         ",MENU_GREGORIANYEARDAYS},
   {"GregorianDayDiff          ",MENU_GREGORIANDAYDIFF},
   {"GregorianWeekday          ",MENU_GREGORIANWEEKDAY},
   {"GregorianDaysBeforeWeekday",MENU_GREGORIANDAYSBEFOREWEEKDAY},
   {"GregorianDaysAfterWeekday ",MENU_GREGORIANDAYSAFTERWEEKDAY},
   {"GregorianDiffDateRange    ",MENU_GREGORIANDIFFDATERANGE},
   {"GYearToScaliger           ",MENU_GYEARTOSCALIGER},
   {"ScaligerYearToG           ",MENU_SCALIGERYEARTOG},
   {"GSYearToJD                ",MENU_GSYEARTOJD},
   {"GregorianToJD             ",MENU_GREGORIANTOJD},
   {"GregorianWeek             ",MENU_GREGORIANWEEK},
   {"JDToGregorian             ",MENU_JDTOGREGORIAN},
   {"GregorianEaster           ",MENU_GREGORIANEASTER},
   {"ValidGregorianDate        ",MENU_VALIDGREGORIANDATE},
   {"GregorianLastMonthDay     ",MENU_GREGORIANLASTMONTHDAY},
   {"NextValidGregorianDate    ",MENU_NEXTVALIDGREGORIANDATE},
   {"PreviousValidGregorianDate",MENU_PREVIOUSVALIDGREGORIANDATE},
   {"GregorianRangeDiff        ",MENU_GREGORIANRANGEDIFF},
   {"GregorianWWtoDM           ",MENU_GREGORIANWWTODM},

   #ifndef DATE_NO_HEIS
   {"HeisLeapYear              ",MENU_HEISLEAPYEAR},
   {"HeisMonthDays             ",MENU_HEISMONTHDAYS},
   {"HeisYearDays              ",MENU_HEISYEARDAYS},
   {"HeisDayDiff               ",MENU_HEISDAYDIFF},
   {"HeisWeekday               ",MENU_HEISWEEKDAY},
   {"HeisDaysBeforeWeekday     ",MENU_HEISDAYSBEFOREWEEKDAY},
   {"HeisDaysAfterWeekday      ",MENU_HEISDAYSAFTERWEEKDAY},
   {"HeisDiffDateRange         ",MENU_HEISDIFFDATERANGE},
   {"HYearToScaliger           ",MENU_HYEARTOSCALIGER},
   {"ScaligerYearToH           ",MENU_SCALIGERYEARTOH},
   {"HSYearToJD                ",MENU_HSYEARTOJD},
   {"HeisToJD                  ",MENU_HEISTOJD},
   {"HeisWeek                  ",MENU_HEISWEEK},
   {"JDToHeis                  ",MENU_JDTOHEIS},
   {"HeisEaster                ",MENU_HEISEASTER},
   {"ValidHeisDate             ",MENU_VALIDHEISDATE},
   {"HeisLastMonthDay          ",MENU_HEISLASTMONTHDAY},
   {"NextValidHeisDate         ",MENU_NEXTVALIDHEISDATE},
   {"PreviousValidHeisDate     ",MENU_PREVIOUSVALIDHEISDATE},
   {"HeisRangeDiff             ",MENU_HEISRANGEDIFF},
   {"HeisWWtoDM                ",MENU_HEISWWTODM},
   #endif
   */
   {"LeapYear                  ",MENU_LEAPYEAR},
   {"YearDays                  ",MENU_YEARDAYS},
   {"MonthDays                 ",MENU_MONTHDAYS},
   {"LastMonthDay              ",MENU_LASTMONTHDAY},
   {"YearToScaliger            ",MENU_YEARTOSCALIGER},
   {"ScaligerYearToYear        ",MENU_SCALIGERYEARTOYEAR},
   {"DateToJD                  ",MENU_DATETOJD},
   {"JDToDate                  ",MENU_JDTODATE},
   {"SYearToJD                 ",MENU_SYEARTOJD},
   {"Weekday                   ",MENU_WEEKDAY},
   {"DaysBeforeWeekday         ",MENU_DAYSBEFOREWEEKDAY},
   {"DaysAfterWeekday          ",MENU_DAYSAFTERWEEKDAY},
   {"DiffDateRange             ",MENU_DIFFDATERANGE},
   {"RangeDiff                 ",MENU_RANGEDIFF},
   {"DayDiff                   ",MENU_DAYDIFF},
   {"ValidDate                 ",MENU_VALIDDATE},
   {"NextValidDate             ",MENU_NEXTVALIDDATE},
   {"PreviousValidDate         ",MENU_PREVIOUSVALIDDATE},
   {"Week                      ",MENU_WEEK},
   {"Easter                    ",MENU_EASTER},
   {"WWtoDM                    ",MENU_WWTODM},

   {"GregorianMoonAge          ",MENU_GREGORIANMOONAGE},
   {"GregorianMoonPhase        ",MENU_GREGORIANMOONPHASE},

   {"WeekdayText               ",MENU_WEEKDAYTEXT},
   {"WeekdayShortText          ",MENU_WEEKDAYSHORTTEXT},
   {"MonthText                 ",MENU_MONTHTEXT},
   {"MonthShortText            ",MENU_MONTHSHORTTEXT},
   {"DateText                  ",MENU_DATETEXT},
   {"Compare2Dates             ",MENU_COMPARE2DATES},
   {"JDtoMJD                   ",MENU_JDTOMJD},
   {"MJDtoJD                   ",MENU_MJDTOJD},
   {"FormatDate                ",MENU_FORMATDATE},
   {"ParseDate                 ",MENU_PARSEDATE},
   {"DateToNum                 ",MENU_DATETONUM},
   {"NumToDate                 ",MENU_NUMTODATE},
   {"SetFirstWeekday           ",MENU_SETFIRSTWEEKDAY},
   {"SetCountry                ",MENU_SETCOUNTRY},
   {"SupplementCentury         ",MENU_SUPPLEMENTCENTURY},

   {"Compare2Times             ",MENU_COMPARE2TIMES},
   {"TimeToJD                  ",MENU_TIMETOJD},
   {"JDToTime                  ",MENU_JDTOTIME},
   {"TimeToNum                 ",MENU_TIMETONUM},
   {"NumToTime                 ",MENU_NUMTOTIME},
   {"TimeToSec                 ",MENU_TIMETOSEC},
   {"SecToTime                 ",MENU_SECTOTIME},
   {"TimeDiff                  ",MENU_TIMEDIFF},
   {"DiffTime                  ",MENU_DIFFTIME},
   {"FormatTime                ",MENU_FORMATTIME},
   {"ParseTime                 ",MENU_PARSETIME},
   {"TimeZoneFactor            ",MENU_TIMEZONEFACTOR},
   {"LMT                       ",MENU_LMT},

   {"LocalToGMT                ",MENU_LOCALTOGMT},
   {"GMTToLocal                ",MENU_GMTTOLOCAL},

   {NULL,0}
  };


 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 unsigned short readweek(void)
  {
   unsigned short week=0;

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


 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 22=Slovenian 23=Slovak 24=Croatian 25=Bosnian 26=Esthonian 27=Persian 28=Japanese: "); 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 char *writelanguage(date_Languages lang)
  {
   static char *langarr[] = {"locale.library","English","Deutsch","Francais","Espanol","Portugues","Dansk","Italiano","Nederlands","Norsk","Svenska","Polski","Suomalainen","Magyar","Greek","Esperanto","Turkish","Latin","Russian","Czech","Catalonian","Serbian","Slovenian","Slovak","Croatian","Bosnian","Esthonian","Persian","Japanese"};

   DEBUG_ENTER("writelanguage")

   DEBUG_EXIT("writelanguage","%s",langarr[(unsigned short)lang])
   return(langarr[(unsigned short)lang]);
  }


 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("\n%[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789äöüßÄÖÜß,. /:%-]",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"
     #ifndef DATE_NO_HEIS
            "; 2=Heis"
     #endif
            ": ");
     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);
  }


 static void printmenu(void)
  {
   unsigned short i,j;

   for (i=1;menu[i].nr != 0;i++)
    {
     j = i/2;
     if (i != j*2)
      {
       printf("%03hu : %s",i,menu[i].name);
      }
     else
      {
       printf(" | %03hu : %s\n",i,menu[i].name);
      }
    }
   j = i/2;
   if (i == j*2)
    {
     printf("\n");
    }
  }


 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,max;
   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 >= 320)
      {
       for (max = 1;menu[max].nr != 0;max++)
        {
        }
       do
        {
         printf("----------------------------------------------------------------\n");
         printmenu();
         printf("%03hu : %s\n",(unsigned short)0,menu[0].name);
         printf("It's your turn: "); fflush(stdout);
         scanf("%hu",&input);
         printf("----------------------------------------------------------------\n");
         do
          {
           if (input < max)
            {
             switch (menu[input].nr)
              {
               case MENU_QUIT :
		        break;
               case MENU_JULIANLEAPYEAR :
			writebool(date_JulianLeapYear(readlongyear()));
                        break;
               case MENU_GREGORIANLEAPYEAR :
			writebool(date_GregorianLeapYear(readlongyear()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISLEAPYEAR :
			writebool(date_HeisLeapYear(readlongyear()));
                        break;
               #endif
               case MENU_JULIANMONTHDAYS :
			printf("%hu\n",date_JulianMonthDays(readshortcardmonth(),readlongyear()));
                        break;
               case MENU_GREGORIANMONTHDAYS :
			printf("%hu\n",date_GregorianMonthDays(readshortcardmonth(),readlongyear()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISMONTHDAYS :
			printf("%hu\n",date_HeisMonthDays(readshortcardmonth(),readlongyear()));
                        break;
               #endif
               case MENU_JULIANYEARDAYS :
			printf("%u\n",date_JulianYearDays(readlongyear()));
                        break;
               case MENU_GREGORIANYEARDAYS :
			printf("%u\n",date_GregorianYearDays(readlongyear()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISYEARDAYS :
			printf("%u\n",date_HeisYearDays(readlongyear()));
                        break;
               #endif
               case MENU_JULIANDAYDIFF :
			printf("%ld\n",date_JulianDayDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               case MENU_GREGORIANDAYDIFF :
			printf("%ld\n",date_GregorianDayDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISDAYDIFF :
			printf("%ld\n",date_HeisDayDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               #endif
               case MENU_COMPARE2DATES :
			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 MENU_COMPARE2TIMES :
			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 MENU_DATETEXT :
			date_DateText(readdt(),text,readlanguage(),readwordclass());
                        printf("%s\n",text);
                        break;
               case MENU_JULIANWEEKDAY :
			wd = date_JulianWeekday(readshortcardday(),readshortcardmonth(),readlongyear());
                        writeweekday(wd);
                        break;
               case MENU_GREGORIANWEEKDAY :
			wd = date_GregorianWeekday(readshortcardday(),readshortcardmonth(),readlongyear());
                        writeweekday(wd);
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISWEEKDAY :
			wd = date_HeisWeekday(readshortcardday(),readshortcardmonth(),readlongyear());
                        writeweekday(wd);
                        break;
               #endif
               case MENU_JULIANDAYSBEFOREWEEKDAY :
			printf("%hu\n",date_JulianDaysBeforeWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                        break;
               case MENU_GREGORIANDAYSBEFOREWEEKDAY :
			printf("%hu\n",date_GregorianDaysBeforeWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISDAYSBEFOREWEEKDAY :
			printf("%hu\n",date_HeisDaysBeforeWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                        break;
               #endif
               case MENU_JULIANDAYSAFTERWEEKDAY :
			printf("%hu\n",date_JulianDaysAfterWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                        break;
               case MENU_GREGORIANDAYSAFTERWEEKDAY :
			printf("%hu\n",date_GregorianDaysAfterWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISDAYSAFTERWEEKDAY :
			printf("%hu\n",date_HeisDaysAfterWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday()));
                        break;
               #endif
               case MENU_JULIANDIFFDATERANGE :
			date_JulianDiffDateRange(readshortcardday(),readshortcardmonth(),readlongyear(),readlongdays(),readlongmonths(),readlongyears(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               case MENU_GREGORIANDIFFDATERANGE :
			date_GregorianDiffDateRange(readshortcardday(),readshortcardmonth(),readlongyear(),readlongdays(),readlongmonths(),readlongyears(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISDIFFDATERANGE :
			date_HeisDiffDateRange(readshortcardday(),readshortcardmonth(),readlongyear(),readlongdays(),readlongmonths(),readlongyears(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               #endif
               case MENU_JYEARTOSCALIGER :
			printf("%u\n",date_JYearToScaliger(readlongyear()));
                        break;
               case MENU_GYEARTOSCALIGER :
			printf("%u\n",date_GYearToScaliger(readlongyear()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HYEARTOSCALIGER :
			printf("%u\n",date_HYearToScaliger(readlongyear()));
                        break;
               #endif
               case MENU_SCALIGERYEARTOJ :
			printf("%lu\n",date_ScaligerYearToJ(readcardyear()));
                        break;
               case MENU_SCALIGERYEARTOG :
			printf("%lu\n",date_ScaligerYearToG(readcardyear()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_SCALIGERYEARTOH :
			printf("%lu\n",date_ScaligerYearToH(readcardyear()));
                        break;
               #endif
               case MENU_JSYEARTOJD :
			printf("%lu\n",date_JSYearToJD(readcardyear()));
                        break;
               case MENU_GSYEARTOJD :
			printf("%lu\n",date_GSYearToJD(readcardyear()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HSYEARTOJD :
			printf("%lu\n",date_HSYearToJD(readcardyear()));
                        break;
               #endif
               case MENU_JDTOMJD :
			printf("%lu\n",date_JDtoMJD(readlongcarddays()));
                        break;
               case MENU_MJDTOJD :
			printf("%lu\n",date_MJDtoJD(readlongcarddays()));
                        break;
               case MENU_JULIANTOJD :
			printf("%lu\n",date_JulianToJD(readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               case MENU_GREGORIANTOJD :
			printf("%lu\n",date_GregorianToJD(readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISTOJD :
	 		printf("%lu\n",date_HeisToJD(readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               #endif
               case MENU_TIMETOJD :
			printf("%f\n",time_TimeToJD(readshortcardhour(),readshortcardmin(),readshortcardsec()));
                        break;
               case MENU_JDTOTIME :
			time_JDToTime(readrealtime(),ARG(h),ARG(m),ARG(s));
                        printf("%hu:%hu:%hu\n",h,m,s);
                        break;
               case MENU_GREGORIANMOONAGE :
			printf("%hu\n",date_GregorianMoonAge(readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               case MENU_GREGORIANEASTER :
			date_GregorianEaster(readlongyear(),ARG(d),ARG(m));
                        printf("%hu.%hu.\n",d,m);
                        break;
               case MENU_TIMEZONEFACTOR :
			printf("%hd\n",time_TimeZoneFactor(readshortdegree()));
                        break;
               case MENU_LMT :
			printf("%lu\n",time_LMT(readlongcardsecs(),readrealmeridian(),readrealpos()));
                        break;
               case MENU_TIMETOSEC :
			printf("%lu\n",time_TimeToSec(readshortcardhour(),readshortcardmin(),readshortcardsec()));
                        break;
               case MENU_SECTOTIME :
			time_SecToTime(readlongcardsecs(),ARG(h),ARG(m),ARG(s));
                        printf("%hu:%hu:%hu\n",h,m,s);
                        break;
               case MENU_JULIANWEEK :
			printf("%hu\n",date_JulianWeek(readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               case MENU_GREGORIANWEEK :
			printf("%hu\n",date_GregorianWeek(readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISWEEK :
			printf("%hu\n",date_HeisWeek(readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               #endif
               case MENU_WEEKDAYTEXT :
			len = date_WeekdayText(readweekday(),text,readlanguage());
                        printf("%hu : %s\n",len,text);
                        break;
               case MENU_MONTHTEXT :
			len = date_MonthText(readshortcardmonth(),text,readlanguage());
                        printf("%hu : %s\n",len,text);
                        break;
               case MENU_WEEKDAYSHORTTEXT :
			len = date_WeekdayShortText(readweekday(),text,readlanguage());
                        printf("%hu : %s\n",len,text);
                        break;
               case MENU_MONTHSHORTTEXT :
			len = date_MonthShortText(readshortcardmonth(),text,readlanguage());
                        printf("%hu : %s\n",len,text);
                        break;
               case MENU_JDTOJULIAN :
			date_JDToJulian(readjd(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               case MENU_JDTOGREGORIAN :
			date_JDToGregorian(readjd(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_JDTOHEIS :
			date_JDToHeis(readjd(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               #endif
               case MENU_JULIANEASTER :
			date_JulianEaster(readlongyear(),ARG(d),ARG(m));
                        printf("%hu.%hu.\n",d,m);
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISEASTER :
			date_HeisEaster(readlongyear(),ARG(d),ARG(m));
                        printf("%hu.%hu.\n",d,m);
                        break;
               #endif
               caseMENU_GREGORIANMOONPHASE :
			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 MENU_TIMEDIFF :
			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 MENU_DIFFTIME :
			time_DiffTime(readshortcardhour(),readshortcardmin(),readshortcardsec(),readlongsecs(),ARG(h),ARG(m),ARG(s));
                        printf("%hu:%hu:%hu\n",h,m,s);
                        break;
               case MENU_SETFIRSTWEEKDAY :
			date_SetFirstWeekday(readweekday());
                        break;
               case MENU_SUPPLEMENTCENTURY :
			printf("%ld\n",date_SupplementCentury(readushortyear(),readlongyear()));
                        break;
               case MENU_SETCOUNTRY :
			date_SetCountry(readcountry());
                        break;
               case MENU_VALIDJULIANDATE :
			printf("%hu\n",date_ValidJulianDate(readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               case MENU_VALIDGREGORIANDATE :
			printf("%hu\n",date_ValidGregorianDate(readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_VALIDHEISDATE :
			printf("%hu\n",date_ValidHeisDate(readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               #endif
               case MENU_FORMATTIME :
			time_FormatTime(readtimeformatstring(),readshortcardchangeday(0),readshortcardchangehour(),readbooldst(),readshortcardhour(),readshortcardmin(),readshortcardsec(),readshortzonemin(),text);
                        printf("%s\n",text);
                        break;
               case MENU_PARSETIME :
			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 MENU_JULIANLASTMONTHDAY :
			printf("%hu\n",date_JulianLastMonthDay(readshortcardmonth(),readlongyear()));
                        break;
               case MENU_GREGORIANLASTMONTHDAY :
			printf("%hu\n",date_GregorianLastMonthDay(readshortcardmonth(),readlongyear()));
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISLASTMONTHDAY :
			printf("%hu\n",date_HeisLastMonthDay(readshortcardmonth(),readlongyear()));
                        break;
               #endif
               case MENU_NEXTVALIDJULIANDATE :
			date_NextValidJulianDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               case MENU_NEXTVALIDGREGORIANDATE :
			date_NextValidGregorianDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_NEXTVALIDHEISDATE :
			date_NextValidHeisDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               #endif
               case MENU_PREVIOUSVALIDJULIANDATE :
			date_PreviousValidJulianDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               case MENU_PREVIOUSVALIDGREGORIANDATE :
			date_PreviousValidGregorianDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_PREVIOUSVALIDHEISDATE :
			date_PreviousValidHeisDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               #endif
   	       case MENU_FORMATDATE :
			date_FormatDate(readdateformatstring(),readshortcardday(),readshortcardmonth(),readlongyear(),readlanguage(),text,readcalendartype());
	                printf("%s\n",text);
	     	        break;
               case MENU_PARSEDATE :
			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: %s\n",writelanguage(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 MENU_TIMETONUM :
			printf("%lu\n",time_TimeToNum(readshortcardhour(),readshortcardmin(),readshortcardsec()));
                        break;
               case MENU_NUMTOTIME :
			time_NumToTime(readlongcardtime(),ARG(h),ARG(m),ARG(s));
                        printf("%hu:%hu:%hu\n",h,m,s);
                        break;
               case MENU_DATETONUM :
			printf("%ld\n",date_DateToNum(readshortcardday(),readshortcardmonth(),readlongyear()));
                        break;
               case MENU_NUMTODATE :
			date_NumToDate(readlongdate(),ARG(d),ARG(m),ARG(y));
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               case MENU_JULIANRANGEDIFF :
			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 MENU_GREGORIANRANGEDIFF :
			date_GregorianRangeDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear(),ARG(ds),ARG(ms),ARG(ys));
             	        printf("P%ldY%hdM%hdD\n",ys,ms,ds);
                        break;
               #ifndef DATE_NO_HEIS
               case MENU_HEISRANGEDIFF :
			date_HeisRangeDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear(),ARG(ds),ARG(ms),ARG(ys));
             	        printf("P%ldY%hdM%hdD\n",ys,ms,ds);
                        break;
               #endif
	       case MENU_LOCALTOGMT :
			datetime_LocalToGMT(readjd(),readlongcardsecs(),readbooldst(),readshortzonemin(),&jd,&usecs);
	                printf("GMTJD=%lu GMTsecs=%lu\n",jd,usecs);
	     	        break;
	       case MENU_GMTTOLOCAL :
			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;
               case MENU_LEAPYEAR :
			writebool(date_LeapYear(readlongyear(),readcalendartype()));
                        break;
               case MENU_MONTHDAYS :
			printf("%hu\n",date_MonthDays(readshortcardmonth(),readlongyear(),readcalendartype()));
                        break;
               case MENU_YEARDAYS :
			printf("%u\n",date_YearDays(readlongyear(),readcalendartype()));
                        break;
               case MENU_DAYDIFF :
			printf("%ld\n",date_DayDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear(),readcalendartype()));
                        break;
               case MENU_WEEKDAY :
			wd = date_Weekday(readshortcardday(),readshortcardmonth(),readlongyear(),readcalendartype());
                        writeweekday(wd);
                        break;
               case MENU_DAYSBEFOREWEEKDAY :
			printf("%hu\n",date_DaysBeforeWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday(),readcalendartype()));
                        break;
               case MENU_DAYSAFTERWEEKDAY :
			printf("%hu\n",date_DaysAfterWeekday(readshortcardday(),readshortcardmonth(),readlongyear(),readweekday(),readcalendartype()));
                        break;
               case MENU_DIFFDATERANGE :
			date_DiffDateRange(readshortcardday(),readshortcardmonth(),readlongyear(),readlongdays(),readlongmonths(),readlongyears(),ARG(d),ARG(m),ARG(y),readcalendartype());
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               case MENU_YEARTOSCALIGER :
			printf("%u\n",date_YearToScaliger(readlongyear(),readcalendartype()));
                        break;
               case MENU_SCALIGERYEARTOYEAR :
			printf("%lu\n",date_ScaligerYearToYear(readcardyear(),readcalendartype()));
                        break;
               case MENU_SYEARTOJD :
			printf("%lu\n",date_SYearToJD(readcardyear(),readcalendartype()));
                        break;
               case MENU_DATETOJD :
			printf("%lu\n",date_DateToJD(readshortcardday(),readshortcardmonth(),readlongyear(),readcalendartype()));
                        break;
               case MENU_EASTER :
			date_Easter(readlongyear(),ARG(d),ARG(m),readcalendartype());
                        printf("%hu.%hu.\n",d,m);
                        break;
               case MENU_WEEK :
			printf("%hu\n",date_Week(readshortcardday(),readshortcardmonth(),readlongyear(),readcalendartype()));
                        break;
               case MENU_JDTODATE :
			date_JDToDate(readjd(),ARG(d),ARG(m),ARG(y),readcalendartype());
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               case MENU_VALIDDATE :
			printf("%hu\n",date_ValidDate(readshortcardday(),readshortcardmonth(),readlongyear(),readcalendartype()));
                        break;
               case MENU_LASTMONTHDAY :
			printf("%hu\n",date_LastMonthDay(readshortcardmonth(),readlongyear(),readcalendartype()));
                        break;
               case MENU_NEXTVALIDDATE :
			date_NextValidDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y),readcalendartype());
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               case MENU_PREVIOUSVALIDDATE :
			date_PreviousValidDate(readshortcardday(),readshortcardmonth(),readlongyear(),ARG(d),ARG(m),ARG(y),readcalendartype());
                        printf("%hu.%hu.%ld\n",d,m,y);
                        break;
               case MENU_RANGEDIFF :
			date_RangeDiff(readshortcardday(),readshortcardmonth(),readlongyear(),readshortcardday(),readshortcardmonth(),readlongyear(),ARG(ds),ARG(ms),ARG(ys),readcalendartype());
                        printf("P%ldY%hdM%hdD\n",ys,ms,ds);
                        break;
               case MENU_JULIANWWTODM :
               		date_JulianWWtoDM(readweekday(),readweek(),readlongyear(),ARG(d),ARG(d),ARG(y));
			break;
               case MENU_GREGORIANWWTODM :
               		date_GregorianWWtoDM(readweekday(),readweek(),readlongyear(),ARG(d),ARG(d),ARG(y));
			break;
	       #ifndef DATE_NO_HEIS
               case MENU_HEISWWTODM :
               		date_HeisWWtoDM(readweekday(),readweek(),readlongyear(),ARG(d),ARG(d),ARG(y));
			break;
               #endif
               case MENU_WWTODM :
               		date_WWtoDM(readweekday(),readweek(),readlongyear(),ARG(d),ARG(d),ARG(y),readcalendartype());
			break;
               default  : printf("Wong number! Try again!\n");
              }
            }
           if ((input > 0) && (input < max))
            {
             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);
  }
