/*******************************************************************************
** Compute the local date from a given Julian day number.                     **
*******************************************************************************/
#include <math.h>

#define IGREG 2299161 /* Julian day number of October 15th, 1582 */

void caldat(julian,mm,dd,yyyy)
long julian;
int *mm,*dd,*yyyy;
   {
   long jalpha,ja,jb,jc,jd,to_long();

   if(julian < IGREG) /* Julian calendar */
      ja = julian + 1524;
   else { /* Gregorian calendar */
      jalpha = to_long((julian-1867216.25)/36524.25);
      ja     = julian + jalpha - to_long(0.25*jalpha) + 1525;
      }
   jb = to_long(6680.+((ja-2439870)-122.1)/365.25);
   jc = 365*jb+to_long(0.25*jb);
   jd = to_long((ja-jc)/30.6001);
   *dd = (int)(ja-jc-to_long(30.6001*jd));
   *mm = (int)jd-1;
   if(*mm > 12)
      *mm -= 12;
   *yyyy = (int)jb-4715;
   if(*mm > 2)
      --(*yyyy);
   if(*yyyy <= 0)
      --(*yyyy);
   }

/*******************************************************************************
** Compute the local time in (hour, minute) from a given day fraction.        **
*******************************************************************************/
void caltim(jd_frac,hour,min)
double jd_frac;
int    *hour;
int    *min;
   {
   double x;

   x = jd_frac * 24.;
   *hour = (int)floor(x);
   x -= floor(x);
   x *= 60.;
   *min = (int)floor(x);
   }
