xref: /reactos/base/shell/cmd/time.c (revision cce399e7)
1 /*
2  *  TIME.C - time internal command.
3  *
4  *
5  *  History:
6  *
7  *    07/08/1998 (John P. Price)
8  *        started.
9  *
10  *    27-Jul-1998 (John P Price <linux-guru@gcfl.net>)
11  *        added config.h include
12  *
13  *    09-Jan-1999 (Eric Kohl)
14  *        Added locale support.
15  *
16  *    19-Jan-1999 (Eric Kohl)
17  *        Unicode and redirection safe!
18  *        Added "/t" option.
19  *
20  *    04-Feb-1999 (Eric Kohl)
21  *        Fixed time input bug.
22  *
23  *    30-Apr-2005 (Magnus Olsen <magnus@greatlord.com>)
24  *        Remove all hardcoded strings in En.rc.
25  */
26 
27 #include "precomp.h"
28 
29 #ifdef INCLUDE_CMD_TIME
30 
31 
32 static BOOL ParseTime (LPTSTR s)
33 {
34     SYSTEMTIME t;
35     LPTSTR p = s;
36 
37     if (!*s)
38         return TRUE;
39 
40     GetLocalTime (&t);
41     t.wHour = 0;
42     t.wMinute = 0;
43     t.wSecond = 0;
44     t.wMilliseconds = 0;
45 
46     // first get hour
47     if (_istdigit(*p))
48     {
49         while (_istdigit(*p))
50         {
51             t.wHour = t.wHour * 10 + *p - _T('0');
52             p++;
53         }
54     }
55     else
56         return FALSE;
57 
58     // get time separator
59     if (*p != cTimeSeparator)
60         return FALSE;
61     p++;
62 
63     // now get minutes
64     if (_istdigit(*p))
65     {
66         while (_istdigit(*p))
67         {
68             t.wMinute = t.wMinute * 10 + *p - _T('0');
69             p++;
70         }
71     }
72     else
73         return FALSE;
74 
75     // get time separator
76     if (*p != cTimeSeparator)
77         return FALSE;
78     p++;
79 
80     // now get seconds
81     if (_istdigit(*p))
82     {
83         while (_istdigit(*p))
84         {
85             t.wSecond = t.wSecond * 10 + *p - _T('0');
86             p++;
87         }
88     }
89     else
90         return FALSE;
91 
92     // get decimal separator
93     if (*p == cDecimalSeparator)
94     {
95         p++;
96 
97         // now get hundreths
98         if (_istdigit(*p))
99         {
100             while (_istdigit(*p))
101             {
102                 // t.wMilliseconds = t.wMilliseconds * 10 + *p - _T('0');
103                 p++;
104             }
105             // t.wMilliseconds *= 10;
106         }
107     }
108 
109     /* special case: 12 hour format */
110     if (nTimeFormat == 0)
111     {
112         if (_totupper(*s) == _T('P'))
113         {
114             t.wHour += 12;
115         }
116 
117         if ((_totupper(*s) == _T('A')) && (t.wHour == 12))
118         {
119             t.wHour = 0;
120         }
121     }
122 
123     if (t.wHour > 23 || t.wMinute > 60 || t.wSecond > 60 || t.wMilliseconds > 999)
124         return FALSE;
125 
126     SetLocalTime (&t);
127 
128     return TRUE;
129 }
130 
131 
132 INT cmd_time(LPTSTR param)
133 {
134     LPTSTR* arg;
135     INT argc;
136     INT i;
137     INT nTimeString = -1;
138     TCHAR szTime[40];
139 
140     if (!_tcsncmp(param, _T("/?"), 2))
141     {
142         ConOutResPaging(TRUE, STRING_TIME_HELP1);
143         return 0;
144     }
145 
146     nErrorLevel = 0;
147 
148     /* Build the parameter array */
149     arg = split(param, &argc, FALSE, FALSE);
150 
151     /* Check for options */
152     for (i = 0; i < argc; i++)
153     {
154         if (bEnableExtensions && (_tcsicmp(arg[i], _T("/T")) == 0))
155         {
156             /* Display current time in short format */
157             SYSTEMTIME st;
158             GetLocalTime(&st);
159             FormatTime(szTime, &st);
160             ConOutPrintf(_T("%s\n"), szTime);
161             freep(arg);
162             return 0;
163         }
164 
165         if ((*arg[i] != _T('/')) && (nTimeString == -1))
166             nTimeString = i;
167     }
168 
169     if (nTimeString == -1)
170     {
171         ConOutResPuts(STRING_TIME_NOW);
172         ConOutPrintf(_T("%s\n"), GetTimeString());
173     }
174 
175     while (TRUE)
176     {
177         if (nTimeString == -1)
178         {
179             ConOutResPuts(STRING_TIME_HELP2);
180             ConInString(szTime, ARRAYSIZE(szTime));
181 
182             TRACE("\'%s\'\n", debugstr_aw(szTime));
183 
184             while (*szTime && szTime[_tcslen(szTime) - 1] < _T(' '))
185                 szTime[_tcslen(szTime) - 1] = _T('\0');
186 
187             if (ParseTime(szTime))
188             {
189                 freep(arg);
190                 return 0;
191             }
192         }
193         else
194         {
195             if (ParseTime(arg[nTimeString]))
196             {
197                 freep(arg);
198                 return 0;
199             }
200 
201             /* Force input the next time around */
202             nTimeString = -1;
203         }
204 
205         ConErrResPuts(STRING_TIME_ERROR);
206         nErrorLevel = 1;
207     }
208 
209     freep(arg);
210     return 0;
211 }
212 
213 #endif
214