/*-
 * char *
 * getdate(int formatflag, int argcnt, int argc, char **argv)
 *	argc and argv are environment parameters (or the equivalent)
 *	argcnt is the count at which to start tests on argv[]
 *	formatflag determines the return string:
 *	-0	Mon dd[, yyyy]
 *	-1	Mon dd, yyyy (Wday) julian_day
 *	-2	mm:dd:yyyy:wdaynum:julian_day
 *	-3	Mon:dd:yyyy:Wday:julian_day
 *	-4	julian_day
 */

/*
 * getdate() is a wrapper for a Lex and yacc-based analyzer and parser for
 * converting string (with date and modification commands) to a data
 * structure with julian date and the gregorian month, day, year, and
 * weekday. 
 *
 * J.A. Rupley, Tucson, Az  85716 
 *
 *
 * Julian date functions (jday() and jdate()) by: 
 *
 * Robert G. Tantzen; Translator: Nat Howard 
 */

#include <stdio.h>

#include "jul_greg.h"

struct jul_greg jg;

/* pointer to text buffer in getdate() (used for input by yylex()) */
char           *sp;

/* static area with date string and pointer to it, returned by getdate() */
static char     retdate[80];
static char    *retpntr;

/* conversion of month and weekday ordinals to strings */
static char    *month[] = {
			   "Jan",
			   "Feb",
			   "Mar",
			   "Apr",
			   "May",
			   "Jun",
			   "Jul",
			   "Aug",
			   "Sep",
			   "Oct",
			   "Nov",
			   "Dec",
};
static char    *weekday[] = {
			     "Sun",
			     "Mon",
			     "Tue",
			     "Wed",
			     "Thu",
			     "Fri",
			     "Sat",
};

char           *
getdate(formatflag, argcnt, argc, argv)
	int             formatflag;
	int             argcnt;
	int             argc;
	char          **argv;
{
	char            inbuf[BUFSIZ];
	int             i;
	int             this_year;

	char           *strcat();

	/* initialize gregorian and julian storage at today's date */
	jg_init(&jg);
	this_year = jg.y;

	/* set up command buffer for reading by yylex() */
	*inbuf = 0;
	for (i = argcnt; i < argc; i++) {
		strcat(inbuf, argv[i]);
		strcat(inbuf, " ");
	}
	sp = inbuf;

	switch (yyparse()) {
	case 1:		/* yyparse() error */
		retpntr = (char *) 0;
		break;
	case 2:		/* a date difference stored in 'julian' */
		sprintf(retdate, "%ld", jg.j);
		retpntr = &retdate[0];
		break;
	case 0:		/* normal output */
		switch (formatflag) {
		case 0:	/* "Mon dd[, yyyy]" */
			if (jg.y != this_year)
				sprintf(retdate, "%s %02d, %4d", month[jg.m - 1], jg.d, jg.y);
			else
				sprintf(retdate, "%s %02d", month[jg.m - 1], jg.d);
			retpntr = &retdate[0];
			break;
		case 1:	/* "Mon dd, yyyy (Weekday) julian_day" */
			sprintf(retdate, "%s %02d, %04d (%s) %ld", month[jg.m - 1], jg.d, jg.y, weekday[jg.wd], jg.j);
			retpntr = &retdate[0];
			break;
		case 2:	/* "mm:dd:yyyy:wdaynum:julian_day" */
			sprintf(retdate, "%d\t%d\t%d\t%d\t%ld", jg.m, jg.d, jg.y, jg.wd, jg.j);
			retpntr = &retdate[0];
			break;
		case 3:	/* "Mon:dd:yyyy:Weekday:julian_day" */
			sprintf(retdate, "%s\t%d\t%d\t%s\t%ld", month[jg.m - 1], jg.d, jg.y, weekday[jg.wd], jg.j);
			retpntr = &retdate[0];
			break;
		case 4:	/* "julian_day" */
			sprintf(retdate, "%ld", jg.j);
			retpntr = &retdate[0];
			break;
		default:
			retpntr = (char *) 0;
			break;
		}
		break;
	default:
		retpntr = (char *) 0;
		break;
	}
	return retpntr;
}
