mirror of
https://github.com/reactos/reactos.git
synced 2024-09-11 13:23:51 +00:00
252 lines
4.2 KiB
C
252 lines
4.2 KiB
C
/*
|
|
* TIME.C - time internal command.
|
|
*
|
|
*
|
|
* History:
|
|
*
|
|
* 07/08/1998 (John P. Price)
|
|
* started.
|
|
*
|
|
* 27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
|
|
* added config.h include
|
|
*
|
|
* 09-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
|
|
* Added locale support.
|
|
*
|
|
* 19-Jan-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
|
|
* Unicode and redirection safe!
|
|
* Added "/t" option.
|
|
*
|
|
* 04-Feb-1999 (Eric Kohl <ekohl@abo.rhein-zeitung.de>)
|
|
* Fixed time input bug.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#ifdef INCLUDE_CMD_TIME
|
|
|
|
#include <windows.h>
|
|
#include <tchar.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
|
|
#include "cmd.h"
|
|
|
|
|
|
static VOID
|
|
PrintTime (VOID)
|
|
{
|
|
#ifdef __REACTOS__
|
|
SYSTEMTIME st;
|
|
|
|
GetLocalTime (&st);
|
|
|
|
switch (nTimeFormat)
|
|
{
|
|
case 0: /* 12 hour format */
|
|
default:
|
|
ConOutPrintf (_T("Current time is %2d%c%02d%c%02d%c%02d%c\n"),
|
|
(st.wHour == 0 ? 12 : (st.wHour <= 12 ? st.wHour : st.wHour - 12)),
|
|
cTimeSeparator, st.wMinute, cTimeSeparator, st.wSecond, cDecimalSeparator,
|
|
st.wMilliseconds / 10, (st.wHour <= 11 ? 'a' : 'p'));
|
|
break;
|
|
|
|
case 1: /* 24 hour format */
|
|
ConOutPrintf (_T("Current time is %2d%c%02d%c%02d%c%02d\n"),
|
|
st.wHour, cTimeSeparator, st.wMinute, cTimeSeparator,
|
|
st.wSecond, cDecimalSeparator, st.wMilliseconds / 10);
|
|
break;
|
|
}
|
|
#else
|
|
TCHAR szTime[32];
|
|
|
|
GetTimeFormat (LOCALE_USER_DEFAULT, 0, NULL, NULL,
|
|
szTime, sizeof (szTime));
|
|
ConOutPrintf (_T("Current date is: %s\n"), szTime);
|
|
#endif
|
|
}
|
|
|
|
|
|
static BOOL ParseTime (LPTSTR s)
|
|
{
|
|
SYSTEMTIME t;
|
|
LPTSTR p = s;
|
|
|
|
if (!*s)
|
|
return TRUE;
|
|
|
|
GetLocalTime (&t);
|
|
t.wHour = 0;
|
|
t.wMinute = 0;
|
|
t.wSecond = 0;
|
|
t.wMilliseconds = 0;
|
|
|
|
// first get hour
|
|
if (_istdigit(*p))
|
|
{
|
|
while (_istdigit(*p))
|
|
{
|
|
t.wHour = t.wHour * 10 + *p - _T('0');
|
|
p++;
|
|
}
|
|
}
|
|
else
|
|
return FALSE;
|
|
|
|
// get time separator
|
|
if (*p != cTimeSeparator)
|
|
return FALSE;
|
|
p++;
|
|
|
|
// now get minutes
|
|
if (_istdigit(*p))
|
|
{
|
|
while (_istdigit(*p))
|
|
{
|
|
t.wMinute = t.wMinute * 10 + *p - _T('0');
|
|
p++;
|
|
}
|
|
}
|
|
else
|
|
return FALSE;
|
|
|
|
// get time separator
|
|
if (*p != cTimeSeparator)
|
|
return FALSE;
|
|
p++;
|
|
|
|
// now get seconds
|
|
if (_istdigit(*p))
|
|
{
|
|
while (_istdigit(*p))
|
|
{
|
|
t.wSecond = t.wSecond * 10 + *p - _T('0');
|
|
p++;
|
|
}
|
|
}
|
|
else
|
|
return FALSE;
|
|
|
|
// get decimal separator
|
|
if (*p == cDecimalSeparator)
|
|
{
|
|
p++;
|
|
|
|
// now get hundreths
|
|
if (_istdigit(*p))
|
|
{
|
|
while (_istdigit(*p))
|
|
{
|
|
// t.wMilliseconds = t.wMilliseconds * 10 + *p - _T('0');
|
|
p++;
|
|
}
|
|
// t.wMilliseconds *= 10;
|
|
}
|
|
}
|
|
|
|
/* special case: 12 hour format */
|
|
if (nTimeFormat == 0)
|
|
{
|
|
if (_totupper(*s) == _T('P'))
|
|
{
|
|
t.wHour += 12;
|
|
}
|
|
|
|
if ((_totupper(*s) == _T('A')) && (t.wHour == 12))
|
|
{
|
|
t.wHour = 0;
|
|
}
|
|
}
|
|
|
|
if (t.wHour > 23 || t.wMinute > 60 || t.wSecond > 60 || t.wMilliseconds > 999)
|
|
return FALSE;
|
|
|
|
SetLocalTime (&t);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
INT cmd_time (LPTSTR cmd, LPTSTR param)
|
|
{
|
|
LPTSTR *arg;
|
|
INT argc;
|
|
INT i;
|
|
BOOL bPrompt = TRUE;
|
|
INT nTimeString = -1;
|
|
|
|
if (!_tcsncmp (param, _T("/?"), 2))
|
|
{
|
|
ConOutPuts (_T("Displays or sets the system time.\n\n"
|
|
"TIME [/T][time]\n\n"
|
|
" /T display only\n\n"
|
|
"Type TIME with no parameters to display the current time setting and a prompt\n"
|
|
"for a new one. Press ENTER to keep the same time."));
|
|
return 0;
|
|
}
|
|
|
|
/* build parameter array */
|
|
arg = split (param, &argc);
|
|
|
|
/* check for options */
|
|
for (i = 0; i < argc; i++)
|
|
{
|
|
if (_tcsicmp (arg[i], _T("/t")) == 0)
|
|
bPrompt = FALSE;
|
|
if ((*arg[i] != _T('/')) && (nTimeString == -1))
|
|
nTimeString = i;
|
|
}
|
|
|
|
if (nTimeString == -1)
|
|
PrintTime ();
|
|
|
|
if (!bPrompt)
|
|
{
|
|
freep (arg);
|
|
return 0;
|
|
}
|
|
|
|
while (1)
|
|
{
|
|
if (nTimeString == -1)
|
|
{
|
|
TCHAR s[40];
|
|
|
|
ConOutPrintf (_T("Enter new time: "));
|
|
|
|
ConInString (s, 40);
|
|
|
|
#ifdef _DEBUG
|
|
DebugPrintf ("\'%s\'\n", s);
|
|
#endif
|
|
|
|
while (*s && s[_tcslen (s) - 1] < _T(' '))
|
|
s[_tcslen(s) - 1] = _T('\0');
|
|
|
|
if (ParseTime (s))
|
|
{
|
|
freep (arg);
|
|
return 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (ParseTime (arg[nTimeString]))
|
|
{
|
|
freep (arg);
|
|
return 0;
|
|
}
|
|
|
|
/* force input the next time around. */
|
|
nTimeString == -1;
|
|
}
|
|
ConErrPuts (_T("Invalid time."));
|
|
}
|
|
|
|
freep (arg);
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|