Index: fusl/src/time/__year_to_secs.c |
diff --git a/fusl/src/time/__year_to_secs.c b/fusl/src/time/__year_to_secs.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2824ec6dcc80dc4e328b8aafb5268867b5b67147 |
--- /dev/null |
+++ b/fusl/src/time/__year_to_secs.c |
@@ -0,0 +1,47 @@ |
+long long __year_to_secs(long long year, int *is_leap) |
+{ |
+ if (year-2ULL <= 136) { |
+ int y = year; |
+ int leaps = (y-68)>>2; |
+ if (!((y-68)&3)) { |
+ leaps--; |
+ if (is_leap) *is_leap = 1; |
+ } else if (is_leap) *is_leap = 0; |
+ return 31536000*(y-70) + 86400*leaps; |
+ } |
+ |
+ int cycles, centuries, leaps, rem; |
+ |
+ if (!is_leap) is_leap = &(int){0}; |
+ cycles = (year-100) / 400; |
+ rem = (year-100) % 400; |
+ if (rem < 0) { |
+ cycles--; |
+ rem += 400; |
+ } |
+ if (!rem) { |
+ *is_leap = 1; |
+ centuries = 0; |
+ leaps = 0; |
+ } else { |
+ if (rem >= 200) { |
+ if (rem >= 300) centuries = 3, rem -= 300; |
+ else centuries = 2, rem -= 200; |
+ } else { |
+ if (rem >= 100) centuries = 1, rem -= 100; |
+ else centuries = 0; |
+ } |
+ if (!rem) { |
+ *is_leap = 0; |
+ leaps = 0; |
+ } else { |
+ leaps = rem / 4U; |
+ rem %= 4U; |
+ *is_leap = !rem; |
+ } |
+ } |
+ |
+ leaps += 97*cycles + 24*centuries - *is_leap; |
+ |
+ return (year-100) * 31536000LL + leaps * 86400LL + 946684800 + 86400; |
+} |