/****************************************************************/
/* */
/* time.c */
/* */
/* DOS "time" Command */
/* */
/* December 16, 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/time.c_v $ */
/*
* $Log: C:/dos-c/src/command/time.c_v $
*
* Rev 1.1 01 Sep 1995 18:04:44 patv
* First GPL release.
*
* Rev 1.0 02 Jul 1995 10:02:24 patv
* Initial revision.
*/
static char *RcsId = "$Header: C:/dos-c/src/command/time.c_v 1.1 01 Sep 1995 18:04:44 patv $";
#include "../../hdr/portab.h"
#include "../../hdr/error.h"
#include "globals.h"
#include "proto.h"
extern BYTE *tail;
#ifdef PROTO
BOOL parse_time(BYTE *);
#else
BOOL parse_time();
#endif
BOOL cmd_time(VOID)
{
BYTE am_pm, c;
BYTE time_in[MAX_CMDLINE] = "";
BOOL parse_time();
VOID set_time();
COUNT hour;
COUNT min;
COUNT sec;
COUNT hdths;
BYTE *p, *q;
for(p = tail, q = time_in; *p && *p != '\r' && *p != '\n'; )
*q++ = *p++;
*q = '\0';
DosGetTime(&hour, &min, &sec, &hdths);
if(hour >=12)
{
hour -= 12;
am_pm = 'p';
}
else
am_pm = 'a';
/* user setting time check it */
if(time_in[0] != '\0')
{
while(!parse_time(time_in))
{
error_message(INV_TIME);
printf("Enter new time: ");
DosRead(STDIN, (BYTE FAR *)time_in, MAX_CMDLINE);
if(*time_in == '\r')
break;
}
}
else
{
printf("Current time is %-2d:%02d:%02d.%02d%c\nEnter new time: ", hour == 0 ? 12 : hour, min, sec, hdths, am_pm);
DosRead(STDIN, (BYTE FAR *)time_in, MAX_CMDLINE);
if(*time_in == '\r')
{
printf("\n");
return TRUE;
}
while(!parse_time(time_in))
{
error_message(INV_TIME);
printf("Enter new time: ");
DosRead(STDIN, (BYTE FAR *)time_in, MAX_CMDLINE);
if(*time_in == '\r')
break;
}
}
printf("\n");
return TRUE;
}
BOOL parse_time(s)
BYTE *s;
{
COUNT hr = 0, min = 0, sec = 0, hndth = 0;
BYTE am_pm = ' ';
if(isnum(*s))
{
while(isnum(*s))
{
hr *= 10;
hr += tonum(*s++);
}
}
else
return FALSE;
if(*s == ':')
++s;
else
return FALSE;
if(isnum(*s))
{
while(isnum(*s))
{
min *= 10;
min += tonum(*s++);
}
if(*s == ':')
{
++s;
if(isnum(*s))
{
while(isnum(*s))
{
sec *= 10;
sec += tonum(*s++);
}
}
if(*s == '.')
{
++s;
if(isnum(*s))
{
while(isnum(*s))
{
hndth *= 10;
hndth += tonum(*s++);
}
}
}
}
}
if(*s == 'p' || *s == 'P' || *s == 'a' || *s == 'A')
{
am_pm = *s++;
}
if(*s != '\r' && !(*s == 'm' || *s == 'M'))
return FALSE;
if((am_pm == ' ' && (hr < 0 || hr > 24)) ||
(am_pm == 'a' && hr > 12)
|| (am_pm == 'p' && !(hr >= 1 && hr <= 12)))
return FALSE;
if(min < 0 || min > 60 || sec < 0 || sec > 60 || hndth < 0 || hndth > 99 )
return FALSE;
if(am_pm == 'p' || am_pm == 'P')
hr += 12;
if((am_pm == 'a' || am_pm == 'A') && hr == 12)
hr = 0;
return DosSetTime(&hr, &min, &sec, &hndth) == SUCCESS;
}