|
|
1.1 root 1: /*
2: * datetime.c
3: *
4: * Purpose:
5: * mostly stolen from winfile
6: * converted to unicode and added PutCounterTime
7: *
8: * Owner:
9: * MikeSart
10: */
11: #define UNICODE 1
12:
13: #include <windows.h>
14: #include <windowsx.h>
15: #include <time.h>
16: #include "netwatch.h"
17:
18: TCHAR szShortDate[11] = TEXT("MM/DD/YY");
19: TCHAR szTime[4] = TEXT(":");
20: TCHAR sz1159[9] = TEXT("AM");
21: TCHAR sz2359[9] = TEXT("PM");
22: TCHAR szInternational[] = TEXT("Intl");
23: TCHAR szComma[4] = TEXT(",");
24: TCHAR szDecimal[4] = TEXT(".");
25: //INT iTime = 1; // Default to 24-hour time
26: INT iTime = 0; // Default to 12-hour time
27: INT iTLZero = FALSE; // Default to non-leading zeros
28: //INT iTLZero = TRUE; // Default to leading zeros
29:
30: #define COUNTOF(_sz) (sizeof(_sz) / sizeof(TCHAR))
31:
32: //--------------------------------------------------------------------------
33: //
34: // GetPict() -
35: //
36: //--------------------------------------------------------------------------
37:
38: // This gets the number of consecutive chrs of the same kind. This is used
39: // to parse the time picture. Returns 0 on error.
40: UINT
41: GetPict(TCHAR ch, TCHAR *szStr)
42: {
43: register UINT count;
44:
45: count = 0;
46: while(ch == *szStr++)
47: count++;
48:
49: return count;
50: }
51:
52: /*--------------------------------------------------------------------------*/
53: /* */
54: /* GetInternational() - */
55: /* */
56: /*--------------------------------------------------------------------------*/
57: VOID
58: GetInternational(VOID)
59: {
60: GetProfileString(szInternational, TEXT("sShortDate"), szShortDate, szShortDate, COUNTOF(szShortDate));
61: if(szShortDate[0])
62: CharUpper(szShortDate);
63: GetProfileString(szInternational, TEXT("sTime"), szTime, szTime, COUNTOF(szTime));
64: GetProfileString(szInternational, TEXT("s1159"), sz1159, sz1159, COUNTOF(sz1159));
65: GetProfileString(szInternational, TEXT("s2359"), sz2359, sz2359, COUNTOF(sz2359));
66: GetProfileString(szInternational, TEXT("sThousand"), szComma, szComma, COUNTOF(szComma));
67: GetProfileString(szInternational, TEXT("sDecimal"), szDecimal, szDecimal, COUNTOF(szDecimal));
68:
69: iTime = GetProfileInt(szInternational, TEXT("iTime"), iTime);
70: iTLZero = GetProfileInt(szInternational, TEXT("iTLZero"), iTLZero);
71: }
72:
73: /////////////////////////////////////////////////////////////////////
74: //
75: // Name: CreateDate
76: //
77: // Synopsis: Converts a local time to a localized string
78: //
79: // IN lpst LPSYSTEMTIME local system time
80: // INOUT lpszOutStr -- string of date
81: //
82: // Return: INT length of date
83: //
84: // Assumes: lpszOutStr is large enough for the date string.
85: // Separator is one character long
86: //
87: // Effects: lpszOutStr modified.
88: //
89: //
90: // Notes: albertt (255 1.26)
91: //
92: /////////////////////////////////////////////////////////////////////
93: INT
94: CreateDate(LPSYSTEMTIME lpst, TCHAR *szOutStr)
95: {
96: INT i;
97: UINT cchPictPart;
98: UINT uDigits, uVal, uValT;
99: register TCHAR *pszPict;
100: register TCHAR *pszInStr;
101: TCHAR *pChar;
102: BOOL bClipping = FALSE;
103:
104: pszPict = szShortDate;
105: pszInStr = szOutStr;
106:
107: for(i = 0; i < 3; i++)
108: {
109: cchPictPart = GetPict(*pszPict, pszPict);
110: switch(*pszPict)
111: {
112: case 'M':
113: uVal = lpst->wMonth;
114: goto CDDoIt;
115:
116: case 'D':
117: uVal = lpst->wDay;
118: goto CDDoIt;
119:
120: case 'Y':
121: uVal = lpst->wYear;
122: bClipping = TRUE;
123:
124: // goto CDDoIt;
125: CDDoIt:
126:
127: //
128: // Move pszPict to the separator
129: //
130: pszPict += cchPictPart;
131:
132: //
133: // First calculate how many digits there are
134: //
135: for(uDigits=0, uValT=uVal; uValT;uDigits++)
136: {
137: uValT /= 10;
138: }
139:
140: //
141: // Store any necessary leading zeros
142: //
143: while(uDigits < cchPictPart)
144: {
145: *pszInStr++ = '0';
146: cchPictPart--;
147: }
148:
149: //
150: // Allow clipping (1993 -> 93) IF bClipping on
151: // (Only for Year)
152: //
153: if(bClipping && uDigits > cchPictPart)
154: {
155: uDigits = cchPictPart;
156: }
157: bClipping = FALSE;
158:
159: //
160: // Write out the number now one digit at a time
161: // From end to beginning..
162: //
163: // Set pszInStr to the end of the date string
164: //
165: pszInStr += uDigits;
166:
167: //
168: // Now walk backwards:
169: // We must pre-decrement pChar since it now points to
170: // the next character AFTER our string.
171: //
172: for(pChar = pszInStr; uDigits; uVal /= 10, uDigits--)
173: {
174: *--pChar = (TCHAR) ((uVal % 10) + '0');
175: }
176:
177: //
178: // Add the separator
179: //
180: if(*pszPict)
181: *pszInStr++ = *pszPict;
182:
183: break;
184: }
185: pszPict++;
186: }
187:
188: *pszInStr = 0;
189:
190: return lstrlen(szOutStr);
191: }
192:
193: /////////////////////////////////////////////////////////////////////
194: //
195: // Name: CreateTime
196: //
197: // Synopsis: Creates a localized time string for local time
198: //
199: // IN lpst LPSYSTEMTIME local time
200: // INOUT lpszOutStr -- String
201: //
202: // Return: INT length of string
203: //
204: //
205: // Assumes: lpszOutStr is big enough for all times
206: //
207: // Effects: lpszOutStr modified.
208: // Separator is 1 character
209: //
210: //
211: // Notes:
212: //
213: /////////////////////////////////////////////////////////////////////
214: INT
215: CreateTime(LPSYSTEMTIME lpst, TCHAR *szOutStr, BOOL fCounter)
216: {
217: INT i;
218: BOOL bAM;
219: UINT uHourMinSec;
220: register UINT uDigit;
221: register TCHAR *pszInStr;
222: UINT uValArray[3];
223:
224: uDigit = uValArray[0] = lpst->wHour;
225: uValArray[1] = lpst->wMinute;
226: uValArray[2] = lpst->wSecond;
227:
228: pszInStr = szOutStr;
229:
230: bAM = (uDigit < 12);
231:
232: if(!fCounter && !iTime)
233: {
234: if(uDigit >= 12)
235: uDigit -= 12;
236:
237: if(!uDigit)
238: uDigit = 12;
239: }
240:
241: uValArray[0] = uDigit;
242: for(i = 0; i < 3; i++)
243: {
244: uHourMinSec = uValArray[i];
245:
246: if((i == 0) && fCounter)
247: {
248: wsprintf(pszInStr, szFmtNum, uValArray[0]);
249: pszInStr += lstrlen(pszInStr);
250: }
251: else
252: {
253: // This assumes that the values are of two digits only.
254: uDigit = uHourMinSec / 10;
255:
256: if (i > 0)
257: *pszInStr++ = (TCHAR)(uDigit + '0');
258: else if (uDigit || iTLZero)
259: *pszInStr++ = (TCHAR)(uDigit + '0');
260:
261: *pszInStr++ = (TCHAR)((uHourMinSec % 10) + '0');
262: }
263:
264: // Assumes time sep. is 1 char long
265: if(i < 2)
266: *pszInStr++ = *szTime;
267: }
268:
269: if(fCounter)
270: {
271: *pszInStr = 0;
272: }
273: else
274: {
275: if(bAM)
276: lstrcpy(pszInStr, sz1159);
277: else
278: lstrcpy(pszInStr, sz2359);
279: }
280:
281: return lstrlen(szOutStr);
282: }
283:
284:
285: /*--------------------------------------------------------------------------*/
286: /* */
287: /* PutDate() - */
288: /* */
289: /*--------------------------------------------------------------------------*/
290: TCHAR *
291: PutDate(time_t tm_t, TCHAR *szStr)
292: {
293: SYSTEMTIME st;
294: struct tm *ptm;
295:
296: ptm = localtime(&tm_t);
297:
298: st.wYear = ptm->tm_year + 1900;
299: st.wMonth = ptm->tm_mon + 1;
300: st.wDay = ptm->tm_mday;
301:
302: CreateDate(&st, szStr);
303: return szStr;
304: }
305:
306:
307: /*--------------------------------------------------------------------------*/
308: /* */
309: /* PutTime() - */
310: /* */
311: /*--------------------------------------------------------------------------*/
312: TCHAR *
313: PutTime(time_t tm_t, TCHAR *szStr)
314: {
315: SYSTEMTIME st;
316: struct tm *ptm;
317:
318: ptm = localtime(&tm_t);
319:
320: st.wHour = ptm->tm_hour;
321: st.wMinute = ptm->tm_min;
322: st.wSecond = ptm->tm_sec;
323: st.wMilliseconds = 0;
324:
325: CreateTime(&st, szStr, FALSE);
326: return szStr;
327: }
328:
329: TCHAR *
330: PutCounterTime(DWORD dwTime, TCHAR *szStr)
331: {
332: SYSTEMTIME st;
333:
334: st.wHour = (WORD)(dwTime / 3600);
335: dwTime -= (st.wHour * 3600);
336: st.wMinute = (WORD)(dwTime / 60);
337: dwTime -= (st.wMinute * 60);
338: st.wSecond = (WORD)dwTime;
339: st.wMilliseconds = 0;
340:
341: CreateTime(&st, szStr, TRUE);
342: return szStr;
343: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.