core/c/libc
libc
Types
102FILE
FILE :: FILESource7.21 Input/output
Locale_Category
Locale_Category :: enum c.int {
ALL = LC_ALL,
COLLATE = LC_COLLATE,
CTYPE = LC_CTYPE,
MESSAGES = LC_MESSAGES,
MONETARY = LC_MONETARY,
NUMERIC = LC_NUMERIC,
TIME = LC_TIME,
}SourceWhence
Whence :: enum int {
SET = SEEK_SET,
CUR = SEEK_CUR,
END = SEEK_END,
}Sourceatomic_bool
atomic_bool :: boolSource7.17.6 Atomic integer types
atomic_char
atomic_char :: u8Sourceatomic_char16_t
atomic_char16_t :: u16Sourceatomic_char32_t
atomic_char32_t :: u32Sourceatomic_flag
atomic_flag :: atomic_boolSource7.17.8 Atomic flag type and operations
atomic_int
atomic_int :: intSourceatomic_int_fast16_t
atomic_int_fast16_t :: i64Sourceatomic_int_fast32_t
atomic_int_fast32_t :: i64Sourceatomic_int_fast64_t
atomic_int_fast64_t :: i64Sourceatomic_int_fast8_t
atomic_int_fast8_t :: i8Sourceatomic_int_least16_t
atomic_int_least16_t :: i16Sourceatomic_int_least32_t
atomic_int_least32_t :: i32Sourceatomic_int_least64_t
atomic_int_least64_t :: i64Sourceatomic_int_least8_t
atomic_int_least8_t :: i8Sourceatomic_intmax_t
atomic_intmax_t :: i64Sourceatomic_intptr_t
atomic_intptr_t :: intSourceatomic_llong
atomic_llong :: i64Sourceatomic_long
atomic_long :: i64Sourceatomic_ptrdiff_t
atomic_ptrdiff_t :: ptrdiff_tSourceatomic_schar
atomic_schar :: u8Sourceatomic_short
atomic_short :: i16Sourceatomic_size_t
atomic_size_t :: uintSourceatomic_uchar
atomic_uchar :: u8Sourceatomic_uint
atomic_uint :: uintSourceatomic_uint_fast16_t
atomic_uint_fast16_t :: u64Sourceatomic_uint_fast32_t
atomic_uint_fast32_t :: u64Sourceatomic_uint_fast64_t
atomic_uint_fast64_t :: u64Sourceatomic_uint_fast8_t
atomic_uint_fast8_t :: u8Sourceatomic_uint_least16_t
atomic_uint_least16_t :: u16Sourceatomic_uint_least32_t
atomic_uint_least32_t :: u32Sourceatomic_uint_least64_t
atomic_uint_least64_t :: u64Sourceatomic_uint_least8_t
atomic_uint_least8_t :: u8Sourceatomic_uintmax_t
atomic_uintmax_t :: u64Sourceatomic_uintptr_t
atomic_uintptr_t :: uintptrSourceatomic_ullong
atomic_ullong :: u64Sourceatomic_ulong
atomic_ulong :: u64Sourceatomic_ushort
atomic_ushort :: u16Sourceatomic_wchar_t
atomic_wchar_t :: u32Sourcebool
bool :: boolSourcechar
char :: charSourceassuming -funsigned-char
char16_t
char16_t :: uint_least16_tSourcechar32_t
char32_t :: uint_least32_tSourcecomplex_double
complex_double :: builtin.complex128Sourcecomplex_float
complex_float :: builtin.complex64Sourcediv_t
div_t :: struct {
quot: int,
rem: int,
}SourceC does not declare which order 'quot' and 'rem' should be for the divide structures. An implementation could put 'rem' first. However, nobody actually does and everyone appears to have agreed upon this layout.
double
double :: doubleSourcefloat
float :: floatSourceint
int :: intSourceint16_t
int16_t :: int16_tSourceint32_t
int32_t :: int32_tSourceint64_t
int64_t :: int64_tSourceint8_t
int8_t :: int8_tSourceint_fast16_t
int_fast16_t :: int_fast16_tSourceint_fast32_t
int_fast32_t :: int_fast32_tSourceint_fast64_t
int_fast64_t :: int_fast64_tSourceint_fast8_t
int_fast8_t :: int_fast8_tSourceint_least16_t
int_least16_t :: int_least16_tSourceint_least32_t
int_least32_t :: int_least32_tSourceint_least64_t
int_least64_t :: int_least64_tSourceint_least8_t
int_least8_t :: int_least8_tSourceintmax_t
intmax_t :: intmax_tSourceintptr_t
intptr_t :: intptr_tSourcejmp_buf
jmp_buf :: struct {
_: [4096]char,
}SourceThe C99 Rationale describes jmp_buf as being an array type for backward compatibility. Odin does not need to honor this and couldn't as arrays in Odin don't decay to pointers. It is somewhat easy for us to bind this, we just need to ensure the structure contains enough storage with appropriate alignment. Since there are no types in C with an alignment larger than that of max_align_t, which cannot be larger than sizeof(long double) as any other exposed type wouldn't be valid C, the maximum alignment possible in a strictly conformant C implementation is 16 on the platforms we care about. The choice of 4096 bytes for storage of this type is more than enough on all relevant platforms.
lconv
lconv :: struct {
decimal_point: cstring,
thousand_sep: cstring,
grouping: cstring,
int_curr_symbol: cstring,
currency_symbol: cstring,
mon_decimal_points: cstring,
mon_thousands_sep: cstring,
mon_grouping: cstring,
positive_sign: cstring,
negative_sign: cstring,
int_frac_digits: c.char,
frac_digits: c.char,
p_cs_precedes: c.char,
p_sep_by_space: c.char,
n_cs_precedes: c.char,
n_sep_by_space: c.char,
p_sign_posn: c.char,
n_sign_posn: c.char,
_int_p_cs_precedes: c.char,
_int_n_cs_precedes: c.char,
_int_p_sep_by_space: c.char,
_int_n_sep_by_space: c.char,
_int_p_sign_posn: c.char,
_int_n_sign_posn: c.char,
}Sourceldiv_t
ldiv_t :: struct {
quot: long,
rem: long,
}Sourcelldiv_t
lldiv_t :: struct {
quot: longlong,
rem: longlong,
}Sourcelong
long :: longSourcelonglong
longlong :: longlongSourcembstate_t
mbstate_t :: struct {
_: [32]char,
}SourceLarge enough and aligned enough for any wide-spread in-use libc.
memory_order
memory_order :: enum int {
relaxed = 0,
consume = 1,
acquire = 2,
release = 3,
acq_rel = 4,
seq_cst = 5,
}Source7.17.3 Order and consistency
ptrdiff_t
ptrdiff_t :: ptrdiff_tSourceschar
schar :: scharSourceshort
short :: shortSourcesig_atomic_t
sig_atomic_t :: atomic_intSourcesize_t
size_t :: size_tSourcessize_t
ssize_t :: ssize_tSourcethrd_start_t
thrd_start_t :: proc "c" (rawptr) -> intSource7.26 Threads
tss_dtor_t
tss_dtor_t :: proc "c" (rawptr)Sourceuchar
uchar :: ucharSourceuint
uint :: uintSourceuint16_t
uint16_t :: uint16_tSourceuint32_t
uint32_t :: uint32_tSourceuint64_t
uint64_t :: uint64_tSourceuint8_t
uint8_t :: uint8_tSourceuint_fast16_t
uint_fast16_t :: uint_fast16_tSourceuint_fast32_t
uint_fast32_t :: uint_fast32_tSourceuint_fast64_t
uint_fast64_t :: uint_fast64_tSourceuint_fast8_t
uint_fast8_t :: uint_fast8_tSourceuint_least16_t
uint_least16_t :: uint_least16_tSourceuint_least32_t
uint_least32_t :: uint_least32_tSourceuint_least64_t
uint_least64_t :: uint_least64_tSourceuint_least8_t
uint_least8_t :: uint_least8_tSourceuintmax_t
uintmax_t :: uintmax_tSourceuintptr_t
uintptr_t :: uintptr_tSourceulong
ulong :: ulongSourceulonglong
ulonglong :: ulonglongSourceushort
ushort :: ushortSourcewchar_t
wchar_t :: wchar_tSourcewint_t
wint_t :: u32SourceOdin does not have default argument promotion so the need for a separate type here isn't necessary, though make it distinct just to be safe.
Constants
62ATOMIC_BOOL_LOCK_FREE
ATOMIC_BOOL_LOCK_FREE :: trueSourceATOMIC_CHAR16_T_LOCK_FREE
ATOMIC_CHAR16_T_LOCK_FREE :: trueSourceATOMIC_CHAR32_T_LOCK_FREE
ATOMIC_CHAR32_T_LOCK_FREE :: trueSourceATOMIC_CHAR_LOCK_FREE
ATOMIC_CHAR_LOCK_FREE :: trueSourceATOMIC_INT_LOCK_FREE
ATOMIC_INT_LOCK_FREE :: trueSourceATOMIC_LLONG_LOCK_FREE
ATOMIC_LLONG_LOCK_FREE :: trueSourceATOMIC_LONG_LOCK_FREE
ATOMIC_LONG_LOCK_FREE :: trueSourceATOMIC_POINTER_LOCK_FREE
ATOMIC_POINTER_LOCK_FREE :: trueSourceATOMIC_SHORT_LOCK_FREE
ATOMIC_SHORT_LOCK_FREE :: trueSourceATOMIC_WCHAR_T_LOCK_FREE
ATOMIC_WCHAR_T_LOCK_FREE :: trueSourceCHAR_BIT
CHAR_BIT :: 8SourceEXIT_FAILURE
EXIT_FAILURE :: 1SourceEXIT_SUCCESS
EXIT_SUCCESS :: 0SourceC does not declare what these values should be, as an implementation is free to use any two distinct values it wants to indicate success or failure. However, nobody actually does and everyone appears to have agreed upon these values.
FP_ILOGB0
FP_ILOGB0 :: FP_ILOGBNANSourceFP_ILOGBNAN
FP_ILOGBNAN :: _ = -1 - int((~uint(0)) >> 1)SourceFP_INFINITE
FP_INFINITE :: 1SourceFP_NAN
FP_NAN :: 0SourceNumber classification constants. These do not have to match libc since we implement our own classification functions as libc requires they be macros, which means libc does not export standard functions for them.
FP_NORMAL
FP_NORMAL :: 3SourceFP_SUBNORMAL
FP_SUBNORMAL :: 4SourceFP_ZERO
FP_ZERO :: 2SourceHUGE_VAL
HUGE_VAL :: f64 = double(INFINITY)SourceHUGE_VALF
HUGE_VALF :: INFINITYSourceINFINITY
INFINITY :: _ = 0h7ff00000_00000000Source+Inf
INT16_MAX
INT16_MAX :: INT16_MAXSourceINT16_MIN
INT16_MIN :: c.INT16_MINSourceINT32_MAX
INT32_MAX :: INT32_MAXSourceINT32_MIN
INT32_MIN :: c.INT32_MINSourceINT64_MAX
INT64_MAX :: c.INT64_MAXSourceINT64_MIN
INT64_MIN :: c.INT64_MINSourceINT8_MAX
INT8_MAX :: INT8_MAXSourceCopy C's rules for type promotion here by forcing the type on the literals.
INT8_MIN
INT8_MIN :: c.INT8_MINSourceMATH_ERREXCEPT
MATH_ERREXCEPT :: 2SourceMATH_ERRNO
MATH_ERRNO :: 1SourceNDEBUG
NDEBUG :: !ODIN_DEBUGSourceNULL
NULL :: rawptr = rawptr(uintptr(0))SourcePTRDIFF_MAX
PTRDIFF_MAX :: c.PTRDIFF_MAXSourcePTRDIFF_MIN
PTRDIFF_MIN :: c.PTRDIFF_MINSourceSIG_ATOMIC_MAX
SIG_ATOMIC_MAX :: sig_atomic_t = max(sig_atomic_t)SourceSIG_ATOMIC_MIN
SIG_ATOMIC_MIN :: sig_atomic_t = min(sig_atomic_t)SourceSIZE_MAX
SIZE_MAX :: c.SIZE_MAXSourceUINT16_MAX
UINT16_MAX :: UINT16_MAXSourceUINT32_MAX
UINT32_MAX :: UINT32_MAXSourceUINT64_MAX
UINT64_MAX :: c.UINT64_MAXSourceUINT8_MAX
UINT8_MAX :: UINT8_MAXSourceWCHAR_MAX
WCHAR_MAX :: c.WCHAR_MAXSourceWCHAR_MIN
WCHAR_MIN :: c.WCHAR_MINSourceWEOF
WEOF :: _ = ~wint_t(0)SourceWINT_MAX
WINT_MAX :: 1 << (size_of(wint_t) * 8)SourceWINT_MIN
WINT_MIN :: 0SourceCalculate these values correctly regardless of what type wchar_t actually is.
double_t
double_t :: doubleSourcefloat_t
float_t :: floatSourceOn amd64 Windows and Linux, float_t and double_t are respectively both their usual types. On x86 it's not possible to define these types correctly since they would be long double which Odin does NOT have support for.
math_errhandling
math_errhandling :: 2SourceWindows, Linux, macOS all use this mode.
memory_order_acq_rel
memory_order_acq_rel :: memory_order.acq_relSourcememory_order_acquire
memory_order_acquire :: memory_order.acquireSourcememory_order_consume
memory_order_consume :: memory_order.consumeSourcememory_order_relaxed
memory_order_relaxed :: memory_order.relaxedSourcememory_order_release
memory_order_release :: memory_order.releaseSourcememory_order_seq_cst
memory_order_seq_cst :: memory_order.seq_cstSourceva_copy
va_copy :: intrinsics.c_va_copySourceva_end
va_end :: intrinsics.c_va_endSourceva_list
va_list :: intrinsics.c_va_listSourceva_start
va_start :: intrinsics.c_va_startSourceVariables
1Procedures
47ATOMIC_VAR_INIT
ATOMIC_VAR_INIT :: proc(value: T) -> (T)Source7.17.2 Initialization
CMPLX
CMPLX :: proc(x: double, y: double) -> (complex_double)SourceCannot implement _Complex_I or _Imaginary_I in Odin, thus complex and imaginary cannot be implement either.
CMPLXF
CMPLXF :: proc(x: float, y: float) -> (complex_float)Sourcealigned_alloc
aligned_alloc :: proc(alignment: size_t, size: size_t) -> (rawptr)Sourcealigned_free
aligned_free :: proc(ptr: rawptr)Sourceatomic_compare_exchange_strong
atomic_compare_exchange_strong :: proc(object: ^T, expected: ^T, desired: T) -> (bool)SourceC does not allow failure memory order to be order_release or acq_rel. Similarly, it does not allow the failure order to be stronger than success order. Since consume and acquire are both monotonic, we can count them as one, for a total of three memory orders that are relevant in compare exchange.
relaxed, acquire (consume), seq_cst.
The requirement that the failure order cannot be stronger than success limits
the valid combinations for the failure order to this table:
[success = seq_cst, failure = seq_cst] => _
[success = acquire, failure = seq_cst] => acq
[success = release, failure = seq_cst] => rel
[success = acq_rel, failure = seq_cst] => acqrel
[success = relaxed, failure = relaxed] => relaxed
[success = seq_cst, failure = relaxed] => failrelaxed
[success = seq_cst, failure = acquire] => failacq
[success = acquire, failure = relaxed] => acq_failrelaxed
[success = acq_rel, failure = relaxed] => acqrel_failrelaxedatomic_compare_exchange_strong_explicit
atomic_compare_exchange_strong_explicit :: proc(object: ^T, expected: ^T, desired: T, success: memory_order, failure: memory_order) -> (bool)Sourceatomic_compare_exchange_weak
atomic_compare_exchange_weak :: proc(object: ^T, expected: ^T, desired: T) -> (bool)Sourceatomic_compare_exchange_weak_explicit
atomic_compare_exchange_weak_explicit :: proc(object: ^T, expected: ^T, desired: T, success: memory_order, failure: memory_order) -> (bool)Sourceatomic_exchange
atomic_exchange :: proc(object: ^T, desired: T) -> (T)Sourceatomic_exchange_explicit
atomic_exchange_explicit :: proc(object: ^T, desired: T, order: memory_order) -> (T)Sourceatomic_fetch_add
atomic_fetch_add :: proc(object: ^T, operand: T) -> (T)Source7.17.7.5 The atomic_fetch and modify generic functions
atomic_fetch_add_explicit
atomic_fetch_add_explicit :: proc(object: ^T, operand: T, order: memory_order) -> (T)Sourceatomic_fetch_and
atomic_fetch_and :: proc(object: ^T, operand: T) -> (T)Sourceatomic_fetch_and_explicit
atomic_fetch_and_explicit :: proc(object: ^T, operand: T, order: memory_order) -> (T)Sourceatomic_fetch_or
atomic_fetch_or :: proc(object: ^T, operand: T) -> (T)Sourceatomic_fetch_or_explicit
atomic_fetch_or_explicit :: proc(object: ^T, operand: T, order: memory_order) -> (T)Sourceatomic_fetch_sub
atomic_fetch_sub :: proc(object: ^T, operand: T) -> (T)Sourceatomic_fetch_sub_explicit
atomic_fetch_sub_explicit :: proc(object: ^T, operand: T, order: memory_order) -> (T)Sourceatomic_fetch_xor
atomic_fetch_xor :: proc(object: ^T, operand: T) -> (T)Sourceatomic_fetch_xor_explicit
atomic_fetch_xor_explicit :: proc(object: ^T, operand: T, order: memory_order) -> (T)Sourceatomic_flag_clear
atomic_flag_clear :: proc(flag: ^atomic_flag)Sourceatomic_flag_clear_explicit
atomic_flag_clear_explicit :: proc(flag: ^atomic_flag, order: memory_order)Sourceatomic_flag_test_and_set
atomic_flag_test_and_set :: proc(flag: ^atomic_flag) -> (bool)Sourceatomic_flag_test_and_set_explicit
atomic_flag_test_and_set_explicit :: proc(flag: ^atomic_flag, order: memory_order) -> (bool)Sourceatomic_init
atomic_init :: proc(obj: ^T, value: T)Sourceatomic_is_lock_free
atomic_is_lock_free :: proc(obj: ^T) -> (bool)Source7.17.5 Lock-free property
atomic_load
atomic_load :: proc(object: ^T) -> (T)Sourceatomic_load_explicit
atomic_load_explicit :: proc(object: ^T, order: memory_order)Sourceatomic_signal_fence
atomic_signal_fence :: proc(order: memory_order)Sourceatomic_store
atomic_store :: proc(object: ^T, desired: T)Source7.17.7 Operations on atomic types
atomic_store_explicit
atomic_store_explicit :: proc(object: ^T, desired: T, order: memory_order)Sourceatomic_thread_fence
atomic_thread_fence :: proc(order: memory_order)Source7.17.4 Fences
errno
errno :: proc() -> (^int)SourceOdin has no way to make an identifier "errno" behave as a function call to read the value, or to produce an lvalue such that you can assign a different error value to errno. To work around this, just expose it as a function like it actually is.
isfinite
isfinite :: proc(x: T) -> (bool)Sourceisgreater
isgreater :: proc(x: T, y: T) -> (bool)SourceThese are special in that they avoid float exceptions. They cannot just be implemented as the relational comparisons, as that would produce an invalid "sticky" state that propagates and affects maths results. These need to be implemented natively in Odin assuming isunordered to prevent that.
isgreaterequal
isgreaterequal :: proc(x: T, y: T) -> (bool)Sourceisinf
isinf :: proc(x: T) -> (bool)Sourceisless
isless :: proc(x: T, y: T) -> (bool)Sourceislessequal
islessequal :: proc(x: T, y: T) -> (bool)Sourceislessgreater
islessgreater :: proc(x: T, y: T) -> (bool)Sourceisnan
isnan :: proc(x: T) -> (bool)Sourceisnormal
isnormal :: proc(x: T) -> (bool)Sourceisunordered
isunordered :: proc(x: T, y: T) -> (bool)Sourcekill_dependency
kill_dependency :: proc(value: T) -> (T)Sourcememset
memset :: proc(s: rawptr, c: int, n: size_t) -> (rawptr)Sourceto_stream
to_stream :: proc(file: ^FILE) -> (io.Stream)SourceProcedure Groups
114acos
acos :: proc{}SourceEmulate tgmath.h behavior with explicit procedure overloading here.
acosf
acosf :: proc{}SourceBut retain the 'f' suffix-variant functions as well so they can be used, a trick is used here where we use explicit procedural overloading of one procedure. This is done because the foreign block is marked @(private) and aliasing functions does not remove privateness from the entity.
acosh
acosh :: proc{}Sourceacoshf
acoshf :: proc{}Sourceasin
asin :: proc{}Sourceasinf
asinf :: proc{}Sourceasinh
asinh :: proc{}Sourceasinhf
asinhf :: proc{}Sourceatan
atan :: proc{}Sourceatan2
atan2 :: proc{}Sourceatan2f
atan2f :: proc{}Sourceatanf
atanf :: proc{}Sourceatanh
atanh :: proc{}Sourceatanhf
atanhf :: proc{}Sourcecbrt
cbrt :: proc{}Sourcecbrtf
cbrtf :: proc{}Sourceceil
ceil :: proc{}Sourceceilf
ceilf :: proc{}Sourcecopysign
copysign :: proc{}Sourcecopysignf
copysignf :: proc{}Sourcecos
cos :: proc{}Sourcecosf
cosf :: proc{}Sourcecosh
cosh :: proc{}Sourcecoshf
coshf :: proc{}Sourceerf
erf :: proc{}Sourceerfc
erfc :: proc{}Sourceerfcf
erfcf :: proc{}Sourceerff
erff :: proc{}Sourceexp
exp :: proc{}Sourceexp2
exp2 :: proc{}Sourceexp2f
exp2f :: proc{}Sourceexpf
expf :: proc{}Sourceexpm1
expm1 :: proc{}Sourceexpm1f
expm1f :: proc{}Sourcefabs
fabs :: proc{}Sourcefabsf
fabsf :: proc{}Sourcefdim
fdim :: proc{}Sourcefdimf
fdimf :: proc{}Sourcefloor
floor :: proc{}Sourcefloorf
floorf :: proc{}Sourcefma
fma :: proc{}Sourcefmaf
fmaf :: proc{}Sourcefmax
fmax :: proc{}Sourcefmaxf
fmaxf :: proc{}Sourcefmin
fmin :: proc{}Sourcefminf
fminf :: proc{}Sourcefmod
fmod :: proc{}Sourcefmodf
fmodf :: proc{}Sourcefpclassify
fpclassify :: proc{}Sourcefrexp
frexp :: proc{}Sourcefrexpf
frexpf :: proc{}Sourcehypot
hypot :: proc{}Sourcehypotf
hypotf :: proc{}Sourceilogb
ilogb :: proc{}Sourceilogbf
ilogbf :: proc{}Sourceldexp
ldexp :: proc{}Sourceldexpf
ldexpf :: proc{}Sourcelgamma
lgamma :: proc{}Sourcelgammaf
lgammaf :: proc{}Sourcellrint
llrint :: proc{}Sourcellrintf
llrintf :: proc{}Sourcellround
llround :: proc{}Sourcellroundf
llroundf :: proc{}Sourcelog
log :: proc{}Sourcelog10
log10 :: proc{}Sourcelog10f
log10f :: proc{}Sourcelog1p
log1p :: proc{}Sourcelog1pf
log1pf :: proc{}Sourcelog2
log2 :: proc{}Sourcelog2f
log2f :: proc{}Sourcelogb
logb :: proc{}Sourcelogbf
logbf :: proc{}Sourcelogf
logf :: proc{}Sourcelrint
lrint :: proc{}Sourcelrintf
lrintf :: proc{}Sourcelround
lround :: proc{}Sourcelroundf
lroundf :: proc{}Sourcemodf
modf :: proc{}Sourcemodff
modff :: proc{}Sourcenan
nan :: proc{}SourceThese two functions are special and not made type generic in tgmath.h since they only differ by their return type.
nanf
nanf :: proc{}Sourcenearbyint
nearbyint :: proc{}Sourcenearbyintf
nearbyintf :: proc{}Sourcenextafter
nextafter :: proc{}Sourcenextafterf
nextafterf :: proc{}Sourcepow
pow :: proc{}Sourcepowf
powf :: proc{}Sourceremainder
remainder :: proc{}Sourceremainderf
remainderf :: proc{}Sourceremquo
remquo :: proc{}Sourceremquof
remquof :: proc{}Sourcerint
rint :: proc{}Sourcerintf
rintf :: proc{}Sourceround
round :: proc{}Sourceroundf
roundf :: proc{}Sourcescalbln
scalbln :: proc{}Sourcescalblnf
scalblnf :: proc{}Sourcescalbn
scalbn :: proc{}Sourcescalbnf
scalbnf :: proc{}Sourcesignbit
signbit :: proc{}Sourcesin
sin :: proc{}Sourcesinf
sinf :: proc{}Sourcesinh
sinh :: proc{}Sourcesinhf
sinhf :: proc{}Sourcesqrt
sqrt :: proc{}Sourcesqrtf
sqrtf :: proc{}Sourcetan
tan :: proc{}Sourcetanf
tanf :: proc{}Sourcetanh
tanh :: proc{}Sourcetanhf
tanhf :: proc{}Sourcetgamma
tgamma :: proc{}Sourcetgammaf
tgammaf :: proc{}Sourcetrunc
trunc :: proc{}Sourcetruncf
truncf :: proc{}Source