mirror of
https://github.com/odin-lang/Odin.git
synced 2026-01-09 06:23:14 +00:00
371 lines
7.1 KiB
Odin
371 lines
7.1 KiB
Odin
#+build linux, darwin, netbsd, openbsd, freebsd, haiku
|
|
package posix
|
|
|
|
import "core:c"
|
|
|
|
when ODIN_OS == .Darwin {
|
|
foreign import lib "system:System"
|
|
} else {
|
|
foreign import lib "system:c"
|
|
}
|
|
|
|
// langinfo.h - language information constants
|
|
|
|
foreign lib {
|
|
/*
|
|
Return a pointer to a string containing information relevant to the particular language or
|
|
cultural area defined in the current locale.
|
|
|
|
Returns: a string that should not be freed or modified, and that can be invalidated at any time later
|
|
|
|
Example:
|
|
for item in posix.nl_item {
|
|
fmt.printfln("%v: %q", item, posix.nl_langinfo(item))
|
|
}
|
|
|
|
Possible Output:
|
|
CODESET: "US-ASCII"
|
|
D_T_FMT: "%a %b %e %H:%M:%S %Y"
|
|
D_FMT: "%m/%d/%y"
|
|
T_FMT: "%H:%M:%S"
|
|
T_FMT_AMPM: "%I:%M:%S %p"
|
|
AM_STR: "AM"
|
|
PM_STR: "PM"
|
|
DAY_1: "Sunday"
|
|
DAY_2: "Monday"
|
|
DAY_3: "Tuesday"
|
|
DAY_4: "Wednesday"
|
|
DAY_5: "Thursday"
|
|
DAY_6: "Friday"
|
|
DAY_7: "Saturday"
|
|
ABDAY_1: "Sun"
|
|
ABDAY_2: "Mon"
|
|
ABDAY_3: "Tue"
|
|
ABDAY_4: "Wed"
|
|
ABDAY_5: "Thu"
|
|
ABDAY_6: "Fri"
|
|
ABDAY_7: "Sat"
|
|
MON_1: "January"
|
|
MON_2: "February"
|
|
MON_3: "March"
|
|
MON_4: "April"
|
|
MON_5: "May"
|
|
MON_6: "June"
|
|
MON_7: "July"
|
|
MON_8: "August"
|
|
MON_9: "September"
|
|
MON_10: "October"
|
|
MON_11: "November"
|
|
MON_12: "December"
|
|
ABMON_1: "Jan"
|
|
ABMON_2: "Feb"
|
|
ABMON_3: "Mar"
|
|
ABMON_4: "Apr"
|
|
ABMON_5: "May"
|
|
ABMON_6: "Jun"
|
|
ABMON_7: "Jul"
|
|
ABMON_8: "Aug"
|
|
ABMON_9: "Sep"
|
|
ABMON_10: "Oct"
|
|
ABMON_11: "Nov"
|
|
ABMON_12: "Dec"
|
|
ERA: ""
|
|
ERA_D_FMT: ""
|
|
ERA_D_T_FMT: ""
|
|
ERA_T_FMT: ""
|
|
ALT_DIGITS: ""
|
|
RADIXCHAR: "."
|
|
THOUSEP: ""
|
|
YESEXPR: "^[yY]"
|
|
NOEXPR: "^[nN]"
|
|
CRNCYSTR: ""
|
|
|
|
[[ More; https://pubs.opengroup.org/onlinepubs/9699919799/functions/nl_langinfo.html ]]
|
|
*/
|
|
nl_langinfo :: proc(nl_item) -> cstring ---
|
|
}
|
|
|
|
nl_item :: enum nl_item_t {
|
|
CODESET = CODESET,
|
|
D_T_FMT = D_T_FMT,
|
|
D_FMT = D_FMT,
|
|
T_FMT = T_FMT,
|
|
T_FMT_AMPM = T_FMT_AMPM,
|
|
AM_STR = AM_STR,
|
|
PM_STR = PM_STR,
|
|
DAY_1 = DAY_1,
|
|
DAY_2 = DAY_2,
|
|
DAY_3 = DAY_3,
|
|
DAY_4 = DAY_4,
|
|
DAY_5 = DAY_5,
|
|
DAY_6 = DAY_6,
|
|
DAY_7 = DAY_7,
|
|
ABDAY_1 = ABDAY_1,
|
|
ABDAY_2 = ABDAY_2,
|
|
ABDAY_3 = ABDAY_3,
|
|
ABDAY_4 = ABDAY_4,
|
|
ABDAY_5 = ABDAY_5,
|
|
ABDAY_6 = ABDAY_6,
|
|
ABDAY_7 = ABDAY_7,
|
|
MON_1 = MON_1,
|
|
MON_2 = MON_2,
|
|
MON_3 = MON_3,
|
|
MON_4 = MON_4,
|
|
MON_5 = MON_5,
|
|
MON_6 = MON_6,
|
|
MON_7 = MON_7,
|
|
MON_8 = MON_8,
|
|
MON_9 = MON_9,
|
|
MON_10 = MON_10,
|
|
MON_11 = MON_11,
|
|
MON_12 = MON_12,
|
|
ABMON_1 = ABMON_1,
|
|
ABMON_2 = ABMON_2,
|
|
ABMON_3 = ABMON_3,
|
|
ABMON_4 = ABMON_4,
|
|
ABMON_5 = ABMON_5,
|
|
ABMON_6 = ABMON_6,
|
|
ABMON_7 = ABMON_7,
|
|
ABMON_8 = ABMON_8,
|
|
ABMON_9 = ABMON_9,
|
|
ABMON_10 = ABMON_10,
|
|
ABMON_11 = ABMON_11,
|
|
ABMON_12 = ABMON_12,
|
|
ERA = ERA,
|
|
ERA_D_FMT = ERA_D_FMT,
|
|
ERA_D_T_FMT = ERA_D_T_FMT,
|
|
ERA_T_FMT = ERA_T_FMT,
|
|
ALT_DIGITS = ALT_DIGITS,
|
|
RADIXCHAR = RADIXCHAR,
|
|
THOUSEP = THOUSEP,
|
|
YESEXPR = YESEXPR,
|
|
NOEXPR = NOEXPR,
|
|
CRNCYSTR = CRNCYSTR,
|
|
}
|
|
|
|
when ODIN_OS == .Darwin || ODIN_OS == .FreeBSD || ODIN_OS == .Haiku {
|
|
|
|
// NOTE: declared with `_t` so we can enumerate the real `nl_info`.
|
|
nl_item_t :: distinct c.int
|
|
|
|
CODESET :: 0
|
|
D_T_FMT :: 1
|
|
D_FMT :: 2
|
|
T_FMT :: 3
|
|
T_FMT_AMPM :: 4
|
|
AM_STR :: 5
|
|
PM_STR :: 6
|
|
|
|
DAY_1 :: 7
|
|
DAY_2 :: 8
|
|
DAY_3 :: 9
|
|
DAY_4 :: 10
|
|
DAY_5 :: 11
|
|
DAY_6 :: 12
|
|
DAY_7 :: 13
|
|
|
|
ABDAY_1 :: 14
|
|
ABDAY_2 :: 15
|
|
ABDAY_3 :: 16
|
|
ABDAY_4 :: 17
|
|
ABDAY_5 :: 18
|
|
ABDAY_6 :: 19
|
|
ABDAY_7 :: 20
|
|
|
|
MON_1 :: 21
|
|
MON_2 :: 22
|
|
MON_3 :: 23
|
|
MON_4 :: 24
|
|
MON_5 :: 25
|
|
MON_6 :: 26
|
|
MON_7 :: 27
|
|
MON_8 :: 28
|
|
MON_9 :: 29
|
|
MON_10 :: 30
|
|
MON_11 :: 31
|
|
MON_12 :: 32
|
|
|
|
ABMON_1 :: 33
|
|
ABMON_2 :: 34
|
|
ABMON_3 :: 35
|
|
ABMON_4 :: 36
|
|
ABMON_5 :: 37
|
|
ABMON_6 :: 38
|
|
ABMON_7 :: 39
|
|
ABMON_8 :: 40
|
|
ABMON_9 :: 41
|
|
ABMON_10 :: 42
|
|
ABMON_11 :: 43
|
|
ABMON_12 :: 44
|
|
|
|
ERA :: 45
|
|
ERA_D_FMT :: 46
|
|
ERA_D_T_FMT :: 47
|
|
ERA_T_FMT :: 48
|
|
ALT_DIGITS :: 49
|
|
|
|
RADIXCHAR :: 50
|
|
THOUSEP :: 51
|
|
|
|
YESEXPR :: 52
|
|
NOEXPR :: 53
|
|
|
|
CRNCYSTR :: 54 when ODIN_OS == .Haiku else 56
|
|
|
|
} else when ODIN_OS == .NetBSD || ODIN_OS == .OpenBSD {
|
|
|
|
// NOTE: declared with `_t` so we can enumerate the real `nl_info`.
|
|
nl_item_t :: distinct c.int
|
|
|
|
CODESET :: 51
|
|
D_T_FMT :: 0
|
|
D_FMT :: 1
|
|
T_FMT :: 2
|
|
T_FMT_AMPM :: 3
|
|
AM_STR :: 4
|
|
PM_STR :: 5
|
|
|
|
DAY_1 :: 6
|
|
DAY_2 :: 7
|
|
DAY_3 :: 8
|
|
DAY_4 :: 9
|
|
DAY_5 :: 10
|
|
DAY_6 :: 11
|
|
DAY_7 :: 12
|
|
|
|
ABDAY_1 :: 13
|
|
ABDAY_2 :: 14
|
|
ABDAY_3 :: 15
|
|
ABDAY_4 :: 16
|
|
ABDAY_5 :: 17
|
|
ABDAY_6 :: 18
|
|
ABDAY_7 :: 19
|
|
|
|
MON_1 :: 20
|
|
MON_2 :: 21
|
|
MON_3 :: 22
|
|
MON_4 :: 23
|
|
MON_5 :: 24
|
|
MON_6 :: 25
|
|
MON_7 :: 26
|
|
MON_8 :: 27
|
|
MON_9 :: 28
|
|
MON_10 :: 29
|
|
MON_11 :: 30
|
|
MON_12 :: 31
|
|
|
|
ABMON_1 :: 32
|
|
ABMON_2 :: 33
|
|
ABMON_3 :: 34
|
|
ABMON_4 :: 35
|
|
ABMON_5 :: 36
|
|
ABMON_6 :: 37
|
|
ABMON_7 :: 38
|
|
ABMON_8 :: 39
|
|
ABMON_9 :: 40
|
|
ABMON_10 :: 41
|
|
ABMON_11 :: 42
|
|
ABMON_12 :: 43
|
|
|
|
ERA :: 52
|
|
ERA_D_FMT :: 53
|
|
ERA_D_T_FMT :: 54
|
|
ERA_T_FMT :: 55
|
|
ALT_DIGITS :: 56
|
|
|
|
RADIXCHAR :: 44
|
|
THOUSEP :: 45
|
|
|
|
YESEXPR :: 47
|
|
NOEXPR :: 49
|
|
|
|
CRNCYSTR :: 50
|
|
|
|
} else when ODIN_OS == .Linux {
|
|
|
|
// NOTE: declared with `_t` so we can enumerate the real `nl_info`.
|
|
nl_item_t :: distinct c.int
|
|
|
|
// NOTE: All these values are set in an enum on the Linux implementation.
|
|
// Some depend on locale.h contants (bits/locale.h to be precise).
|
|
|
|
// NOTE: ABDAY_1 is set to LC_TIME << 16 (LC_TIME is 2) on the enum group of
|
|
// the Linux implementation.
|
|
ABDAY_1 :: 0x20_000
|
|
ABDAY_2 :: 0x20_001
|
|
ABDAY_3 :: 0x20_002
|
|
ABDAY_4 :: 0x20_003
|
|
ABDAY_5 :: 0x20_004
|
|
ABDAY_6 :: 0x20_005
|
|
ABDAY_7 :: 0x20_006
|
|
|
|
DAY_1 :: 0x20_007
|
|
DAY_2 :: 0x20_008
|
|
DAY_3 :: 0x20_009
|
|
DAY_4 :: 0x20_00A
|
|
DAY_5 :: 0x20_00B
|
|
DAY_6 :: 0x20_00C
|
|
DAY_7 :: 0x20_00D
|
|
|
|
ABMON_1 :: 0x20_00E
|
|
ABMON_2 :: 0x20_010
|
|
ABMON_3 :: 0x20_011
|
|
ABMON_4 :: 0x20_012
|
|
ABMON_5 :: 0x20_013
|
|
ABMON_6 :: 0x20_014
|
|
ABMON_7 :: 0x20_015
|
|
ABMON_8 :: 0x20_016
|
|
ABMON_9 :: 0x20_017
|
|
ABMON_10 :: 0x20_018
|
|
ABMON_11 :: 0x20_019
|
|
ABMON_12 :: 0x20_01A
|
|
|
|
MON_1 :: 0x20_01B
|
|
MON_2 :: 0x20_01C
|
|
MON_3 :: 0x20_01D
|
|
MON_4 :: 0x20_01E
|
|
MON_5 :: 0x20_020
|
|
MON_6 :: 0x20_021
|
|
MON_7 :: 0x20_022
|
|
MON_8 :: 0x20_023
|
|
MON_9 :: 0x20_024
|
|
MON_10 :: 0x20_025
|
|
MON_11 :: 0x20_026
|
|
MON_12 :: 0x20_027
|
|
|
|
AM_STR :: 0x20_028
|
|
PM_STR :: 0x20_029
|
|
|
|
D_T_FMT :: 0x20_02A
|
|
D_FMT :: 0x20_02B
|
|
T_FMT :: 0x20_02C
|
|
T_FMT_AMPM :: 0x20_02D
|
|
|
|
ERA :: 0x20_02E
|
|
ERA_D_FMT :: 0x20_030
|
|
ALT_DIGITS :: 0x20_031
|
|
ERA_D_T_FMT :: 0x20_032
|
|
ERA_T_FMT :: 0x20_033
|
|
|
|
// NOTE: CODESET is the 16th member of the enum group starting with value
|
|
// LC_CTYPE << 16, LC_CTYPE is 0.
|
|
CODESET :: 0x0F
|
|
|
|
// NOTE: CRNCYSTR is the 16th member of the enum group starting with value
|
|
// LC_MONETARY << 16, LC_MONETARY is 4.
|
|
CRNCYSTR :: 0x40_00F
|
|
|
|
// NOTE: RADIXCHAR is the 1st member of the enum group starting with value
|
|
// LC_NUMERIC << 16, LC_NUMERIC is 1.
|
|
RADIXCHAR :: 0x10_000
|
|
THOUSEP :: 0x10_001
|
|
|
|
// NOTE: YESEXPR is the 1st member of the enum group starting with value
|
|
// LC_MESSAGES << 16, LC_MESSAGES is 5.
|
|
YESEXPR :: 0x50_000
|
|
NOEXPR :: 0x50_001
|
|
|
|
} else {
|
|
#panic("posix is unimplemented for the current target")
|
|
}
|