2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS CRT library
4 * FILE: lib/sdk/crt/time/ftime.c
5 * PURPOSE: Implementation of asctime(), _asctime_s()
6 * PROGRAMERS: Timo Kreuzer
11 #include "bitsfixup.h"
14 #define MONSPERYEAR 12
15 #define HUNDREDYEAROFFSET 19
17 static const _TCHAR wday_name
[DAYSPERWEEK
][4] =
19 _T("Sun "), _T("Mon "), _T("Tue "), _T("Wed "),
20 _T("Thu "), _T("Fri "), _T("Sat ")
23 static const _TCHAR mon_name
[MONSPERYEAR
][4] =
25 _T("Jan "), _T("Feb "), _T("Mar "), _T("Apr "), _T("May "), _T("Jun "),
26 _T("Jul "), _T("Aug "), _T("Sep "), _T("Oct "), _T("Nov "), _T("Dec ")
30 typedef unsigned long long _TCHAR4
;
31 typedef unsigned long _TCHAR2
;
33 typedef unsigned long _TCHAR4
;
34 typedef unsigned short _TCHAR2
;
70 u
.array
[0] = '0' + (x
/ 10);
71 u
.array
[1] = '0' + (x
% 10);
78 FillBuf(timebuf_t
*buf
, const struct tm
*ptm
)
80 /* Format looks like this:
81 * "Sun Mar 01 12:34:56 1902\n\0" */
82 buf
->WeekDay
= *(_TCHAR4
*)wday_name
[ptm
->tm_wday
];
83 buf
->Month
= *(_TCHAR4
*)mon_name
[ptm
->tm_mon
];
84 buf
->Day
= IntToChar2(ptm
->tm_mday
);
86 buf
->Hour
= IntToChar2(ptm
->tm_hour
);
88 buf
->Minute
= IntToChar2(ptm
->tm_min
);
90 buf
->Second
= IntToChar2(ptm
->tm_sec
);
92 buf
->Year
[0] = IntToChar2(ptm
->tm_year
/ 100 + HUNDREDYEAROFFSET
);
93 buf
->Year
[1] = IntToChar2(ptm
->tm_year
% 100);
98 /******************************************************************************
100 * \brief Converts a local time into a string and returns a pointer to it.
101 * \param buffer Buffer that receives the string (26 characters).
102 * \param numberOfElements Size of the buffer in characters.
103 * \param time Pointer to the UTC time.
108 size_t numberOfElements
,
109 const struct tm
*ptm
)
111 /* Validate parameters */
112 if (!buffer
|| numberOfElements
< 26 || !ptm
||
113 (unsigned int)ptm
->tm_sec
> 59 ||
114 (unsigned int)ptm
->tm_min
> 59 ||
115 (unsigned int)ptm
->tm_hour
> 23 ||
116 (unsigned int)ptm
->tm_mday
> 31 ||
117 (unsigned int)ptm
->tm_mon
> 11 ||
118 (unsigned int)ptm
->tm_year
> 2038 ||
119 (unsigned int)ptm
->tm_wday
> 6 ||
120 (unsigned int)ptm
->tm_yday
> 365)
123 _invalid_parameter(NULL
,
136 /* Fill the buffer */
137 FillBuf((timebuf_t
*)buffer
, ptm
);
142 /******************************************************************************
144 * \brief Converts a UTC time into a string and returns a pointer to it.
145 * \param ptm Pointer to the UTC time.
146 * \remarks The string is stored in thread local buffer, shared between
147 * ctime, gmtime and localtime (32 and 64 bit versions).
150 _tasctime(const struct tm
*ptm
)
152 PTHREADDATA pThreadData
;
155 /* Get pointer to TLS buffer */
156 pThreadData
= GetThreadData();
158 pstr
= pThreadData
->asctimebuf
;
160 pstr
= pThreadData
->wasctimebuf
;
163 /* Fill the buffer */
164 FillBuf((timebuf_t
*)pstr
, ptm
);