forked from xlq/aos
-
Notifications
You must be signed in to change notification settings - Fork 0
/
bounded_strings.sats
68 lines (53 loc) · 1.96 KB
/
bounded_strings.sats
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// Bounded-length strings: strings in fixed-length buffers.
// Note that the buffer must be at least one byte long, for
// the null terminator.
staload "prelude/limits.sats"
staload Streams = "streams.sats"
absviewt@ype bstring (l: addr, sz: int, len: int) = @( ptr, int )
(*
fun create {l: agz} {sz: Pos}
(s: &bstring (l, sz, 0)? >> bstring (l, sz, 0),
pf: (@[char][sz]) @ l,
buf: ptr l,
sz: int sz):<> void
*)
fun create {l: agz} {sz: Pos}
(pf: @[char][sz] @ l |
buf: ptr l, sz: int sz):<>
bstring (l, sz, 0)
fun destroy {l: agz} {sz: Nat} {len: int}
(s: &bstring (l, sz, len) >> bstring (l, sz, len)?):<>
(@[char][sz] @ l | void)
fun length {l: agz; sz: Nat; len: nat}
(s: &bstring (l, sz, len)):<> int len
fun clear {l: agz; sz: Nat; len: nat}
(s: &bstring (l, sz, len) >> bstring (l, sz, 0)):<> void
fun char_at {l: agz; sz: Nat; len, idx: nat | idx < len}
(s: &bstring (l, sz, len), idx: int idx):<> char
overload [] with char_at
fun set_char_at {l: agz; sz: Nat; len, idx: nat | idx < len}
(s: &bstring (l, sz, len), idx: int idx, ch: char):<> void
overload [] with set_char_at
fun append_char {l: agz} {sz: Nat} {len: nat | len < sz-1}
(s: &bstring (l, sz, len) >> bstring (l, sz, len+1),
ch: char):<> void
fun append_string
{l: agz; sz: Nat; len: nat | len < sz;
len2: nat | len + len2 < sz}
(s: &bstring (l, sz, len) >> bstring (l, sz, len+len2),
s2: string len2,
len2: int len2):<> void
fun append_bstring
{l: agz; sz: Nat; len: nat | len < sz;
l2: agz; sz2: Nat; len2: nat | len + len2 < sz}
(s: &bstring (l, sz, len) >> bstring (l, sz, len+len2),
s2: &bstring (l2, sz2, len2)):<> void
absviewtype stream_vt (l: addr, sz: int, p: addr)
fun stream
{p, l: agz; sz: Nat; len: nat | len < sz}
(pf: bstring (l, sz, len) @ p | p: ptr p):<>
$Streams.stream (stream_vt (l, sz, p))
prfun unstream
{p, l: agz; sz: Nat}
(stream: $Streams.stream (stream_vt (l, sz, p))):<>
[len: nat | len < sz] bstring (l, sz, len) @ p