123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- package posix
- import "core:c"
- import "core:c/libc"
- when ODIN_OS == .Darwin {
- foreign import lib "system:System.framework"
- } else {
- foreign import lib "system:c"
- }
- // time.h - time types
- foreign lib {
- /*
- Convert the broken down time in the structure to a string form: Sun Sep 16 01:03:52 1973\n\0
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/asctime_r.html ]]
- */
- asctime_r :: proc(tm: ^tm, buf: [^]c.char) -> cstring ---
- /*
- Convert a time value to a date and time string in the same format as asctime().
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/ctime_r.html ]]
- */
- @(link_name=LCTIMER)
- ctime_r :: proc(clock: ^time_t, buf: [^]c.char) -> cstring ---
- /*
- Converts the time in seconds since epoch to a broken-down tm struct.
- Returns: nil (setting errno) on failure, the result pointer on success.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/gmtime_r.html ]]
- */
- @(link_name=LGMTIMER)
- gmtime_r :: proc(timer: ^time_t, result: ^tm) -> ^tm ---
- /*
- Convert the time in seconds since epoch to a broken-down tm struct in local time.
- Returns: nil (setting errno) on failure, the result pointer on success.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/localtime_r.html ]]
- */
- @(link_name=LLOCALTIMER)
- localtime_r :: proc(timer: ^time_t, result: ^tm) -> ^tm ---
- /*
- Returns the resolution of any clock.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html ]]
- */
- @(link_name=LCLOCKGETRES)
- clock_getres :: proc(clock_id: Clock, res: ^timespec) -> result ---
- /*
- Returns the current value tp for the specified clock, clock_id.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html ]]
- */
- @(link_name=LCLOCKGETTIME)
- clock_gettime :: proc(clock_id: Clock, tp: ^timespec) -> result ---
- /*
- Sets the specified clock's time.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/clock_getres.html ]]
- */
- @(link_name=LCLOCKSETTIME)
- clock_settime :: proc(clock_id: Clock, tp: ^timespec) -> result ---
- /*
- Converts a string representation of a date or time into a broken-down time.
- Returns: nil (setting getdate_err) on failure, the broken-down time otherwise
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/getdate.html ]]
- */
- getdate :: proc(string: cstring) -> ^tm ---
- /*
- Causes the current thread to be suspended from execution until either the time interval
- specified by rqtp has elapsed or a signal is delivered.
- Returns: -1 on failure (setting errno), if it was due to a signal, rmtp will be filled with the
- remaining time, 0 if all time has been slept
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html ]]
- */
- @(link_name=LNANOSLEEP)
- nanosleep :: proc(rqtp: ^timespec, rmtp: ^timespec) -> result ---
- /*
- Converts the character string to values which are stored in tm, using the specified format.
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/strptime.html ]]
- */
- strptime :: proc(buf: [^]c.char, format: cstring, tm: ^tm) -> cstring ---
- /*
- Uses the value of the environment variable TZ (or default) to set time conversion info.
- `daylight` is set to whether daylight saving time conversion should be done.
- `timezone` is set to the difference, in seconds, between UTC and local standard time.
- `tzname` is set by `tzname[0] = "std"` and `tzname[1] = "dst"`
- Example:
- posix.tzset()
- fmt.println(posix.tzname)
- fmt.println(posix.daylight)
- fmt.println(posix.timezone)
- Possible Output:
- ["CET", "CEST"]
- true
- -3600
- [[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/tzset.html ]]
- */
- tzset :: proc() ---
- // Whether daylight saving conversion should be done.
- daylight: b32
- // The time in seconds between UTC and local standard time.
- @(link_name=LTIMEZONE)
- timezone: c.long
- tzname: [2]cstring
- }
- time_t :: libc.time_t
- clock_t :: libc.clock_t
- tm :: libc.tm
- timespec :: libc.timespec
- CLOCKS_PER_SEC :: libc.CLOCKS_PER_SEC
- asctime :: libc.asctime
- clock :: libc.clock
- ctime :: libc.ctime
- difftime :: libc.difftime
- gmtime :: libc.gmtime
- localtime :: libc.localtime
- mktime :: libc.mktime
- strftime :: libc.strftime
- time :: libc.time
- Clock :: enum clockid_t {
- // system-wide monotonic clock, defined as clock measuring real time,
- // can be set with clock_settime() and cannot have negative clock jumps.
- MONOTONIC = CLOCK_MONOTONIC,
- // CPU-time clock associated with the process making a clock() function call.
- PROCESS_CPUTIME_ID = CLOCK_PROCESS_CPUTIME_ID,
- // system-wide clock measuring real time.
- REALTIME = CLOCK_REALTIME,
- // CPU-time clock associated with the thread making a clock() function call.
- THREAD_CPUTIME_ID = CLOCK_THREAD_CPUTIME_ID,
- }
- when ODIN_OS == .NetBSD {
- @(private) LCTIMER :: "__ctime_r50"
- @(private) LGMTIMER :: "__gmtime_r50"
- @(private) LLOCALTIMER :: "__localtime_r50"
- @(private) LCLOCKGETRES :: "__clock_getres50"
- @(private) LCLOCKGETTIME :: "__clock_gettime50"
- @(private) LCLOCKSETTIME :: "__clock_settime50"
- @(private) LNANOSLEEP :: "__nanosleep50"
- @(private) LTIMEZONE :: "__timezone13"
- } else {
- @(private) LCTIMER :: "ctime_r"
- @(private) LGMTIMER :: "gmtime_r"
- @(private) LLOCALTIMER :: "localtime_r"
- @(private) LCLOCKGETRES :: "clock_getres"
- @(private) LCLOCKGETTIME :: "clock_gettime"
- @(private) LCLOCKSETTIME :: "clock_settime"
- @(private) LNANOSLEEP :: "nanosleep"
- @(private) LTIMEZONE :: "timezone"
- }
- when ODIN_OS == .Darwin {
- clockid_t :: distinct c.int
- CLOCK_MONOTONIC :: 6
- CLOCK_PROCESS_CPUTIME_ID :: 12
- CLOCK_REALTIME :: 0
- CLOCK_THREAD_CPUTIME_ID :: 16
- foreign lib {
- getdate_err: Errno
- }
- } else when ODIN_OS == .FreeBSD {
- clockid_t :: distinct c.int
- CLOCK_MONOTONIC :: 4
- CLOCK_PROCESS_CPUTIME_ID :: 15
- CLOCK_REALTIME :: 0
- CLOCK_THREAD_CPUTIME_ID :: 14
- foreign lib {
- getdate_err: Errno
- }
- } else when ODIN_OS == .NetBSD {
- clockid_t :: distinct c.uint
- CLOCK_MONOTONIC :: 3
- CLOCK_PROCESS_CPUTIME_ID :: 0x40000000
- CLOCK_REALTIME :: 0
- CLOCK_THREAD_CPUTIME_ID :: 0x20000000
- foreign lib {
- getdate_err: Errno
- }
- } else when ODIN_OS == .OpenBSD {
- clockid_t :: distinct c.uint
- CLOCK_MONOTONIC :: 3
- CLOCK_PROCESS_CPUTIME_ID :: 2
- CLOCK_REALTIME :: 0
- CLOCK_THREAD_CPUTIME_ID :: 4
- getdate_err: Errno = .ENOSYS // NOTE: looks like it's not a thing on OpenBSD.
- } else {
- #panic("posix is unimplemented for the current target")
- }
|