1*f6dc9357SAndroid Build Coastguard Worker // MyWindows.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include <stdlib.h>
8*f6dc9357SAndroid Build Coastguard Worker #include <time.h>
9*f6dc9357SAndroid Build Coastguard Worker #ifdef __GNUC__
10*f6dc9357SAndroid Build Coastguard Worker #include <sys/time.h>
11*f6dc9357SAndroid Build Coastguard Worker #endif
12*f6dc9357SAndroid Build Coastguard Worker
13*f6dc9357SAndroid Build Coastguard Worker #include "MyWindows.h"
14*f6dc9357SAndroid Build Coastguard Worker
AllocateForBSTR(size_t cb)15*f6dc9357SAndroid Build Coastguard Worker static inline void *AllocateForBSTR(size_t cb) { return ::malloc(cb); }
FreeForBSTR(void * pv)16*f6dc9357SAndroid Build Coastguard Worker static inline void FreeForBSTR(void *pv) { ::free(pv);}
17*f6dc9357SAndroid Build Coastguard Worker
18*f6dc9357SAndroid Build Coastguard Worker /* Win32 uses DWORD (32-bit) type to store size of string before (OLECHAR *) string.
19*f6dc9357SAndroid Build Coastguard Worker We must select CBstrSizeType for another systems (not Win32):
20*f6dc9357SAndroid Build Coastguard Worker
21*f6dc9357SAndroid Build Coastguard Worker if (CBstrSizeType is UINT32),
22*f6dc9357SAndroid Build Coastguard Worker then we support only strings smaller than 4 GB.
23*f6dc9357SAndroid Build Coastguard Worker Win32 version always has that limitation.
24*f6dc9357SAndroid Build Coastguard Worker
25*f6dc9357SAndroid Build Coastguard Worker if (CBstrSizeType is UINT),
26*f6dc9357SAndroid Build Coastguard Worker (UINT can be 16/32/64-bit)
27*f6dc9357SAndroid Build Coastguard Worker We can support strings larger than 4 GB (if UINT is 64-bit),
28*f6dc9357SAndroid Build Coastguard Worker but sizeof(UINT) can be different in parts compiled by
29*f6dc9357SAndroid Build Coastguard Worker different compilers/settings,
30*f6dc9357SAndroid Build Coastguard Worker and we can't send such BSTR strings between such parts.
31*f6dc9357SAndroid Build Coastguard Worker */
32*f6dc9357SAndroid Build Coastguard Worker
33*f6dc9357SAndroid Build Coastguard Worker typedef UINT32 CBstrSizeType;
34*f6dc9357SAndroid Build Coastguard Worker // typedef UINT CBstrSizeType;
35*f6dc9357SAndroid Build Coastguard Worker
36*f6dc9357SAndroid Build Coastguard Worker #define k_BstrSize_Max 0xFFFFFFFF
37*f6dc9357SAndroid Build Coastguard Worker // #define k_BstrSize_Max UINT_MAX
38*f6dc9357SAndroid Build Coastguard Worker // #define k_BstrSize_Max ((UINT)(INT)-1)
39*f6dc9357SAndroid Build Coastguard Worker
SysAllocStringByteLen(LPCSTR s,UINT len)40*f6dc9357SAndroid Build Coastguard Worker BSTR SysAllocStringByteLen(LPCSTR s, UINT len)
41*f6dc9357SAndroid Build Coastguard Worker {
42*f6dc9357SAndroid Build Coastguard Worker /* Original SysAllocStringByteLen in Win32 maybe fills only unaligned null OLECHAR at the end.
43*f6dc9357SAndroid Build Coastguard Worker We provide also aligned null OLECHAR at the end. */
44*f6dc9357SAndroid Build Coastguard Worker
45*f6dc9357SAndroid Build Coastguard Worker if (len >= (k_BstrSize_Max - (UINT)sizeof(OLECHAR) - (UINT)sizeof(OLECHAR) - (UINT)sizeof(CBstrSizeType)))
46*f6dc9357SAndroid Build Coastguard Worker return NULL;
47*f6dc9357SAndroid Build Coastguard Worker
48*f6dc9357SAndroid Build Coastguard Worker UINT size = (len + (UINT)sizeof(OLECHAR) + (UINT)sizeof(OLECHAR) - 1) & ~((UINT)sizeof(OLECHAR) - 1);
49*f6dc9357SAndroid Build Coastguard Worker void *p = AllocateForBSTR(size + (UINT)sizeof(CBstrSizeType));
50*f6dc9357SAndroid Build Coastguard Worker if (!p)
51*f6dc9357SAndroid Build Coastguard Worker return NULL;
52*f6dc9357SAndroid Build Coastguard Worker *(CBstrSizeType *)p = (CBstrSizeType)len;
53*f6dc9357SAndroid Build Coastguard Worker BSTR bstr = (BSTR)((CBstrSizeType *)p + 1);
54*f6dc9357SAndroid Build Coastguard Worker if (s)
55*f6dc9357SAndroid Build Coastguard Worker memcpy(bstr, s, len);
56*f6dc9357SAndroid Build Coastguard Worker for (; len < size; len++)
57*f6dc9357SAndroid Build Coastguard Worker ((Byte *)bstr)[len] = 0;
58*f6dc9357SAndroid Build Coastguard Worker return bstr;
59*f6dc9357SAndroid Build Coastguard Worker }
60*f6dc9357SAndroid Build Coastguard Worker
SysAllocStringLen(const OLECHAR * s,UINT len)61*f6dc9357SAndroid Build Coastguard Worker BSTR SysAllocStringLen(const OLECHAR *s, UINT len)
62*f6dc9357SAndroid Build Coastguard Worker {
63*f6dc9357SAndroid Build Coastguard Worker if (len >= (k_BstrSize_Max - (UINT)sizeof(OLECHAR) - (UINT)sizeof(CBstrSizeType)) / (UINT)sizeof(OLECHAR))
64*f6dc9357SAndroid Build Coastguard Worker return NULL;
65*f6dc9357SAndroid Build Coastguard Worker
66*f6dc9357SAndroid Build Coastguard Worker UINT size = len * (UINT)sizeof(OLECHAR);
67*f6dc9357SAndroid Build Coastguard Worker void *p = AllocateForBSTR(size + (UINT)sizeof(CBstrSizeType) + (UINT)sizeof(OLECHAR));
68*f6dc9357SAndroid Build Coastguard Worker if (!p)
69*f6dc9357SAndroid Build Coastguard Worker return NULL;
70*f6dc9357SAndroid Build Coastguard Worker *(CBstrSizeType *)p = (CBstrSizeType)size;
71*f6dc9357SAndroid Build Coastguard Worker BSTR bstr = (BSTR)((CBstrSizeType *)p + 1);
72*f6dc9357SAndroid Build Coastguard Worker if (s)
73*f6dc9357SAndroid Build Coastguard Worker memcpy(bstr, s, size);
74*f6dc9357SAndroid Build Coastguard Worker bstr[len] = 0;
75*f6dc9357SAndroid Build Coastguard Worker return bstr;
76*f6dc9357SAndroid Build Coastguard Worker }
77*f6dc9357SAndroid Build Coastguard Worker
SysAllocString(const OLECHAR * s)78*f6dc9357SAndroid Build Coastguard Worker BSTR SysAllocString(const OLECHAR *s)
79*f6dc9357SAndroid Build Coastguard Worker {
80*f6dc9357SAndroid Build Coastguard Worker if (!s)
81*f6dc9357SAndroid Build Coastguard Worker return NULL;
82*f6dc9357SAndroid Build Coastguard Worker const OLECHAR *s2 = s;
83*f6dc9357SAndroid Build Coastguard Worker while (*s2 != 0)
84*f6dc9357SAndroid Build Coastguard Worker s2++;
85*f6dc9357SAndroid Build Coastguard Worker return SysAllocStringLen(s, (UINT)(s2 - s));
86*f6dc9357SAndroid Build Coastguard Worker }
87*f6dc9357SAndroid Build Coastguard Worker
SysFreeString(BSTR bstr)88*f6dc9357SAndroid Build Coastguard Worker void SysFreeString(BSTR bstr)
89*f6dc9357SAndroid Build Coastguard Worker {
90*f6dc9357SAndroid Build Coastguard Worker if (bstr)
91*f6dc9357SAndroid Build Coastguard Worker FreeForBSTR((CBstrSizeType *)(void *)bstr - 1);
92*f6dc9357SAndroid Build Coastguard Worker }
93*f6dc9357SAndroid Build Coastguard Worker
SysStringByteLen(BSTR bstr)94*f6dc9357SAndroid Build Coastguard Worker UINT SysStringByteLen(BSTR bstr)
95*f6dc9357SAndroid Build Coastguard Worker {
96*f6dc9357SAndroid Build Coastguard Worker if (!bstr)
97*f6dc9357SAndroid Build Coastguard Worker return 0;
98*f6dc9357SAndroid Build Coastguard Worker return *((CBstrSizeType *)(void *)bstr - 1);
99*f6dc9357SAndroid Build Coastguard Worker }
100*f6dc9357SAndroid Build Coastguard Worker
SysStringLen(BSTR bstr)101*f6dc9357SAndroid Build Coastguard Worker UINT SysStringLen(BSTR bstr)
102*f6dc9357SAndroid Build Coastguard Worker {
103*f6dc9357SAndroid Build Coastguard Worker if (!bstr)
104*f6dc9357SAndroid Build Coastguard Worker return 0;
105*f6dc9357SAndroid Build Coastguard Worker return *((CBstrSizeType *)(void *)bstr - 1) / (UINT)sizeof(OLECHAR);
106*f6dc9357SAndroid Build Coastguard Worker }
107*f6dc9357SAndroid Build Coastguard Worker
108*f6dc9357SAndroid Build Coastguard Worker
VariantClear(VARIANTARG * prop)109*f6dc9357SAndroid Build Coastguard Worker HRESULT VariantClear(VARIANTARG *prop)
110*f6dc9357SAndroid Build Coastguard Worker {
111*f6dc9357SAndroid Build Coastguard Worker if (prop->vt == VT_BSTR)
112*f6dc9357SAndroid Build Coastguard Worker SysFreeString(prop->bstrVal);
113*f6dc9357SAndroid Build Coastguard Worker prop->vt = VT_EMPTY;
114*f6dc9357SAndroid Build Coastguard Worker return S_OK;
115*f6dc9357SAndroid Build Coastguard Worker }
116*f6dc9357SAndroid Build Coastguard Worker
VariantCopy(VARIANTARG * dest,const VARIANTARG * src)117*f6dc9357SAndroid Build Coastguard Worker HRESULT VariantCopy(VARIANTARG *dest, const VARIANTARG *src)
118*f6dc9357SAndroid Build Coastguard Worker {
119*f6dc9357SAndroid Build Coastguard Worker HRESULT res = ::VariantClear(dest);
120*f6dc9357SAndroid Build Coastguard Worker if (res != S_OK)
121*f6dc9357SAndroid Build Coastguard Worker return res;
122*f6dc9357SAndroid Build Coastguard Worker if (src->vt == VT_BSTR)
123*f6dc9357SAndroid Build Coastguard Worker {
124*f6dc9357SAndroid Build Coastguard Worker dest->bstrVal = SysAllocStringByteLen((LPCSTR)src->bstrVal,
125*f6dc9357SAndroid Build Coastguard Worker SysStringByteLen(src->bstrVal));
126*f6dc9357SAndroid Build Coastguard Worker if (!dest->bstrVal)
127*f6dc9357SAndroid Build Coastguard Worker return E_OUTOFMEMORY;
128*f6dc9357SAndroid Build Coastguard Worker dest->vt = VT_BSTR;
129*f6dc9357SAndroid Build Coastguard Worker }
130*f6dc9357SAndroid Build Coastguard Worker else
131*f6dc9357SAndroid Build Coastguard Worker *dest = *src;
132*f6dc9357SAndroid Build Coastguard Worker return S_OK;
133*f6dc9357SAndroid Build Coastguard Worker }
134*f6dc9357SAndroid Build Coastguard Worker
CompareFileTime(const FILETIME * ft1,const FILETIME * ft2)135*f6dc9357SAndroid Build Coastguard Worker LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2)
136*f6dc9357SAndroid Build Coastguard Worker {
137*f6dc9357SAndroid Build Coastguard Worker if (ft1->dwHighDateTime < ft2->dwHighDateTime) return -1;
138*f6dc9357SAndroid Build Coastguard Worker if (ft1->dwHighDateTime > ft2->dwHighDateTime) return 1;
139*f6dc9357SAndroid Build Coastguard Worker if (ft1->dwLowDateTime < ft2->dwLowDateTime) return -1;
140*f6dc9357SAndroid Build Coastguard Worker if (ft1->dwLowDateTime > ft2->dwLowDateTime) return 1;
141*f6dc9357SAndroid Build Coastguard Worker return 0;
142*f6dc9357SAndroid Build Coastguard Worker }
143*f6dc9357SAndroid Build Coastguard Worker
GetLastError()144*f6dc9357SAndroid Build Coastguard Worker DWORD GetLastError()
145*f6dc9357SAndroid Build Coastguard Worker {
146*f6dc9357SAndroid Build Coastguard Worker return (DWORD)errno;
147*f6dc9357SAndroid Build Coastguard Worker }
148*f6dc9357SAndroid Build Coastguard Worker
SetLastError(DWORD dw)149*f6dc9357SAndroid Build Coastguard Worker void SetLastError(DWORD dw)
150*f6dc9357SAndroid Build Coastguard Worker {
151*f6dc9357SAndroid Build Coastguard Worker errno = (int)dw;
152*f6dc9357SAndroid Build Coastguard Worker }
153*f6dc9357SAndroid Build Coastguard Worker
154*f6dc9357SAndroid Build Coastguard Worker
TIME_GetBias()155*f6dc9357SAndroid Build Coastguard Worker static LONG TIME_GetBias()
156*f6dc9357SAndroid Build Coastguard Worker {
157*f6dc9357SAndroid Build Coastguard Worker time_t utc = time(NULL);
158*f6dc9357SAndroid Build Coastguard Worker struct tm *ptm = localtime(&utc);
159*f6dc9357SAndroid Build Coastguard Worker int localdaylight = ptm->tm_isdst; /* daylight for local timezone */
160*f6dc9357SAndroid Build Coastguard Worker ptm = gmtime(&utc);
161*f6dc9357SAndroid Build Coastguard Worker ptm->tm_isdst = localdaylight; /* use local daylight, not that of Greenwich */
162*f6dc9357SAndroid Build Coastguard Worker LONG bias = (int)(mktime(ptm)-utc);
163*f6dc9357SAndroid Build Coastguard Worker return bias;
164*f6dc9357SAndroid Build Coastguard Worker }
165*f6dc9357SAndroid Build Coastguard Worker
166*f6dc9357SAndroid Build Coastguard Worker #define TICKS_PER_SEC 10000000
167*f6dc9357SAndroid Build Coastguard Worker /*
168*f6dc9357SAndroid Build Coastguard Worker #define SECS_PER_DAY (24 * 60 * 60)
169*f6dc9357SAndroid Build Coastguard Worker #define SECS_1601_TO_1970 ((369 * 365 + 89) * (UInt64)SECS_PER_DAY)
170*f6dc9357SAndroid Build Coastguard Worker #define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKS_PER_SEC)
171*f6dc9357SAndroid Build Coastguard Worker */
172*f6dc9357SAndroid Build Coastguard Worker
173*f6dc9357SAndroid Build Coastguard Worker #define GET_TIME_64(pft) ((pft)->dwLowDateTime | ((UInt64)(pft)->dwHighDateTime << 32))
174*f6dc9357SAndroid Build Coastguard Worker
175*f6dc9357SAndroid Build Coastguard Worker #define SET_FILETIME(ft, v64) \
176*f6dc9357SAndroid Build Coastguard Worker (ft)->dwLowDateTime = (DWORD)v64; \
177*f6dc9357SAndroid Build Coastguard Worker (ft)->dwHighDateTime = (DWORD)(v64 >> 32);
178*f6dc9357SAndroid Build Coastguard Worker
179*f6dc9357SAndroid Build Coastguard Worker
FileTimeToLocalFileTime(const FILETIME * fileTime,FILETIME * localFileTime)180*f6dc9357SAndroid Build Coastguard Worker BOOL WINAPI FileTimeToLocalFileTime(const FILETIME *fileTime, FILETIME *localFileTime)
181*f6dc9357SAndroid Build Coastguard Worker {
182*f6dc9357SAndroid Build Coastguard Worker UInt64 v = GET_TIME_64(fileTime);
183*f6dc9357SAndroid Build Coastguard Worker v = (UInt64)((Int64)v - (Int64)TIME_GetBias() * TICKS_PER_SEC);
184*f6dc9357SAndroid Build Coastguard Worker SET_FILETIME(localFileTime, v)
185*f6dc9357SAndroid Build Coastguard Worker return TRUE;
186*f6dc9357SAndroid Build Coastguard Worker }
187*f6dc9357SAndroid Build Coastguard Worker
LocalFileTimeToFileTime(const FILETIME * localFileTime,FILETIME * fileTime)188*f6dc9357SAndroid Build Coastguard Worker BOOL WINAPI LocalFileTimeToFileTime(const FILETIME *localFileTime, FILETIME *fileTime)
189*f6dc9357SAndroid Build Coastguard Worker {
190*f6dc9357SAndroid Build Coastguard Worker UInt64 v = GET_TIME_64(localFileTime);
191*f6dc9357SAndroid Build Coastguard Worker v = (UInt64)((Int64)v + (Int64)TIME_GetBias() * TICKS_PER_SEC);
192*f6dc9357SAndroid Build Coastguard Worker SET_FILETIME(fileTime, v)
193*f6dc9357SAndroid Build Coastguard Worker return TRUE;
194*f6dc9357SAndroid Build Coastguard Worker }
195*f6dc9357SAndroid Build Coastguard Worker
196*f6dc9357SAndroid Build Coastguard Worker /*
197*f6dc9357SAndroid Build Coastguard Worker VOID WINAPI GetSystemTimeAsFileTime(FILETIME *ft)
198*f6dc9357SAndroid Build Coastguard Worker {
199*f6dc9357SAndroid Build Coastguard Worker UInt64 t = 0;
200*f6dc9357SAndroid Build Coastguard Worker timeval tv;
201*f6dc9357SAndroid Build Coastguard Worker if (gettimeofday(&tv, NULL) == 0)
202*f6dc9357SAndroid Build Coastguard Worker {
203*f6dc9357SAndroid Build Coastguard Worker t = tv.tv_sec * (UInt64)TICKS_PER_SEC + TICKS_1601_TO_1970;
204*f6dc9357SAndroid Build Coastguard Worker t += tv.tv_usec * 10;
205*f6dc9357SAndroid Build Coastguard Worker }
206*f6dc9357SAndroid Build Coastguard Worker SET_FILETIME(ft, t)
207*f6dc9357SAndroid Build Coastguard Worker }
208*f6dc9357SAndroid Build Coastguard Worker */
209*f6dc9357SAndroid Build Coastguard Worker
GetTickCount(VOID)210*f6dc9357SAndroid Build Coastguard Worker DWORD WINAPI GetTickCount(VOID)
211*f6dc9357SAndroid Build Coastguard Worker {
212*f6dc9357SAndroid Build Coastguard Worker #ifndef _WIN32
213*f6dc9357SAndroid Build Coastguard Worker // gettimeofday() doesn't work in some MINGWs by unknown reason
214*f6dc9357SAndroid Build Coastguard Worker timeval tv;
215*f6dc9357SAndroid Build Coastguard Worker if (gettimeofday(&tv, NULL) == 0)
216*f6dc9357SAndroid Build Coastguard Worker {
217*f6dc9357SAndroid Build Coastguard Worker // tv_sec and tv_usec are (long)
218*f6dc9357SAndroid Build Coastguard Worker return (DWORD)((UInt64)(Int64)tv.tv_sec * (UInt64)1000 + (UInt64)(Int64)tv.tv_usec / 1000);
219*f6dc9357SAndroid Build Coastguard Worker }
220*f6dc9357SAndroid Build Coastguard Worker #endif
221*f6dc9357SAndroid Build Coastguard Worker return (DWORD)time(NULL) * 1000;
222*f6dc9357SAndroid Build Coastguard Worker }
223*f6dc9357SAndroid Build Coastguard Worker
224*f6dc9357SAndroid Build Coastguard Worker
225*f6dc9357SAndroid Build Coastguard Worker #define PERIOD_4 (4 * 365 + 1)
226*f6dc9357SAndroid Build Coastguard Worker #define PERIOD_100 (PERIOD_4 * 25 - 1)
227*f6dc9357SAndroid Build Coastguard Worker #define PERIOD_400 (PERIOD_100 * 4 + 1)
228*f6dc9357SAndroid Build Coastguard Worker
FileTimeToSystemTime(const FILETIME * ft,SYSTEMTIME * st)229*f6dc9357SAndroid Build Coastguard Worker BOOL WINAPI FileTimeToSystemTime(const FILETIME *ft, SYSTEMTIME *st)
230*f6dc9357SAndroid Build Coastguard Worker {
231*f6dc9357SAndroid Build Coastguard Worker UInt32 v;
232*f6dc9357SAndroid Build Coastguard Worker UInt64 v64 = GET_TIME_64(ft);
233*f6dc9357SAndroid Build Coastguard Worker v64 /= 10000;
234*f6dc9357SAndroid Build Coastguard Worker st->wMilliseconds = (WORD)(v64 % 1000); v64 /= 1000;
235*f6dc9357SAndroid Build Coastguard Worker st->wSecond = (WORD)(v64 % 60); v64 /= 60;
236*f6dc9357SAndroid Build Coastguard Worker st->wMinute = (WORD)(v64 % 60); v64 /= 60;
237*f6dc9357SAndroid Build Coastguard Worker v = (UInt32)v64;
238*f6dc9357SAndroid Build Coastguard Worker st->wHour = (WORD)(v % 24); v /= 24;
239*f6dc9357SAndroid Build Coastguard Worker
240*f6dc9357SAndroid Build Coastguard Worker // 1601-01-01 was Monday
241*f6dc9357SAndroid Build Coastguard Worker st->wDayOfWeek = (WORD)((v + 1) % 7);
242*f6dc9357SAndroid Build Coastguard Worker
243*f6dc9357SAndroid Build Coastguard Worker UInt32 leaps, year, day, mon;
244*f6dc9357SAndroid Build Coastguard Worker leaps = (3 * ((4 * v + (365 - 31 - 28) * 4 + 3) / PERIOD_400) + 3) / 4;
245*f6dc9357SAndroid Build Coastguard Worker v += 28188 + leaps;
246*f6dc9357SAndroid Build Coastguard Worker // leaps - the number of exceptions from PERIOD_4 rules starting from 1600-03-01
247*f6dc9357SAndroid Build Coastguard Worker // (1959 / 64) - converts day from 03-01 to month
248*f6dc9357SAndroid Build Coastguard Worker year = (20 * v - 2442) / (5 * PERIOD_4);
249*f6dc9357SAndroid Build Coastguard Worker day = v - (year * PERIOD_4) / 4;
250*f6dc9357SAndroid Build Coastguard Worker mon = (64 * day) / 1959;
251*f6dc9357SAndroid Build Coastguard Worker st->wDay = (WORD)(day - (1959 * mon) / 64);
252*f6dc9357SAndroid Build Coastguard Worker mon -= 1;
253*f6dc9357SAndroid Build Coastguard Worker year += 1524;
254*f6dc9357SAndroid Build Coastguard Worker if (mon > 12)
255*f6dc9357SAndroid Build Coastguard Worker {
256*f6dc9357SAndroid Build Coastguard Worker mon -= 12;
257*f6dc9357SAndroid Build Coastguard Worker year++;
258*f6dc9357SAndroid Build Coastguard Worker }
259*f6dc9357SAndroid Build Coastguard Worker st->wMonth = (WORD)mon;
260*f6dc9357SAndroid Build Coastguard Worker st->wYear = (WORD)year;
261*f6dc9357SAndroid Build Coastguard Worker
262*f6dc9357SAndroid Build Coastguard Worker /*
263*f6dc9357SAndroid Build Coastguard Worker unsigned year, mon;
264*f6dc9357SAndroid Build Coastguard Worker unsigned char ms[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
265*f6dc9357SAndroid Build Coastguard Worker unsigned t;
266*f6dc9357SAndroid Build Coastguard Worker
267*f6dc9357SAndroid Build Coastguard Worker year = (WORD)(1601 + v / PERIOD_400 * 400);
268*f6dc9357SAndroid Build Coastguard Worker v %= PERIOD_400;
269*f6dc9357SAndroid Build Coastguard Worker
270*f6dc9357SAndroid Build Coastguard Worker t = v / PERIOD_100; if (t == 4) t = 3; year += t * 100; v -= t * PERIOD_100;
271*f6dc9357SAndroid Build Coastguard Worker t = v / PERIOD_4; if (t == 25) t = 24; year += t * 4; v -= t * PERIOD_4;
272*f6dc9357SAndroid Build Coastguard Worker t = v / 365; if (t == 4) t = 3; year += t; v -= t * 365;
273*f6dc9357SAndroid Build Coastguard Worker
274*f6dc9357SAndroid Build Coastguard Worker st->wYear = (WORD)year;
275*f6dc9357SAndroid Build Coastguard Worker
276*f6dc9357SAndroid Build Coastguard Worker if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
277*f6dc9357SAndroid Build Coastguard Worker ms[1] = 29;
278*f6dc9357SAndroid Build Coastguard Worker for (mon = 0;; mon++)
279*f6dc9357SAndroid Build Coastguard Worker {
280*f6dc9357SAndroid Build Coastguard Worker unsigned d = ms[mon];
281*f6dc9357SAndroid Build Coastguard Worker if (v < d)
282*f6dc9357SAndroid Build Coastguard Worker break;
283*f6dc9357SAndroid Build Coastguard Worker v -= d;
284*f6dc9357SAndroid Build Coastguard Worker }
285*f6dc9357SAndroid Build Coastguard Worker st->wDay = (WORD)(v + 1);
286*f6dc9357SAndroid Build Coastguard Worker st->wMonth = (WORD)(mon + 1);
287*f6dc9357SAndroid Build Coastguard Worker */
288*f6dc9357SAndroid Build Coastguard Worker
289*f6dc9357SAndroid Build Coastguard Worker return TRUE;
290*f6dc9357SAndroid Build Coastguard Worker }
291*f6dc9357SAndroid Build Coastguard Worker
292*f6dc9357SAndroid Build Coastguard Worker #endif
293