Metropoli BBS
VIEWER: date.c MODE: TEXT (ASCII)
/****************************************************************/
/*								*/
/*			     date.c				*/
/*								*/
/*		     command.com "date" Command			*/
/*								*/
/*			 November 6, 1991			*/
/*								*/
/*			Copyright (c) 1995			*/
/*			Pasquale J. Villani			*/
/*			All Rights Reserved			*/
/*								*/
/* This file is part of DOS-C.					*/
/*								*/
/* DOS-C is free software; you can redistribute it and/or	*/
/* modify it under the terms of the GNU General Public License	*/
/* as published by the Free Software Foundation; either version	*/
/* 2, or (at your option) any later version.			*/
/*								*/
/* DOS-C is distributed in the hope that it will be useful, but	*/
/* WITHOUT ANY WARRANTY; without even the implied warranty of	*/
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See	*/
/* the GNU General Public License for more details.		*/
/*								*/
/* You should have received a copy of the GNU General Public	*/
/* License along with DOS-C; see the file COPYING.  If not,	*/
/* write to the Free Software Foundation, 675 Mass Ave,		*/
/* Cambridge, MA 02139, USA.					*/
/****************************************************************/


/* $Logfile:   C:/dos-c/src/command/date.c_v  $ */

/*
 * $Log:   C:/dos-c/src/command/date.c_v  $
 * 
 *    Rev 1.1   01 Sep 1995 18:04:36   patv
 * First GPL release.
 * 
 *    Rev 1.0   02 Jul 1995 10:01:50   patv
 * Initial revision.
 */

#include "../../hdr/portab.h"
#include "globals.h"
#include "proto.h"

static BYTE *RcsId = "$Header:   C:/dos-c/src/command/date.c_v   1.1   01 Sep 1995 18:04:36   patv  $";

static BYTE *day_of_wk[7] =
	{ "Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat" };

static COUNT day_per_mm[2][13] =
	{
		{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 30 },
		{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 30 }
	};



#ifdef PROTO
BOOL parse_date(BYTE *);
#else
BOOL parse_date();
#endif


BOOL cmd_date(argc, argv)
COUNT argc;
BYTE **argv;
{
	BYTE date_str[MAX_CMDLINE] = "";
	BOOL DosSetDate();
	BOOL parse_date();
	COUNT month, day, year, weekday;

	if(argc == 1)
	{
		BOOL ret;

		/* display the date and get new date */
		DosGetDate(&weekday, &month, &day, &year);

		printf("Current date is %s %d-%d-%d\nEnter date(mm-dd-yy): ",
		day_of_wk[weekday], month, day, year);

		ret = parse_date(date_str);
		printf("\n");
		return ret;
	}

	if(argc == 2)
	{
		printf("\n");
		return parse_date(argv[1]);
	}
	else
	{
		error_message(INV_NUM_PARAMS);
		return FALSE;
	}
}

BOOL parse_date(s)
BYTE *s;
{
	COUNT Month, MonthDay, Year, leap;
	Month = MonthDay = Year = 0;

	if(*s == '\0')
	{
		DosRead(STDIN, s, MAX_CMDLINE);
		if(*s == '\0')
			return TRUE;
	}

	if(isnum(*s))
	{
		while(isnum(*s))
		{
			Month *= 10;
			Month += tonum(*s++);
		}
	}
	else
		return FALSE;
	if(*s == '/' || *s == '.' || *s == '-')
		++s;
	else
		return FALSE;
	if(isnum(*s))
	{
		while(isnum(*s))
		{
			MonthDay *= 10;
			MonthDay += tonum(*s++);
		}
		if(*s == '/' || *s == '.' || *s == '-')
		{
			++s;

			if(isnum(*s))
			{
				while(isnum(*s))
				{
					Year *= 10;
					Year += tonum(*s++);
				}
			}
		}
	}


	if(Year >= 0 && Year <= 99)
		Year = 1900 + Year;

	leap = ((Year%4 == 0) && (Year%100 != 0)) || (Year%400 == 0);
	if( !((Month >= 1 && Month <= 12) &&
	    (MonthDay >=1 && MonthDay <= day_per_mm[leap][Month]) &&
	     (Year >= 1980 && Year <= 2099)) )
	{
		error_message(INV_DATE);
		return FALSE;
	}
	/* all ok set the date */
	return DosSetDate(&Month, &MonthDay, &Year) == SUCCESS;
}
[ RETURN TO DIRECTORY ]