/*- * 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 #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; }