il-2 (19.05.2014 08:44 - 22.05.2014 15:56, просмотров: 230) ответил SciFi на А что не так с mktime()? Нужно вычислять на этапе компиляции?
Да. Уффф, готово.
// Сам макрос
// +Jan +Feb +Mar +Apr +May +Jun +Jul +Aug +Sep +Oct +Nov +Dec
#define MK_TIME(d,m,g) (((d)-((((m)>2)||((g)&0x03))?0:1)+(((m)>1)?31:0)+(((m)>2)?28:0)+(((m)>3)?31:0)+(((m)>4)?30:0)+(((m)>5)?31:0)+(((m)>6)?30:0)+(((m)>7)?31:0)+(((m)>8)?31:0)+(((m)>9)?30:0)+(((m)>10)?31:0)+(((m)>11)?30:0)+(((m)==13)?31:(((m)>14)?(((m)-14)*30+365):0))+(((g)-1968)>>2)*1461L-731+((g)&0x03)*365UL)*86400UL)
// Код для проверки
static const UINT Days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
struct tm DtTm;
UINT Err = 0;
UINT Year=1970, Mon, Day, TopDay;
time_t mk_time, mac_time;
do
{
Mon = 1;
do
{
Day = 1; TopDay = Days[Mon-1];
if ( (Mon == 2) && ((Year & 0x03)==0) ) ++TopDay;
do
{
DtTm.tm_year = Year - 1900;
DtTm.tm_mon = Mon - 1;
DtTm.tm_mday = Day;
DtTm.tm_hour = 0;
DtTm.tm_min = 0;
DtTm.tm_sec = 0;
mk_time = mktime(&DtTm);
if ( mk_time == (time_t)-1 ) { Err = 1; goto test_err; }
if ( DtTm.tm_year != (Year - 1900) ) { Err = 2; goto test_err; }
if ( DtTm.tm_mon != (Mon - 1) ) { Err = 2; goto test_err; }
if ( DtTm.tm_mday != Day ) { Err = 2; goto test_err; }
if ( DtTm.tm_hour != 0 ) { Err = 2; goto test_err; }
if ( DtTm.tm_min != 0 ) { Err = 2; goto test_err; }
if ( DtTm.tm_sec != 0 ) { Err = 2; goto test_err; }
mac_time = MK_TIME(Day,Mon,Year);
if ( mac_time != mk_time )
{
Err = 3;
test_err:
Err = 0;
}
} while(++Day <= TopDay );
} while( ++Mon <= 12 );
} while( ++Year != 2200 );