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(String* string, size_t index)
21{
22 if(index < string->length)
23 {
24 memmove(string->chars+index, string->chars+index+1, (string->length-index-1)*sizeof(*string->chars));
25 string->length--;
26 }
27}
28
29bool string_insert(String* string, size_t index, char character)
30{
31 if(index > string->length || !string_adjust_size(string, string->length))
32 return false;
33
34 memmove(string->chars+index+1, string->chars+index, (string->length-index)*sizeof(*string->chars));
35 string->chars[index] = character;
36 string->length++;
37 return true;
38}
39
40char string_at(const String* string, size_t index)
41{
42 if(index >= string->length)
43 return '\0';
44 else
45 return string->chars[index];
46}
47
48char string_pop_at(String* string, size_t index)
49{
50 char tmp = string_at(string, index);
51 if(!tmp)
52 {
53 return '\0';
54 } else {
55 string_remove(string, index);
56 return tmp;
57 }
58}
59
60bool string_concat(String* string, const String* other)
61{
62 if(!string_adjust_size(string,string->length+other->length-1))
63 return false;
64 memcpy(string->chars+string->length,other->chars,other->length);
65 string->length += other->length;
66 return true;
67}
68
69size_t* string_find_char(const String* haystack, const char needle)
70{
71 size_t* ret;
72 size_t i;
73 for(i = 0; i < haystack->length; i++)
74 {
75 if(haystack->chars[i] == needle)
76 {
77 ret = malloc(sizeof(*ret));
78 *ret = i;
79 return ret;
80 }
81 }
82 return NULL;
83}
84
85bool string_adjust_size(String* string, size_t size)
86{
87 while(string->capacity < size)
88 {
89 char* tmp = string->chars;
90 string->chars = realloc(string->chars, string->capacity*2*(sizeof(*string->chars)));
91 if(!string->chars)
92 {
93 string->chars = tmp;
94 return false;
95 }
96 string->capacity *= 2;
97 }
98 return true;
99}
100
101
102void delete_string(String* string)
103{
104 free(string->chars);
105 free(string);
106}
107
108String* from_cstring(const char* cstring)
109{
110 String* string = string_with_capacity(strlen(cstring));
111 if(!string)
112 {
113 return NULL;
114 } else {
115 memcpy(string->chars, cstring, strlen(cstring));
116 string->length = strlen(cstring);
117 return string;
118 }
119
120}
121
122String* from_cstring_del(char* cstring)
123{
124 String* ret = from_cstring(cstring);
125 free(cstring);
126 return ret;
127}
128
129char* to_cstring(const String* string)
130{
131 char* cstring = malloc(string->length+1);
132 memcpy(cstring, string->chars, string->length);
133 cstring[string->length] = '\0';
134
135 return cstring;
136}
137
138char* to_cstring_del(String* string)
139{
140 char* ret = to_cstring(string);
141 delete_string(string);
142 return ret;
143}
144