(*
**
** Copyright © 1996-1998 Kai Hofmann. All rights reserved.
** Registered Amiga shared library!
**
** $VER: Date.mod 33.297 (29.01.98)
**
** Experimental version, please report bugs/improvements!
*)

 MODULE Date;


 IMPORT
   e * := Exec;


 TYPE
   MoonPhases		* = SHORTINT;
   Weekdays		* = SHORTINT;
   DateTexts		* = SHORTINT;
   WordClass		* = SHORTINT;
   Languages		* = SHORTINT;
   Countries		* = SHORTINT;
   Calendars		* = SHORTINT;
   ChangeDay		* = SHORTINT;
   DateBasePtr          * = UNTRACED POINTER TO DateBase;
   DateBase             * = e.Library;


 CONST
   dateName		* = "date.library";
   dateMinVersion	* = 33;
   dateMinRevision	* = 297;

   (* Types for MoonPhases *)
   NewMoon	* = 0;
   FirstQuarter * = 1;
   FullMoon	* = 2;
   LastQuarter	* = 3;

   (* Types for Weekdays *)
   dayerr	* = 0;
   Monday	* = 1;
   Tuesday	* = 2;
   Wednesday	* = 3;
   Thursday	* = 4;
   Friday	* = 5;
   Saturday	* = 6;
   Sunday	* = 7;

   (* Types for DateTexts *)
   day		* =  0;
   month	* =  1;
   year		* =  2;
   week		* =  3;
   weekday	* =  4;
   hour		* =  5;
   minute	* =  6;
   second	* =  7;
   yesterday	* =  8;
   today	* =  9;
   tomorrow	* = 10;

   (* Types for WordClass *)
   singular	* = 0;
   plural	* = 1;
   periodical	* = 2;

   (* Types for Languages *)
   Locale	* = 0;
   English	* = 1;
   German	* = 2;
   French	* = 3;
   Spanish	* = 4;
   Portuguese	* = 5;
   Danish	* = 6;
   Italian	* = 7;
   Dutch	* = 8;
   Norwegian	* = 9;
   Swedish	* = 10;
   Polish	* = 11;
   Finnish	* = 12;
   Hungarian	* = 13;
   Greek	* = 14;
   Esperanto	* = 15;
   Turkish	* = 16;
   Latin	* = 17;
   Russian	* = 18;
   Czech	* = 19;
   Catalonian	* = 20;
   Serbian	* = 21;
   LASTLANGUAGE	* = 22;

   (* Types for Countries *)
   unknown	* = 0;
   Italia	* = 1;
   Deutschland	* = 2;
   Schweiz	* = 3;
   Danmark	* = 4;
   Nederland	* = 5;
   GreatBritain	* = 6;
   USA		* = 7;
   Sweden	* = 8;

   (* Types for Calendars *)
   Julian	* = 0;
   Gregorian	* = 1;
   Heis		* = 2;

   (* Types for ChangeDay *)
   Normal		* = 0;
   WinterToSummer	* = 1;
   SummerToWinter	* = 2;

 VAR
   base * : DateBasePtr;


 PROCEDURE TimeToJD *{base,-294}(hour{0}, min{1}, sec{2} : SHORTINT) : REAL;
 PROCEDURE JDToTime *{base,-300}(jd{0} : REAL; VAR rhour{8}, rmin{9}, rsec{10} : SHORTINT);
 PROCEDURE TimeZoneFactor *{base,-318}(degree{0} : SHORTINT) : SHORTINT;
 PROCEDURE LMT *{base,-324}(secs {0} : LONGINT; meridiandegree{1}, posdegree{2} : REAL) : LONGINT;
 PROCEDURE TimeToSec *{base,-330}(hour{0}, min{1}, sec{2} : SHORTINT) : LONGINT;
 PROCEDURE SecToTime *{base,-336}(secs{0} : LONGINT; VAR hour{8}, min{9}, sec{10} : SHORTINT);
 PROCEDURE Compare2Times *{base,-426}(hour1{0}, min1{1}, sec1{2}, hour2{3}, min2{4}, sec2{5} : SHORTINT) : SHORTINT;
 PROCEDURE ValidTime *{base,-438}(hour{0}, min{1}, sec{2} : SHORTINT) : BOOLEAN;
 PROCEDURE TimeDiff *{base,-468}(hour1{0}, min1{1}, sec1{2}, hour2{3}, min2{4}, sec2{5} : SHORTINT) : LONGINT;
 PROCEDURE DiffTime *{base,-474}(hour{0}, min{1}, sec{2} : SHORTINT; diffsecs{3} : LONGINT; VAR rhour{8}, rmin{9}, rsec{10} : SHORTINT);
 PROCEDURE FormatTime *{base,-498}(fmt{8} : POINTER TO CHAR; ChangeDay{0} : ChangeDay; ChangeHour{1} : SHORTINT; DST{2} : BOOLEAN; hour{3}, min{4}, sec{5}, zonemin{6} : SHORTINT; tstr{9} : POINTER TO CHAR);
 PROCEDURE ParseTime *{base,-504}(fmt{0}, tstr{1} : POINTER TO CHAR; ChangeDay{2} : ChangeDay; ChangeHour{3} : SHORTINT; VAR DST{4} : BOOLEAN; VAR hour{8}, min{9}, sec{10} : SHORTINT; VAR zonemin{11} : SHORTINT; pfmt{5} : POINTER TO CHAR) : SHORTINT;
 PROCEDURE TimeToNum *{base,-594}(hour{0}, min{1}, sec{2} : SHORTINT) : LONGINT;
 PROCEDURE NumToTime *{base,-600}(num{0}: LONGINT; rhour{8}, rmin{9}, rsec{10} : SHORTINT);


 PROCEDURE JulianLeapYear    *{base,-30}(year{0} : LONGINT) : BOOLEAN;
 PROCEDURE GregorianLeapYear *{base,-36}(year{0} : LONGINT) : BOOLEAN;
 PROCEDURE HeisLeapYear      *{base,-42}(year{0} : LONGINT) : BOOLEAN;
 PROCEDURE JulianMonthDays    *{base,-48}(month{0} : SHORTINT; year{1} : LONGINT) : SHORTINT;
 PROCEDURE GregorianMonthDays *{base,-54}(month{0} : SHORTINT; year{1} : LONGINT) : SHORTINT;
 PROCEDURE HeisMonthDays      *{base,-60}(month{0} : SHORTINT; year{1} : LONGINT) : SHORTINT;
 PROCEDURE JulianYearDays    *{base,-66}(year{0} : LONGINT) : LONGINT;
 PROCEDURE GregorianYearDays *{base,-72}(year{0} : LONGINT) : LONGINT;
 PROCEDURE HeisYearDays      *{base,-78}(year{0} : LONGINT) : LONGINT;
 PROCEDURE Compare2Dates *{base,-420}(day1{0}, month1{1} : SHORTINT; year1{2} : LONGINT; day2{3}, month2{4} : SHORTINT; year2{5} : LONGINT) : SHORTINT;
 PROCEDURE JulianDayDiff    *{base,-120}(day1{0}, month1{1} : SHORTINT; year1{2} : LONGINT; day2{3}, month2{4} : SHORTINT; year2{5} : LONGINT) : LONGINT;
 PROCEDURE GregorianDayDiff *{base,-126}(day1{0}, month1{1} : SHORTINT; year1{2} : LONGINT; day2{3}, month2{4} : SHORTINT; year2{5} : LONGINT) : LONGINT;
 PROCEDURE HeisDayDiff      *{base,-132}(day1{0}, month1{1} : SHORTINT; year1{2} : LONGINT; day2{3}, month2{4} : SHORTINT; year2{5} : LONGINT) : LONGINT;
 PROCEDURE JulianWeekday    *{base,-138}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : Weekdays;
 PROCEDURE GregorianWeekday *{base,-144}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : Weekdays;
 PROCEDURE HeisWeekday      *{base,-150}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : Weekdays;
 PROCEDURE JulianDaysBeforeWeekday    *{base,-156}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; weekday{3} : Weekdays) : SHORTINT;
 PROCEDURE GregorianDaysBeforeWeekday *{base,-162}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; weekday{3} : Weekdays) : SHORTINT;
 PROCEDURE HeisDaysBeforeWeekday      *{base,-168}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; weekday{3} : Weekdays) : SHORTINT;
 PROCEDURE JulianDaysAfterWeekday     *{base,-174}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; weekday{3} : Weekdays) : SHORTINT;
 PROCEDURE GregorianDaysAfterWeekday  *{base,-180}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; weekday{3} : Weekdays) : SHORTINT;
 PROCEDURE HeisDaysAfterWeekday       *{base,-186}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; weekday{3} : Weekdays) : SHORTINT;
 PROCEDURE JulianDiffDate    *{base,-192}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; days{3} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE GregorianDiffDate *{base,-198}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; days{3} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE HeisDiffDate      *{base,-204}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; days{3} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE JYearToScaliger *{base,-210}(year{0} : LONGINT) : LONGINT;
 PROCEDURE GYearToScaliger *{base,-216}(year{0} : LONGINT) : LONGINT;
 PROCEDURE HYearToScaliger *{base,-222}(year{0} : LONGINT) : LONGINT;
 PROCEDURE ScaligerYearToJ *{base,-228}(syear{0} : LONGINT) : LONGINT;
 PROCEDURE ScaligerYearToG *{base,-234}(syear{0} : LONGINT) : LONGINT;
 PROCEDURE ScaligerYearToH *{base,-240}(syear{0} : LONGINT) : LONGINT;
 PROCEDURE JSYearToJD *{base,-246}(syear{0} : LONGINT) : LONGINT;
 PROCEDURE GSYearToJD *{base,-252}(syear{0} : LONGINT) : LONGINT;
 PROCEDURE HSYearToJD *{base,-258}(syear{0} : LONGINT) : LONGINT;
 PROCEDURE JDtoMJD *{base,-264}(jd{0} : LONGINT) : LONGINT;
 PROCEDURE MJDtoJD *{base,-270}(mjd{0} : LONGINT) : LONGINT;
 PROCEDURE JulianToJD    *{base,-276}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : LONGINT;
 PROCEDURE GregorianToJD *{base,-282}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : LONGINT;
 PROCEDURE HeisToJD      *{base,-288}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : LONGINT;
 PROCEDURE GregorianMoonAge *{base,-306}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : SHORTINT;
 PROCEDURE JulianEaster    *{base,-402}(year{0} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT);
 PROCEDURE GregorianEaster *{base,-312}(year{0} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT);
 PROCEDURE HeisEaster      *{base,-408}(year{0} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT);
 PROCEDURE JulianWeek    *{base,-342}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : SHORTINT;
 PROCEDURE GregorianWeek *{base,-348}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : SHORTINT;
 PROCEDURE HeisWeek      *{base,-354}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : SHORTINT;
 PROCEDURE WeekdayText      *{base,-360}(wday{0} : Weekdays; wtext{8} : POINTER TO CHAR; lang{1} : Languages) : SHORTINT;
 PROCEDURE WeekdayShortText *{base,-272}(wday{0} : Weekdays; wtext{8} : POINTER TO CHAR; lang{1} : Languages) : SHORTINT;
 PROCEDURE MonthText      *{base,-366}(month{0} : SHORTINT; mtext{8} : POINTER TO CHAR; lang{1} : Languages) : SHORTINT;
 PROCEDURE MonthShortText *{base,-378}(month{0} : SHORTINT; mtext{8} : POINTER TO CHAR; lang{1} : Languages) : SHORTINT;
 PROCEDURE DateText *{base,-432}(text{0} : DateTexts; mtext{8} : POINTER TO CHAR; lang{1} : Languages; wc{2} : WordClass);
 PROCEDURE JDToJulian    *{base,-384}(jd{0} : LONGINT; VAR day{8}, month{9} : SHORTINT; VAR year{10} : LONGINT);
 PROCEDURE JDToGregorian *{base,-390}(jd{0} : LONGINT; VAR day{8}, month{9} : SHORTINT; VAR year{10} : LONGINT);
 PROCEDURE JDToHeis      *{base,-396}(jd{0} : LONGINT; VAR day{8}, month{9} : SHORTINT; VAR year{10} : LONGINT);
 PROCEDURE GregorianMoonPhase *{base,-414}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; phase{3} : MoonPhases) : LONGINT;
 PROCEDURE ValidJulianDate    *{base,-444}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : BOOLEAN;
 PROCEDURE ValidGregorianDate *{base,-450}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : BOOLEAN;
 PROCEDURE ValidHeisDate      *{base,-456}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : BOOLEAN;
 PROCEDURE SetCountry *{base,-462}(country{0} : Countries);
 PROCEDURE SetFirstWeekday *{base,-480}(weekday{0} : Weekdays);
 PROCEDURE SupplementCentury *{base,-486}(year{0} : SHORTINT; actualyear{1} : LONGINT) : LONGINT;
 PROCEDURE JulianLastMonthDay *{base,-510}(month{0} : SHORTINT; year{1} : LONGINT) : SHORTINT;
 PROCEDURE GregorianLastMonthDay *{base,-516}(month{0} : SHORTINT; year{1} : LONGINT) : SHORTINT;
 PROCEDURE HeisLastMonthDay *{base,-522}(month{0} : SHORTINT; year{1} : LONGINT) : SHORTINT;
 PROCEDURE NextValidJulianDate *{base,-528}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE NextValidGregorianDate *{base,-534}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE NextValidHeisDate *{base,-540}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE PreviousValidJulianDate *{base,-546}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE PreviousValidGregorianDate *{base,-552}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE PreviousValidHeisDate *{base,-558}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE FormatDate *{base,-564}(fmt{8} : POINTER TO CHAR; day{0}, month{1} : SHORTINT; year{2} : LONGINT; lang{3} : Languages; tstr{9} : POINTER TO CHAR);
 PROCEDURE ParseDate *{base,-570}(fmt{0},  dstr{1} : POINTER TO CHAR; lang{2} : Languages; calendar{3} : Calendars; actualjd{4} : LONGINT; VAR day{8}, month{9} : SHORTINT; VAR year{10} : LONGINT; pfmt{11} : POINTER TO CHAR; VAR plang{5} : Languages) : SHORTINT;
 PROCEDURE JulianWWtoDM *{base,-576}(weekday{0} : Weekdays; week{1} : SHORTINT; year{2} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE GregorianWWtoDM *{base,-582}(weekday{0} : Weekdays; week{1} : SHORTINT; year{2} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE HeisWWtoDM *{base,-588}(weekday{0} : Weekdays; week{1} : SHORTINT; year{2} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE DateToNum *{base,-606}(day{0}, month{1} : SHORTINT; year{2} : LONGINT) : LONGINT;
 PROCEDURE NumToDate *{base,-612}(num{0} : LONGINT; VAR day{8}, month{9} : SHORTINT; VAR year{10} : LONGINT);
 PROCEDURE JulianDiffDate *{base,-618}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; days{3}, months{4}, years{5} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE GregorianDiffDate *{base,-624}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; days{3}, months{4}, years{5} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE HeisDiffDate *{base,-630}(day{0}, month{1} : SHORTINT; year{2} : LONGINT; days{3}, months{4}, years{5} : LONGINT; VAR dday{8}, dmonth{9} : SHORTINT; VAR dyear{10} : LONGINT);
 PROCEDURE JulianDayDiff *{base,-636}(day1{0}, month1{1} : SHORTINT; year1{2} : LONGINT; day2{3}, month2{4} : SHORTINT; year2{5} : LONGINT; VAR days{8}, months{9} : SHORTINT; VAR years{10} : LONGINT);
 PROCEDURE GregorianDayDiff *{base,-642}(day1{0}, month1{1} : SHORTINT; year1{2} : LONGINT; day2{3}, month2{4} : SHORTINT; year2{5} : LONGINT; VAR days{8}, months{9} : SHORTINT; VAR years{10} : LONGINT);
 PROCEDURE HeisDayDiff *{base,-648}(day1{0}, month1{1} : SHORTINT; year1{2} : LONGINT; day2{3}, month2{4} : SHORTINT; year2{5} : LONGINT; VAR days{8}, months{9} : SHORTINT; VAR years{10} : LONGINT);

 BEGIN
   base := e.OpenLibrary(dateName,dateMinVersion);
 CLOSE
   IF base # NIL THEN
     e.CloseLibrary(base);
   END;
 END Date.
