xref: /aosp_15_r20/external/lzma/CPP/Common/MyWindows.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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