mirror of
https://github.com/odin-lang/Odin.git
synced 2026-01-07 13:33:13 +00:00
257 lines
7.0 KiB
Odin
257 lines
7.0 KiB
Odin
#+build linux, darwin, netbsd, openbsd, freebsd, haiku
|
|
package posix
|
|
|
|
import "core:c"
|
|
import "core:c/libc"
|
|
|
|
when ODIN_OS == .Darwin {
|
|
foreign import lib "system:System"
|
|
} 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.
|
|
|
|
[[ 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 when ODIN_OS == .Haiku {
|
|
|
|
clockid_t :: distinct c.int32_t
|
|
|
|
CLOCK_MONOTONIC :: 0
|
|
CLOCK_PROCESS_CPUTIME_ID :: -2
|
|
CLOCK_REALTIME :: -1
|
|
CLOCK_THREAD_CPUTIME_ID :: -3
|
|
|
|
getdate_err: Errno = .ENOSYS // NOTE: looks like it's not a thing on Haiku.
|
|
|
|
} else when ODIN_OS == .Linux {
|
|
|
|
clockid_t :: distinct c.int
|
|
|
|
CLOCK_MONOTONIC :: 1
|
|
CLOCK_PROCESS_CPUTIME_ID :: 2
|
|
CLOCK_REALTIME :: 0
|
|
CLOCK_THREAD_CPUTIME_ID :: 3
|
|
|
|
foreign lib {
|
|
getdate_err: Errno
|
|
}
|
|
}
|