%{#
#include "libc/CATS/string.cats"
%}
staload ERRNO = "libc/SATS/errno.sats"
typedef errno_t = $ERRNO.errno_t
fun strcmp (str1: !READ(string), str2: !READ(string)): int = "atslib_strcmp"
fun substrcmp
{n1,i1:nat | i1 <= n1} {n2,i2:nat | i2 <= n2}
(str1: !READ(string n1), i: size_t i1, str2: !READ(string n2), i2: size_t i2): int
= "atslib_substrcmp"
fun strncmp {n:nat}
(str1: !READ(string), str2: !READ(string), n: size_t n):<> int
= "atslib_strncmp"
fun substrncmp
{n1,i1:nat | i1 <= n1} {n2,i2:nat | i2 <= n2} {n: nat} (
str1: !READ(string n1), i1: size_t i1, str2: !READ(string n2), i2: size_t i2, n: size_t n
) :<> int = "atslib_substrncmp"
fun strlen {n:nat}
(str: !READ(string n)):<> size_t n = "#atslib_strlen"
fun strspn {n:nat}
(str: !READ(string n), accept: !READ(string)):<> sizeLte n
= "#atslib_strspn"
fun strcspn {n:nat}
(str: !READ(string n), reject: !READ(string)):<> sizeLte n
= "#atslib_strcspn"
fun strcpy
{m,n:nat | n < m} {l:addr} {ofs:int} (
pf_buf: !b0ytes m @ l >> strbuf (m, n) @ l | sbf: ptr l, str: !READ(string n)
) :<> ptr l = "#atslib_strcpy"
fun strcat
{m,n1,n2:nat | n1 + n2 < m} {l:addr} {ofs:int} (
pf_mul: MUL (n1, sizeof char, ofs)
, pf_buf: !strbuf (m, n1) @ l >> strbuf (m, n1+n2) @ l
| sbf: ptr l, str: !READ(string n2)
) :<> ptr l = "#atslib_strcat"
dataprop
strpbrk_p (l:addr, n:int, l_ret:addr) =
| {i:nat | i < n} {l_ret == l+i} strpbrk_p_some (l, n, l_ret)
| {l_ret == null} strpbrk_p_none (l, n, l_ret)
fun strpbrk {m,n:nat} {l:addr}
(pf: !strbuf (m, n) @ l | p: ptr l, accept: !READ(string))
:<> [l_ret:addr] (strpbrk_p (l, n, l_ret) | ptr l_ret)
= "atslib_strpbrk"
fun strdup_gc
{n:nat} (str: !READ(string n))
:<> [l:addr] (free_gc_v (n+1, l), strbuf (n+1, n) @ l | ptr l)
= "atslib_strdup_gc"
fun memcmp {n:nat}
{n1,n2:nat | n <= n1; n <= n2}
(buf1: &bytes n1, buf2: &bytes n2, n: size_t n):<> int
= "atslib_memcmp"
fun memcpy {n:nat}
{n1,n2:nat | n <= n1; n <= n2} {l:addr} (
pf_dst: !bytes n1 @ l | p_dst: ptr l, p_src: &bytes n2, n: size_t n
) :<> ptr l = "atslib_memcpy"
fun memset {n:nat}
{n1:nat | n <= n1} {l:addr}
(pf: !bytes n1 @ l | p: ptr l, chr: int, n: size_t n):<> ptr l
= "atslib_memset"
dataprop
memchr_p (l:addr, n:int, l_ret:addr) =
| {i:nat | i < n} {l_ret == l+i} memchr_p_some (l, n, l_ret)
| {l_ret == null} memchr_p_none (l, n, l_ret)
fun memchr {n:nat}
{n1:nat | n <= n1} {l:addr} (
pf: !bytes n1 @ l | p: ptr l, chr: int, n: size_t n
) : [l_ret:addr] (memchr_p (l, n, l_ret) | ptr l_ret)
= "atslib_memchr"
fun strerror (errno: $ERRNO.errno_t)
:<!ref> [l:agz] (strptr l -<lin,prf> void | strptr l) = "#atslib_strerror"
dataview
strerror_v (m:int, l:addr, int) =
| {n:nat} strerror_succ (m, l, 0) of strbuf (m, n) @ l
| strerror_fail (m, l, ~1) of b0ytes m @ l
fun strerror_r {m:nat} {l:addr} (
pf: b0ytes m @ l | errno: errno_t, p_buf: ptr l, m: size_t m
) : [i:int] @(strerror_v (m, l, i) | int i)
= "atslib_strerror_r"