-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcstring.c
More file actions
139 lines (107 loc) · 3.82 KB
/
Copy pathcstring.c
File metadata and controls
139 lines (107 loc) · 3.82 KB
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include "cstring.h"
#include "string.h"
#include "FreeRTOS.h"
#define malloc pvPortMalloc
#define free vPortFree
static const char terminal_char = '\0';
static const size_t terminal_char_size = sizeof(terminal_char);
static void string_grow_capacity(string_t *string, size_t size) {
if (string->capacity < (size + 1)) {
while (string->capacity < (size + 1)) string->capacity *= 2;
void *data = malloc(string->capacity);
memcpy(data, string->cstr, string->size);
free(string->cstr);
string->cstr = data;
}
}
inline static void string_add_terminal_char(string_t *string) {
string->cstr[string->size] = terminal_char;
}
string_t *string_new() {
string_t *string = malloc(sizeof(*string));
string->capacity = 0;
string->size = 0;
string->cstr = NULL;
return string;
}
string_t *string_new_from_cstr(const char *cstr) {
string_t *string = malloc(sizeof(*string));
string->size = strlen(cstr);
string->capacity = string->size + terminal_char_size;
string->cstr = malloc(string->capacity);
memcpy(string->cstr, cstr, string->capacity);
return string;
}
void string_free(string_t *string) {
free(string->cstr);
free(string);
}
int string_index_of_char_from_count(string_t *string, char ch, int start, int count) {
for (int i = start, found = 0; i < string->size; ++i) {
if (string->cstr[i] == ch) {
if (++found == count) return i;
} else {
found = 0;
}
}
return -1;
}
int string_index_of_chars_from_count(string_t *string, const char * chs, size_t size, int start, int count) {
for (int i = start, found = 0; i < string->size;) {
if (!memcmp(chs, string->cstr + i, size)) {
if (++found == count) return i;
i += size;
} else {
++i;
found = 0;
}
}
return -1;
}
int string_index_of_cstr_from_count(string_t *string, const char *cstr, int start, int count) {
return string_index_of_chars_from_count(string, cstr, strlen(cstr), start, count);
}
int string_index_of_from_count(string_t *string, const string_t *other, int start, int count) {
return string_index_of_cstr_from_count(string, other->cstr, start, count);
}
void string_insert_chars(string_t *string, int index, const char *chars, size_t size) {
string_grow_capacity(string, string->size + size);
memmove(string->cstr + index + size, string->cstr + index, string->size - index);
memcpy(string->cstr + index, chars, size);
string->size += size;
string_add_terminal_char(string);
}
void string_insert_char(string_t *string, int index, char ch) {
string_insert_chars(string, index, &ch, sizeof(ch));
}
void string_insert_cstr(string_t *string, int index, const char *cstr) {
string_insert_chars(string, index, cstr, strlen(cstr));
}
void string_insert(string_t *string, int index, string_t *other) {
string_insert_chars(string, index, other->cstr, other->size);
}
void string_clear(string_t *string) {
string->size = 0;
string_add_terminal_char(string);
}
void string_push_back_char(string_t *string, char ch) {
string_insert_char(string, string->size, ch);
}
void string_push_back_chars(string_t *string, const char *chs, size_t size) {
string_insert_chars(string, string->size, chs, size);
}
void string_push_back(string_t *string, string_t *other) {
string_insert(string, string->size, other);
}
void string_push_front_char(string_t *string, char ch) {
string_insert_char(string, 0, ch);
}
void string_push_front_chars(string_t *string, const char *chs, size_t size) {
string_insert_chars(string, 0, chs, size);
}
void string_push_front(string_t *string, string_t *other) {
string_insert(string, 0, other);
}
int string_is_empty(string_t *string) {
return string->size == 0;
}