1long long __year_to_secs(long long year, int* is_leap) { 2 if (year - 2ULL <= 136) { 3 int y = year; 4 int leaps = (y - 68) >> 2; 5 if (!((y - 68) & 3)) { 6 leaps--; 7 if (is_leap) 8 *is_leap = 1; 9 } else if (is_leap) 10 *is_leap = 0; 11 return 31536000 * (y - 70) + 86400 * leaps; 12 } 13 14 int cycles, centuries, leaps, rem; 15 16 if (!is_leap) 17 is_leap = &(int){0}; 18 cycles = (year - 100) / 400; 19 rem = (year - 100) % 400; 20 if (rem < 0) { 21 cycles--; 22 rem += 400; 23 } 24 if (!rem) { 25 *is_leap = 1; 26 centuries = 0; 27 leaps = 0; 28 } else { 29 if (rem >= 200) { 30 if (rem >= 300) 31 centuries = 3, rem -= 300; 32 else 33 centuries = 2, rem -= 200; 34 } else { 35 if (rem >= 100) 36 centuries = 1, rem -= 100; 37 else 38 centuries = 0; 39 } 40 if (!rem) { 41 *is_leap = 0; 42 leaps = 0; 43 } else { 44 leaps = rem / 4U; 45 rem %= 4U; 46 *is_leap = !rem; 47 } 48 } 49 50 leaps += 97 * cycles + 24 * centuries - *is_leap; 51 52 return (year - 100) * 31536000LL + leaps * 86400LL + 946684800 + 86400; 53} 54