2.9BSD/usr/contrib/notes/gdate.c

Compare this file to the similar file:
Show the results in this format:

static char *sccsid = "%W%";

#include "parms.h"
#include "structs.h"

/*
 * this gdate routine reads a "search date" from the keyboard.  This date
 * must be of the form mm/dd or mm/dd/yy (number of digits in each is
 * irrelevant).  it sets the date parameter correctly to the input or
 * returns -1 to indicate failure to complete a date (i.e., a return alone
 * was entered on a line).  If the date is invalid, it must be retyped.
 * I know it is unfortunate that we can't have a plato arrow type judging
 * system here.  I just don't want to go to all the hassle of making one now.
 * perhaps this is an area of improvement for this program.  RK  11/10/80.
 *
 */

#define	TIMELEN	20				/* length of time entry */

gdate (date) struct when_f *date;
{
    char    datin[TIMELEN + 1],
            fmt[DATELEN];
    char buf[BUFSIZ];
    register int    i,
                    pass;
    struct when_f   today;
    int     ih,
            imin,
            im,
            iy,
            id;					/* temporary month/day/year */
    gettime (&today);
    pass = 0;
    while (1) {
	sprdate(date, fmt);			/* show him current setting */
	sprintf(buf, "Set to read notes since: %-*s", DATELEN, fmt);
	at(-1, 1);
	putstr(buf);
	for (i = 0; i < TIMELEN; i++) {
	    datin[i] = ' ';
	}
	prompt("New Date (m/d/y h:m) > ");
	i = gline(datin, TIMELEN);
	at(-1, 1);
	clear_eol();
	if (i == 1) {
	    if (pass) {
		return(0);
	    } else {
		return(-1);				/* return on 1st pass */
	    }
	}
	i = sscanf (datin, "%d/%d/%d %d:%d", &im, &id, &iy, &ih, &imin);
	switch (i) {
	    case 5:				/* specified the whole shot */
		if (imin > 59 || imin < 0) {
		    goto err;				/* bad news */
		}
		date->w_mins = imin;

	    case 4: 			/* only specified through hours */
		if (ih > 23 || ih < 0) {
		    goto err;
		}
		date->w_hours = ih;
	    case 3: 				/* specified through year */
		iy += 1900;			/* adjust the date */
		if (iy < 1970 || iy > 1999) {
		    goto err;
		}
		date->w_year = iy;
	    case 2: 				/* specified the day */
		if (id < 1 || id > 31) {
		    goto err;
		}
		date->w_day = id;
	    case 1:				/* just specifed month */
		if (im < 1 || im > 12) {
		    goto err;
		}
		date->w_month = im;
		break;

	    default: 
		i = 0;					/* bad news */
		break;
	}

	if (i < 3) {		/* just did date, default hours/mins/year */
	    date->w_year = today.w_year;
	    date->w_hours = date->w_mins = 0;
	}
	pass = 1;			/* have parsed at least once */
	continue;

err: 							/* bad entry */
	printf("\07");
    }
}