use core::ffi::c_int;
use crate::ctypes;
const MONTH_DAYS: [[c_int; 12]; 2] = [
    [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
    [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
];
#[inline(always)]
fn leap_year(year: c_int) -> bool {
    year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)
}
#[no_mangle]
pub unsafe extern "C" fn mktime(t: *mut ctypes::tm) -> ctypes::time_t {
    let mut year = (*t).tm_year + 1900;
    let mut month = (*t).tm_mon;
    let mut day = (*t).tm_mday as i64 - 1;
    let leap = if leap_year(year) { 1 } else { 0 };
    if year < 1970 {
        day = MONTH_DAYS[if leap_year(year) { 1 } else { 0 }][(*t).tm_mon as usize] as i64 - day;
        while year < 1969 {
            year += 1;
            day += if leap_year(year) { 366 } else { 365 };
        }
        while month < 11 {
            month += 1;
            day += MONTH_DAYS[leap][month as usize] as i64;
        }
        (-(day * (60 * 60 * 24)
            - (((*t).tm_hour as i64) * (60 * 60) + ((*t).tm_min as i64) * 60 + (*t).tm_sec as i64)))
            as ctypes::time_t
    } else {
        while year > 1970 {
            year -= 1;
            day += if leap_year(year) { 366 } else { 365 };
        }
        while month > 0 {
            month -= 1;
            day += MONTH_DAYS[leap][month as usize] as i64;
        }
        (day * (60 * 60 * 24)
            + ((*t).tm_hour as i64) * (60 * 60)
            + ((*t).tm_min as i64) * 60
            + (*t).tm_sec as i64) as ctypes::time_t
    }
}