/*                    *** jtog.c ***                                 */
/*                                                                   */
/* IBM - PC microsoft "C"                                            */
/*                                                                   */
/* function to convert a julian date (1 = 1st day AD) into a         */
/* gregorian date in the format mm/dd/yy.  Returns a 0 if successful */
/* or a -1 if not.                                                   */
/*                                                                   */
/* WARNING - if outdate is not dimensioned at least 9 characters a   */
/*           memory overwrite will occure.                           */
/*                                                                   */
/* Written by L. Cuthbertson, March 1984                             */
/*                                                                   */
/*********************************************************************/
/*                                                                   */

#define CENTRY 19
#define TRUE 1
#define FALSE 0
 
int jtog(julian,outdate)
char outdate[];
register long julian;
{
	static int monthd[] = {0,31,59,90,120,151,181,212,243,273,304,334};
	int centry,leap,i,iyr,imo,iday;
	static long cdays = 36524, ydays = 365;

	/* reduce julian from 1st day AD to 1st day of CENTRY */
	julian -= CENTRY*cdays + CENTRY/4;

	/* determine year */
	iyr = julian/ydays;
	if ((julian - (iyr*ydays + iyr/4)) < 0)
		iyr -= 1;
	if (iyr < 0)
		return(-1);

	/* determine if this is a leap year or not */
	if (iyr%4 == 0 && iyr != 0 || CENTRY%4 == 0)
		leap = TRUE;
	else
		leap = FALSE;

	/* determine month */
	julian = julian - (iyr*ydays + iyr/4);
	if (leap) julian += 1;
	for (imo=12;imo>0;imo--) {
		i=0;
		if ((leap) && (imo > 2)) i = -1;
		if ((julian - monthd[imo-1] + i) > 0) break;
	}
	if (imo == 0) imo = 1;

	/* determine day */
	iday = julian - monthd[imo-1] + i;
	if (iday == 0) {
		iyr -= 1;
		if (iyr < 0) return(-1);
		imo = 12;
		iday = 31;
	}

	/* transfer into output string */
	if (imo > 9)
		outdate[0] = '1';
	else
		outdate[0] = '0';
	outdate[1] = (char)(imo%10 + '0');
	outdate[2] = '/';

	if (iday > 9)
		outdate[3] = (char)(iday/10 + '0');
	else
		outdate[3] = '0';
	outdate[4] = (char)(iday%10 + '0');
	outdate[5] = '/';

	if (iyr > 9)
		outdate[6] = (char)(iyr/10 + '0');
	else
		outdate[6] = '0';
	outdate[7] = (char)(iyr%10 + '0');
	outdate[8] = '\0';

	/* done */
	return(0);
}
