luaur-vm 0.1.1

The Luau register virtual machine and standard library (Rust).
Documentation
#[allow(non_camel_case_types)]
pub type time_t = i64;

#[repr(C)]
#[derive(Debug, Copy, Clone)]
#[allow(non_camel_case_types)]
pub struct tm {
    pub tm_sec: core::ffi::c_int,
    pub tm_min: core::ffi::c_int,
    pub tm_hour: core::ffi::c_int,
    pub tm_mday: core::ffi::c_int,
    pub tm_mon: core::ffi::c_int,
    pub tm_year: core::ffi::c_int,
    pub tm_wday: core::ffi::c_int,
    pub tm_yday: core::ffi::c_int,
    pub tm_isdst: core::ffi::c_int,
}

pub fn os_timegm(timep: *const tm) -> time_t {
    let timep = unsafe { &*timep };

    let day = timep.tm_mday;
    let month = timep.tm_mon + 1;
    let year = timep.tm_year + 1900;

    let a = if timep.tm_mon % 12 < 2 { 1 } else { 0 };
    let a = a - (timep.tm_mon / 12);

    let y = year + 4800 - a;
    let m = month + (12 * a) - 3;

    let julianday = day + ((153 * m + 2) / 5) + (365 * y) + (y / 4) - (y / 100) + (y / 400) - 32045;

    let utcstartasjulianday = 2440588;
    let utcstartasjuliansecond: i64 = (utcstartasjulianday as i64) * 86400;

    if (julianday as i64) < (utcstartasjulianday as i64) {
        return -1;
    }

    let daysecond =
        (timep.tm_hour as i64) * 3600 + (timep.tm_min as i64) * 60 + (timep.tm_sec as i64);
    let julianseconds = (julianday as i64) * 86400 + daysecond;

    if julianseconds < utcstartasjuliansecond {
        return -1;
    }

    julianseconds - utcstartasjuliansecond
}