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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
#include "common.h"
#include "dynstr.h"
dynstr_t* dynstr_new(void)
{
dynstr_t* str = calloc(1, sizeof(dynstr_t));
if (str)
{
str->size = 64;
str->data = malloc(str->size);
if (!str->data)
{
free(str);
return NULL;
}
}
return str;
}
dynstr_t* dynstr_new_strn(const char* cstr, size_t len)
{
dynstr_t* str = calloc(1, sizeof(dynstr_t));
assert(cstr);
if (str)
{
str->len = len;
str->size = len + 1;
str->data = malloc(str->size);
if (!str->data)
{
free(str);
return NULL;
}
memcpy(str->data, cstr, len);
}
return str;
}
void dynstr_free(dynstr_t* str)
{
if (str)
{
free(str->data);
free(str);
}
}
char* dynstr_done(dynstr_t* str)
{
char* ret;
assert(str);
assert(str->len < str->size);
str->data[str->len] = '\0';
ret = str->data;
free(str);
return ret;
}
const char* dynstr_peek(dynstr_t* str)
{
assert(str);
assert(str->len < str->size);
str->data[str->len] = '\0';
return str->data;
}
bool dynstr_nappend(dynstr_t* str, const char* add, size_t len)
{
assert(str && add);
if (str->len + len >= str->size)
{
size_t ns = MAX(str->size * 2, str->len + len + 1);
char* tmp = realloc(str->data, ns);
if (!tmp)
{
return false;
}
str->data = tmp;
str->size = ns;
}
memcpy(str->data + str->len, add, len);
str->len += len;
return true;
}
void dynstr_cut(dynstr_t* str, size_t newlen)
{
assert(str);
assert(newlen <= str->len);
if (newlen < str->len)
{
str->len = newlen;
}
}
|