dyn_string.c
Raw
1#include <cutils/dyn_string.h>
2
3String* string_with_capacity(size_t capacity)
4{
5 String* string = malloc(sizeof(*string));
6 if(!string)
7 return NULL;
8 string->chars = calloc(capacity,sizeof(*string->chars));
9 if(!string->chars)
10 {
11 free(string);
12 return NULL;
13 }
14 string->length = 0;
15 string->capacity = capacity;
16
17 return string;
18}
19
20void string_remove_range(String* string, size_t index, size_t length)
21{
22 memmove(string->chars+index, string->chars+index+length, (string->length-(index+length)));
23 string->length -= length;
24}
25
26size_t string_strip(String* string, char character)
27{
28 size_t i, last = 0, offset = 0;
29 bool first = true;
30
31 for(i = 0; i < string->length; i++)
32 {
33 if(string_at(string,i) == character)
34 {
35 if(first)
36 {
37 first = false;
38 } else {
39 memmove(string->chars+last-offset, string->chars+last+1, i-last-1);
40 offset++;
41 }
42
43 last = i;
44 }
45 }
46
47 memmove(string->chars+last-offset, string->chars+last+1, string->length-last-1);
48
49 string->length -= offset+(first ? 0 : 1);
50 return offset;
51}
52
53bool string_insert(String* string, size_t index, char character)
54{
55 if(index > string->length || string->length == SIZE_MAX || !string_adjust_size(string, string->length))
56 return false;
57
58 memmove(string->chars+index+1, string->chars+index, (string->length-index)*sizeof(*string->chars));
59 string->chars[index] = character;
60 string->length++;
61 return true;
62}
63
64char string_pop_at(String* string, size_t index)
65{
66 char tmp = string_at(string, index);
67 if(!tmp)
68 {
69 return '\0';
70 } else {
71 string_remove(string, index);
72 return tmp;
73 }
74}
75
76bool string_concat(String* string, const String* other)
77{
78 if(!string_adjust_size(string,string->length+other->length-1))
79 return false;
80 memcpy(string->chars+string->length,other->chars,other->length);
81 string->length += other->length;
82 return true;
83}
84
85bool string_find_char(const String* haystack, const char needle, size_t* pos)
86{
87 size_t i;
88
89 for(i = 0; i < haystack->length; i++)
90 {
91 if(haystack->chars[i] == needle)
92 {
93 *pos = i;
94 return true;
95 }
96 }
97 return false;
98}
99
100bool string_find_str(const String* haystack, const String* needle, size_t* pos)
101{
102 size_t i, j, tmp;
103
104 for(i = 0; i < haystack->length; i++)
105 {
106 for(j = 0, tmp = i; j < needle->length && i < haystack->length; j++, i++)
107 {
108 if(haystack->chars[i] != needle->chars[j])
109 {
110 break;
111 } else if(j == needle->length-1){
112 *pos = tmp;
113 return true;
114 }
115 }
116 }
117 return false;
118}
119
120size_t string_count(const String* string, char character)
121{
122 size_t i, ret = 0;
123 for(i = 0; i < string->length; i++)
124 {
125 if(string_at(string, i) == character)
126 ret++;
127 }
128 return ret;
129}
130
131bool string_adjust_size(String* string, size_t size)
132{
133 while(string->capacity < size)
134 {
135 char* tmp = string->chars;
136 string->chars = cutil_reallocarray_inc(string->chars, sizeof(*string->chars), string->capacity, string->capacity);
137 if(!string->chars)
138 {
139 string->chars = tmp;
140 return false;
141 }
142 string->capacity *= 2;
143 }
144 return true;
145}
146
147
148void delete_string(String* string)
149{
150 free(string->chars);
151 free(string);
152}
153
154String* from_cstring(const char* cstring)
155{
156 String* string = string_with_capacity(strlen(cstring));
157 if(!string)
158 {
159 return NULL;
160 } else {
161 memcpy(string->chars, cstring, strlen(cstring));
162 string->length = strlen(cstring);
163 return string;
164 }
165
166}
167
168String* from_cstring_del(char* cstring)
169{
170 String* ret = from_cstring(cstring);
171 free(cstring);
172 return ret;
173}
174
175char* to_cstring(const String* string)
176{
177 char* cstring = malloc(string->length+1);
178 memcpy(cstring, string->chars, string->length);
179 cstring[string->length] = '\0';
180
181 return cstring;
182}
183
184char* to_cstring_del(String* string)
185{
186 char* ret = to_cstring(string);
187 delete_string(string);
188 return ret;
189}
190