📄 wince_time.cpp
字号:
#define INSIDE_GIGABASE
#include <winbase.h>
#include "wince_time.h"
/* non-zero if daylight savings time is used */
_CRTIMP int _daylight;
/* offset for Daylight Saving Time */
_CRTIMP long _dstbias;
/* difference in seconds between GMT and local time */
_CRTIMP long _timezone;
/* standard/daylight savings time zone names */
_CRTIMP char * _tzname[2];
struct __lc_time_data {
char *wday_abbr[7];
char *wday[7];
char *month_abbr[12];
char *month[12];
char *ampm[2];
char *ww_sdatefmt;
char *ww_ldatefmt;
char *ww_timefmt;
};
static int _lpdays[] = {
-1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365
};
static int _days[] = {
-1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364
};
/*
* Flag indicating that time zone information came from GetTimeZoneInformation
* API call.
*/
static int tzapiused;
static TIME_ZONE_INFORMATION tzinfo;
/* Prototypes for local routines */
static void __cdecl _expandtime (char specifier, const struct tm *tmptr,
char **out, size_t *count, struct __lc_time_data *lc_time);
static void __cdecl _store_str (char *in, char **out, size_t *count);
static void __cdecl _store_num (int num, int digits, char **out, size_t *count);
static void __cdecl _store_number (int num, char **out, size_t *count);
static void __cdecl _store_winword (const char *format, const struct tm *tmptr, char **out, size_t *count, struct __lc_time_data *lc_time);
time_t __cdecl __loctotime_t (
int yr, /* 0 based */
int mo, /* 1 based */
int dy, /* 1 based */
int hr,
int mn,
int sc,
int dstflag );
int __cdecl _isindst(struct tm *);
void __cdecl __tzset(void);
/*
* DST start and end structs.
*/
static transitiondate dststart = { -1, 0, 0L };
static transitiondate dstend = { -1, 0, 0L };
/*
* Code page.
*/
UINT __lc_codepage = _CLOCALECP; /* CP_ACP */
/*
time_t __cdecl time(time_t *pTime)
{
// what a mess for getting a simple time!
SYSTEMTIME lTime;
FILETIME lFileTime;
::GetLocalTime(&lTime);
SystemTimeToFileTime(&lTime, &lFileTime);
ULARGE_INTEGER lNTime = *(ULARGE_INTEGER*)&lFileTime;
if (0l != pTime)
*pTime = *(time_t*)&lNTime;
return *(time_t*)&lNTime;
}
*/
/* LC_TIME data for local "C" */
__declspec(selectany) struct __lc_time_data __lc_time_c = {
{"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"},
{"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
"Friday", "Saturday", },
{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",
"Sep", "Oct", "Nov", "Dec"},
{"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October",
"November", "December"},
{"AM", "PM"}
, { "M/d/yy" }
, { "dddd, MMMM dd, yyyy" }
, { "H:mm:ss" }
};
/* Pointer to the current LC_TIME data structure. */
struct __lc_time_data *__lc_time_curr = &__lc_time_c;
/* Flags */
static unsigned __alternate_form;
static unsigned __no_lead_zeros;
time_t __cdecl mktime(struct tm * lTms)
{
SYSTEMTIME lSTime;
lSTime.wYear = lTms->tm_year + 1900;
lSTime.wMonth = lTms->tm_mon + 1;
lSTime.wDay = lTms->tm_mday;
lSTime.wDayOfWeek = lTms->tm_wday;
lSTime.wHour = lTms->tm_hour;
lSTime.wMinute = lTms->tm_min;
lSTime.wSecond = lTms->tm_sec;
lSTime.wMilliseconds = 0;
FILETIME lFileTime;
SystemTimeToFileTime(&lSTime, &lFileTime);
ULARGE_INTEGER lNTime = *(ULARGE_INTEGER*)&lFileTime;
//TODO: update the values of wDay and yDay in the
// original structure.
return *(time_t*)&lNTime;
}
/*
struct tm * __cdecl localtime(const time_t* pTime)
{
FILETIME lFileTime = *(FILETIME *)&pTime;
FILETIME lLocalFileTime;
::FileTimeToLocalFileTime(&lFileTime, &lLocalFileTime);
SYSTEMTIME lSTime;
if (::FileTimeToSystemTime(&lLocalFimeTime, &lSTime) != 0)
{
struct tm* lTms = new struct tm;
lTms->tm_year = lSTime.wYear - 1900;
lTms->tm_mon = lSTime.wMonth - 1;
lTms->tm_mday = lSTime.wDay;
lTms->tm_wday = lSTime.wDayOfWeek;
lTms->tm_hour = lSTime.wHour;
lTms->tm_min = lSTime.wMinute;
lTms->tm_sec = lSTime.wSecond;
return lTms;
}
return 0l;
}
size_t __cdecl wcsftime(wchar_t *pDest, size_t maxsize, const wchar_t *pFormat,
const struct tm *pTime)
{
}
*/
/***
*size_t _Strftime(string, maxsize, format,
* timeptr, lc_time) - Format a time string for a given locale
*
*Purpose:
* Place characters into the user's output buffer expanding time
* format directives as described in the user's control string.
* Use the supplied 'tm' structure for time data when expanding
* the format directives. use the locale information at lc_time.
* [ANSI]
*
*Entry:
* char *string = pointer to output string
* size_t maxsize = max length of string
* const char *format = format control string
* const struct tm *timeptr = pointer to tb data structure
* struct __lc_time_data *lc_time = pointer to locale-specific info
* (passed as void * to avoid type mismatch with C++)
*
*Exit:
* !0 = If the total number of resulting characters including the
* terminating null is not more than 'maxsize', then return the
* number of chars placed in the 'string' array (not including the
* null terminator).
*
* 0 = Otherwise, return 0 and the contents of the string are
* indeterminate.
*
*Exceptions:
*
*******************************************************************************/
size_t __cdecl _Strftime (
char *string,
size_t maxsize,
const char *format,
const struct tm *timeptr,
void *lc_time_arg
)
{
struct __lc_time_data *lc_time;
size_t left; /* space left in output string */
/* Copy maxsize into temp. */
left = maxsize;
/* Defer initialization until the crtitical section has been entered */
lc_time = lc_time_arg == 0 ? __lc_time_curr : (struct __lc_time_data *)lc_time_arg;
/* Copy the input string to the output string expanding the format
designations appropriately. Stop copying when one of the following
is true: (1) we hit a null char in the input stream, or (2) there's
no room left in the output stream. */
while (left > 0)
{
switch(*format)
{
case('\0'):
/* end of format input string */
goto done;
case('%'):
/* Format directive. Take appropriate action based
on format control character. */
format++; /* skip over % char */
/* process flags */
__alternate_form = 0;
if (*format == '#')
{
__alternate_form = 1;
format++;
}
_expandtime(*format, timeptr, &string, &left,
lc_time);
format++; /* skip format char */
break;
default:
/* store character, bump pointers, dec the char count */
if (isleadbyte((int)(*format)) && left > 1)
{
*string++ = *format++;
left--;
}
*string++ = *format++;
left--;
break;
}
}
/* All done. See if we terminated because we hit a null char or because
we ran out of space */
done:
if (left > 0) {
/* Store a terminating null char and return the number of chars
we stored in the output string. */
*string = '\0';
return(maxsize-left);
}
else
return(0);
}
/***
*_expandtime() - Expand the conversion specifier
*
*Purpose:
* Expand the given strftime conversion specifier using the time struct
* and store it in the supplied buffer.
*
* The expansion is locale-dependent.
*
* *** For internal use with strftime() only ***
*
*Entry:
* char specifier = strftime conversion specifier to expand
* const struct tm *tmptr = pointer to time/date structure
* char **string = address of pointer to output string
* size_t *count = address of char count (space in output area)
* struct __lc_time_data *lc_time = pointer to locale-specific info
*
*Exit:
* none
*
*Exceptions:
*
*******************************************************************************/
static void __cdecl _expandtime (
char specifier,
const struct tm *timeptr,
char **string,
size_t *left,
struct __lc_time_data *lc_time
)
{
unsigned temp; /* temps */
int wdaytemp;
/* Use a copy of the appropriate __lc_time_data pointer. This
should prevent the necessity of locking/unlocking in mthread
code (if we can guarantee that the various __lc_time data
structures are always in the same segment). contents of time
strings structure can now change, so thus we do use locking */
switch(specifier) { /* switch on specifier */
case('a'): /* abbreviated weekday name */
_store_str((char *)(lc_time->wday_abbr[timeptr->tm_wday]),
string, left);
break;
case('A'): /* full weekday name */
_store_str((char *)(lc_time->wday[timeptr->tm_wday]),
string, left);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -