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
|
#include "buff.h"
static lsp_status_t update_str(lsp_buff_t *b) {
lsp_uint16_t value_len =
((b->value == b->m->nil) ? 0 : lsp_mem_get_string_len(b->m, b->value));
lsp_addr_t value;
lsp_status_t status =
lsp_mem_create_string(b->m, value_len + b->buff_len, &value);
if (status != LSP_SUCCESS)
return status;
for (lsp_uint16_t i = 0; i < value_len; ++i)
lsp_mem_set_string_data(b->m, value, i,
lsp_mem_get_string_data(b->m, b->value, i));
for (lsp_uint16_t i = 0; i < b->buff_len; ++i)
lsp_mem_set_string_data(b->m, value, i + value_len, b->buff[i]);
lsp_mem_dec_ref(b->m, b->value);
b->value = value;
b->buff_len = 0;
return LSP_SUCCESS;
}
void lsp_buff_init(lsp_buff_t *b, lsp_mem_t *m) {
b->m = m;
b->value = m->nil;
b->buff_len = 0;
}
lsp_status_t lsp_buff_push(lsp_buff_t *b, lsp_uint8_t c) {
if (b->buff_len + 1 >= LSP_BUFF_SIZE) {
lsp_status_t status = update_str(b);
if (status != LSP_SUCCESS)
return status;
}
b->buff[b->buff_len++] = c;
return LSP_SUCCESS;
}
lsp_status_t lsp_buff_pop(lsp_buff_t *b, lsp_addr_t *value) {
lsp_status_t status = update_str(b);
if (status != LSP_SUCCESS)
return status;
*value = b->value;
b->value = b->m->nil;
return LSP_SUCCESS;
}
void lsp_buff_clear(lsp_buff_t *b) {
lsp_mem_dec_ref(b->m, b->value);
b->value = b->m->nil;
}
|