/**
 * D header file for POSIX.
 *
 * Copyright: Copyright Sean Kelly 2005 - 2009.
 * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
 * Authors:   Sean Kelly,
              Alex Rønne Petersen
 * Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
 */

/*          Copyright Sean Kelly 2005 - 2009.
 * Distributed under the Boost Software License, Version 1.0.
 *    (See accompanying file LICENSE or copy at
 *          http://www.boost.org/LICENSE_1_0.txt)
 */
module core.sys.posix.time;

import core.sys.posix.config;
public import core.stdc.time;
public import core.sys.posix.sys.types;
public import core.sys.posix.signal; // for sigevent

version (OSX)
    version = Darwin;
else version (iOS)
    version = Darwin;
else version (TVOS)
    version = Darwin;
else version (WatchOS)
    version = Darwin;

version (Posix):
extern (C):
nothrow:
@nogc:
@system:

//
// Required (defined in core.stdc.time)
//
/*
char* asctime(const scope tm*);
clock_t clock();
char* ctime(const scope time_t*);
double difftime(time_t, time_t);
tm* gmtime(const scope time_t*);
tm* localtime(const scope time_t*);
time_t mktime(tm*);
size_t strftime(char*, size_t, const scope char*, const scope tm*);
time_t time(time_t*);
*/

version (CRuntime_Glibc)
{
    time_t timegm(tm*); // non-standard
}
else version (Darwin)
{
    time_t timegm(tm*); // non-standard
}
else version (FreeBSD)
{
    time_t timegm(tm*); // non-standard
}
else version (NetBSD)
{
    time_t timegm(tm*); // non-standard
}
else version (OpenBSD)
{
    time_t timegm(tm*); // non-standard
}
else version (DragonFlyBSD)
{
    time_t timegm(tm*); // non-standard
}
else version (Solaris)
{
    time_t timegm(tm*); // non-standard
}
else version (CRuntime_Bionic)
{
    // Not supported.
}
else version (CRuntime_Musl)
{
    time_t timegm(tm*);
}
else version (CRuntime_UClibc)
{
    time_t timegm(tm*);
}
else
{
    static assert(false, "Unsupported platform");
}

//
// C Extension (CX)
// (defined in core.stdc.time)
//
/*
char* tzname[];
void tzset();
*/

//
// Process CPU-Time Clocks (CPT)
//
/*
int clock_getcpuclockid(pid_t, clockid_t*);
*/

//
// Clock Selection (CS)
//
/*
int clock_nanosleep(clockid_t, int, const scope timespec*, timespec*);
*/

//
// Monotonic Clock (MON)
//
/*
CLOCK_MONOTONIC
*/

version (linux)
{
    enum CLOCK_MONOTONIC          = 1;
}
else version (FreeBSD)
{   // time.h
    enum CLOCK_MONOTONIC         = 4;
}
else version (NetBSD)
{
    // time.h
    enum CLOCK_MONOTONIC         = 3;
}
else version (OpenBSD)
{
    // time.h
    enum CLOCK_MONOTONIC         = 3;
}
else version (DragonFlyBSD)
{   // time.h
    enum CLOCK_MONOTONIC         = 4;
}
else version (Darwin)
{
    // No CLOCK_MONOTONIC defined
}
else version (Solaris)
{
    enum CLOCK_MONOTONIC = 4;
}
else
{
    static assert(0);
}

//
// Timer (TMR)
//
/*
CLOCK_PROCESS_CPUTIME_ID (TMR|CPT)
CLOCK_THREAD_CPUTIME_ID (TMR|TCT)

NOTE: timespec must be defined in core.sys.posix.signal to break
      a circular import.

struct timespec
{
    time_t  tv_sec;
    int     tv_nsec;
}

struct itimerspec
{
    timespec it_interval;
    timespec it_value;
}

CLOCK_REALTIME
TIMER_ABSTIME

clockid_t
timer_t

int clock_getres(clockid_t, timespec*);
int clock_gettime(clockid_t, timespec*);
int clock_settime(clockid_t, const scope timespec*);
int nanosleep(const scope timespec*, timespec*);
int timer_create(clockid_t, sigevent*, timer_t*);
int timer_delete(timer_t);
int timer_gettime(timer_t, itimerspec*);
int timer_getoverrun(timer_t);
int timer_settime(timer_t, int, const scope itimerspec*, itimerspec*);
*/

version (CRuntime_Glibc)
{
    enum CLOCK_PROCESS_CPUTIME_ID = 2;
    enum CLOCK_THREAD_CPUTIME_ID  = 3;

    // NOTE: See above for why this is commented out.
    //
    //struct timespec
    //{
    //    time_t  tv_sec;
    //    c_long  tv_nsec;
    //}

    struct itimerspec
    {
        timespec it_interval;
        timespec it_value;
    }

    enum CLOCK_REALTIME         = 0;
    enum TIMER_ABSTIME          = 0x01;

    alias int clockid_t;
    alias void* timer_t;

    int clock_getres(clockid_t, timespec*);
    int clock_gettime(clockid_t, timespec*);
    int clock_settime(clockid_t, const scope timespec*);
    int nanosleep(const scope timespec*, timespec*);
    int timer_create(clockid_t, sigevent*, timer_t*);
    int timer_delete(timer_t);
    int timer_gettime(timer_t, itimerspec*);
    int timer_getoverrun(timer_t);
    int timer_settime(timer_t, int, const scope itimerspec*, itimerspec*);
}
else version (Darwin)
{
    int nanosleep(const scope timespec*, timespec*);
}
else version (FreeBSD)
{
    //enum CLOCK_PROCESS_CPUTIME_ID = ??;
    enum CLOCK_THREAD_CPUTIME_ID  = 15;

    // NOTE: See above for why this is commented out.
    //
    //struct timespec
    //{
    //    time_t  tv_sec;
    //    c_long  tv_nsec;
    //}

    struct itimerspec
    {
        timespec it_interval;
        timespec it_value;
    }

    enum CLOCK_REALTIME      = 0;
    enum TIMER_ABSTIME       = 0x01;

    alias int clockid_t; // <sys/_types.h>
    alias int timer_t;

    int clock_getres(clockid_t, timespec*);
    int clock_gettime(clockid_t, timespec*);
    int clock_settime(clockid_t, const scope timespec*);
    int nanosleep(const scope timespec*, timespec*);
    int timer_create(clockid_t, sigevent*, timer_t*);
    int timer_delete(timer_t);
    int timer_gettime(timer_t, itimerspec*);
    int timer_getoverrun(timer_t);
    int timer_settime(timer_t, int, const scope itimerspec*, itimerspec*);
}
else version (DragonFlyBSD)
{
    enum CLOCK_THREAD_CPUTIME_ID  = 15;

    struct itimerspec
    {
        timespec it_interval;
        timespec it_value;
    }

    enum CLOCK_REALTIME      = 0;
    enum TIMER_ABSTIME       = 0x01;

    alias int clockid_t; // <sys/_types.h>
    alias int timer_t;

    int clock_getres(clockid_t, timespec*);
    int clock_gettime(clockid_t, timespec*);
    int clock_settime(clockid_t, const scope timespec*);
    int nanosleep(const scope timespec*, timespec*);
    int timer_create(clockid_t, sigevent*, timer_t*);
    int timer_delete(timer_t);
    int timer_gettime(timer_t, itimerspec*);
    int timer_getoverrun(timer_t);
    int timer_settime(timer_t, int, const scope itimerspec*, itimerspec*);
}
else version (NetBSD)
{
    struct itimerspec
    {
        timespec it_interval;
        timespec it_value;
    }

    enum CLOCK_REALTIME      = 0;
    enum TIMER_ABSTIME       = 0x01;

    alias int clockid_t; // <sys/_types.h>
    alias int timer_t;

    int clock_getres(clockid_t, timespec*);
    int clock_gettime(clockid_t, timespec*);
    int clock_settime(clockid_t, const scope timespec*);
    int nanosleep(const scope timespec*, timespec*);
    int timer_create(clockid_t, sigevent*, timer_t*);
    int timer_delete(timer_t);
    int timer_gettime(timer_t, itimerspec*);
    int timer_getoverrun(timer_t);
    int timer_settime(timer_t, int, const scope itimerspec*, itimerspec*);
}
else version (OpenBSD)
{
    struct itimerspec
    {
        timespec it_interval;
        timespec it_value;
    }

    enum CLOCK_REALTIME      = 0;
    enum TIMER_ABSTIME       = 0x1;

    alias int clockid_t; // <sys/_types.h>
    alias int timer_t;

    int clock_getres(clockid_t, timespec*);
    int clock_gettime(clockid_t, timespec*);
    int clock_settime(clockid_t, const scope timespec*);
    int nanosleep(const scope timespec*, timespec*);
    int timer_create(clockid_t, sigevent*, timer_t*);
    int timer_delete(timer_t);
    int timer_gettime(timer_t, itimerspec*);
    int timer_getoverrun(timer_t);
    int timer_settime(timer_t, int, const scope itimerspec*, itimerspec*);
}
else version (Solaris)
{
    enum CLOCK_PROCESS_CPUTIME_ID = 5; // <sys/time_impl.h>
    enum CLOCK_THREAD_CPUTIME_ID  = 2; // <sys/time_impl.h>

    struct itimerspec
    {
        timespec it_interval;
        timespec it_value;
    }

    enum CLOCK_REALTIME = 3; // <sys/time_impl.h>
    enum TIMER_ABSOLUTE = 0x1;

    alias int clockid_t;
    alias int timer_t;

    int clock_getres(clockid_t, timespec*);
    int clock_gettime(clockid_t, timespec*);
    int clock_settime(clockid_t, const scope timespec*);
    int clock_nanosleep(clockid_t, int, const scope timespec*, timespec*);

    int nanosleep(const scope timespec*, timespec*);

    int timer_create(clockid_t, sigevent*, timer_t*);
    int timer_delete(timer_t);
    int timer_getoverrun(timer_t);
    int timer_gettime(timer_t, itimerspec*);
    int timer_settime(timer_t, int, const scope itimerspec*, itimerspec*);
}
else version (CRuntime_Bionic)
{
    enum CLOCK_PROCESS_CPUTIME_ID = 2;
    enum CLOCK_THREAD_CPUTIME_ID  = 3;

    struct itimerspec
    {
        timespec it_interval;
        timespec it_value;
    }

    enum CLOCK_REALTIME    = 0;
    enum CLOCK_REALTIME_HR = 4;
    enum TIMER_ABSTIME     = 0x01;

    alias int   clockid_t;
    alias void* timer_t; // Updated since Lollipop

    int clock_getres(int, timespec*);
    int clock_gettime(int, timespec*);
    int nanosleep(const scope timespec*, timespec*);
    int timer_create(int, sigevent*, timer_t*);
    int timer_delete(timer_t);
    int timer_gettime(timer_t, itimerspec*);
    int timer_getoverrun(timer_t);
    int timer_settime(timer_t, int, const scope itimerspec*, itimerspec*);
}
else version (CRuntime_Musl)
{
    alias int clockid_t;
    alias void* timer_t;

    struct itimerspec
    {
        timespec it_interval;
        timespec it_value;
    }

    enum TIMER_ABSTIME = 1;

    enum CLOCK_REALTIME = 0;
    enum CLOCK_PROCESS_CPUTIME_ID = 2;
    enum CLOCK_THREAD_CPUTIME_ID = 3;
    enum CLOCK_REALTIME_COARSE = 5;
    enum CLOCK_BOOTTIME = 7;
    enum CLOCK_REALTIME_ALARM = 8;
    enum CLOCK_BOOTTIME_ALARM = 9;
    enum CLOCK_SGI_CYCLE = 10;
    enum CLOCK_TAI = 11;

    int nanosleep(const scope timespec*, timespec*);

    int clock_getres(clockid_t, timespec*);
    int clock_gettime(clockid_t, timespec*);
    int clock_settime(clockid_t, const scope timespec*);
    int clock_nanosleep(clockid_t, int, const scope timespec*, timespec*);
    int clock_getcpuclockid(pid_t, clockid_t *);

    int timer_create(clockid_t, sigevent*, timer_t*);
    int timer_delete(timer_t);
    int timer_gettime(timer_t, itimerspec*);
    int timer_settime(timer_t, int, const scope itimerspec*, itimerspec*);
    int timer_getoverrun(timer_t);
}
else version (CRuntime_UClibc)
{
    enum CLOCK_REALTIME             = 0;
    enum CLOCK_PROCESS_CPUTIME_ID   = 2;
    enum CLOCK_THREAD_CPUTIME_ID    = 3;

    struct itimerspec
    {
        timespec it_interval;
        timespec it_value;
    }

    enum TIMER_ABSTIME          = 0x01;

    alias int clockid_t;
    alias void* timer_t;

    int clock_getres(clockid_t, timespec*);
    int clock_gettime(clockid_t, timespec*);
    int clock_settime(clockid_t, const scope timespec*);
    int nanosleep(const scope timespec*, timespec*);
    int timer_create(clockid_t, sigevent*, timer_t*);
    int timer_delete(timer_t);
    int timer_gettime(timer_t, itimerspec*);
    int timer_getoverrun(timer_t);
    int timer_settime(timer_t, int, const scope itimerspec*, itimerspec*);
}
else
{
    static assert(false, "Unsupported platform");
}

//
// Thread-Safe Functions (TSF)
//
/*
char* asctime_r(const scope tm*, char*);
char* ctime_r(const scope time_t*, char*);
tm*   gmtime_r(const scope time_t*, tm*);
tm*   localtime_r(const scope time_t*, tm*);
*/

version (CRuntime_Glibc)
{
    char* asctime_r(const scope tm*, char*);
    char* ctime_r(const scope time_t*, char*);
    tm*   gmtime_r(const scope time_t*, tm*);
    tm*   localtime_r(const scope time_t*, tm*);
}
else version (Darwin)
{
    char* asctime_r(const scope tm*, char*);
    char* ctime_r(const scope time_t*, char*);
    tm*   gmtime_r(const scope time_t*, tm*);
    tm*   localtime_r(const scope time_t*, tm*);
}
else version (FreeBSD)
{
    char* asctime_r(const scope tm*, char*);
    char* ctime_r(const scope time_t*, char*);
    tm*   gmtime_r(const scope time_t*, tm*);
    tm*   localtime_r(const scope time_t*, tm*);
}
else version (NetBSD)
{
    char* asctime_r(const scope tm*, char*);
    char* ctime_r(const scope time_t*, char*);
    tm*   gmtime_r(const scope time_t*, tm*);
    tm*   localtime_r(const scope time_t*, tm*);
}
else version (OpenBSD)
{
    char* asctime_r(const scope tm*, char*);
    char* ctime_r(const scope time_t*, char*);
    tm*   gmtime_r(const scope time_t*, tm*);
    tm*   localtime_r(const scope time_t*, tm*);
}
else version (DragonFlyBSD)
{
    char* asctime_r(const scope tm*, char*);
    char* ctime_r(const scope time_t*, char*);
    tm*   gmtime_r(const scope time_t*, tm*);
    tm*   localtime_r(const scope time_t*, tm*);
}
else version (Solaris)
{
    char* asctime_r(const scope tm*, char*);
    char* ctime_r(const scope time_t*, char*);
    tm* gmtime_r(const scope time_t*, tm*);
    tm* localtime_r(const scope time_t*, tm*);
}
else version (CRuntime_Bionic)
{
    char* asctime_r(const scope tm*, char*);
    char* ctime_r(const scope time_t*, char*);
    tm* gmtime_r(const scope time_t*, tm*);
    tm* localtime_r(const scope time_t*, tm*);
}
else version (CRuntime_Musl)
{
    char* asctime_r(const scope tm*, char*);
    char* ctime_r(const scope time_t*, char*);
    tm*   gmtime_r(const scope time_t*, tm*);
    tm*   localtime_r(const scope time_t*, tm*);
}
else version (CRuntime_UClibc)
{
    char* asctime_r(const scope tm*, char*);
    char* ctime_r(const scope time_t*, char*);
    tm*   gmtime_r(const scope time_t*, tm*);
    tm*   localtime_r(const scope time_t*, tm*);
}
else
{
    static assert(false, "Unsupported platform");
}

//
// XOpen (XSI)
//
/*
getdate_err

int daylight;
int timezone;

tm* getdate(const scope char*);
char* strptime(const scope char*, const scope char*, tm*);
*/

version (CRuntime_Glibc)
{
    extern __gshared int    daylight;
    extern __gshared c_long timezone;

    tm*   getdate(const scope char*);
    char* strptime(const scope char*, const scope char*, tm*);
}
else version (Darwin)
{
    extern __gshared c_long timezone;
    extern __gshared int    daylight;

    tm*   getdate(const scope char*);
    char* strptime(const scope char*, const scope char*, tm*);
}
else version (FreeBSD)
{
    //tm*   getdate(const scope char*);
    char* strptime(const scope char*, const scope char*, tm*);
}
else version (NetBSD)
{
    tm*   getdate(const scope char*);
    char* strptime(const scope char*, const scope char*, tm*);
}
else version (OpenBSD)
{
    //tm*   getdate(const scope char*);
    char* strptime(const scope char*, const scope char*, tm*);
}
else version (DragonFlyBSD)
{
    //tm*   getdate(const scope char*);
    char* strptime(const scope char*, const scope char*, tm*);
}
else version (Solaris)
{
    extern __gshared c_long timezone, altzone;
    extern __gshared int daylight;

    tm* getdate(const scope char*);
    char* __strptime_dontzero(const scope char*, const scope char*, tm*);
    alias __strptime_dontzero strptime;
}
else version (CRuntime_Bionic)
{
    extern __gshared int    daylight;
    extern __gshared c_long timezone;

    char* strptime(const scope char*, const scope char*, tm*);
}
else version (CRuntime_Musl)
{
    extern __gshared int daylight;
    extern __gshared c_long timezone;

    tm*   getdate(const scope char*);
    char* strptime(const scope char*, const scope char*, tm*);
}
else version (CRuntime_UClibc)
{
    extern __gshared int    daylight;
    extern __gshared c_long timezone;

    tm*   getdate(const scope char*);
    char* strptime(const scope char*, const scope char*, tm*);
}
else
{
    static assert(false, "Unsupported platform");
}
