dyn_string.c
Raw
1#include <cutils/dyn_string.h>
2
3String* new_string(void)
4{
5 return string_with_capacity(STRING_DEFAULT_SIZE);
6}
7
8String* string_with_capacity(size_t capacity)
9{
10 String* string = malloc(sizeof(*string));
11 if(!string)
12 return NULL;
13 string->chars = calloc(capacity,sizeof(*string->chars));
14 if(!string->chars)
15 {
16 free(string);
17 return NULL;
18 }
19 string->length = 0;
20 string->capacity = capacity;
21
22 return string;
23}
24
25bool string_append(String* string, char character)
26{
27 return string_insert(string, string->length, character);
28}
29
30void string_remove(String* string, size_t index)
31{
32 if(index < string->length)
33 {
34 memmove(string->chars+index, string->chars+index+1, (string->length-index-1)*sizeof(*string->chars));
35 string->length--;
36 }
37}
38
39bool string_insert(String* string, size_t index, char character)
40{
41 if(index > string->length || !string_adjust_size(string, string->length))
42 return false;
43
44 memmove(string->chars+index+1, string->chars+index, (string->length-index)*sizeof(*string->chars));
45 string->chars[index] = character;
46 string->length++;
47 return true;
48}
49
50char string_at(const String* string, size_t index)
51{
52 if(index >= string->length)
53 return '\0';
54 else
55 return string->chars[index];
56}
57
58bool string_concat(String* string, const String* other)
59{
60 if(!string_adjust_size(string,string->length+other->length-1))
61 return false;
62 memcpy(string->chars+string->length,other->chars,other->length);
63 string->length += other->length;
64 return true;
65}
66
67size_t* string_find_char(const String* haystack, const char needle)
68{
69 size_t* ret;
70 for(size_t i = 0; i < haystack->length; i++)
71 {
72 if(haystack->chars[i] == needle)
73 {
74 ret = malloc(sizeof(*ret));
75 *ret = i;
76 return ret;
77 }
78 }
79 return NULL;
80}
81
82bool string_adjust_size(String* string, size_t size)
83{
84 while(string->capacity < size)
85 {
86 char* tmp = string->chars;
87 string->chars = realloc(string->chars, string->capacity*2*(sizeof(*string->chars)));
88 if(!string->chars)
89 {
90 string->chars = tmp;
91 return false;
92 }
93 string->capacity *= 2;
94 }
95 return true;
96}
97
98
99
100void delete_string(String* string)
101{
102 free(string->chars);
103 free(string);
104}
105
106String* from_cstring(const char* cstring)
107{
108 String* string = string_with_capacity(strlen(cstring));
109 if(!string)
110 {
111 return NULL;
112 } else {
113 memcpy(string->chars, cstring, strlen(cstring));
114 string->length = strlen(cstring);
115 return string;
116 }
117
118}
119
120char* to_cstring(const String* string)
121{
122 char* cstring = malloc(string->length+1);
123 memcpy(cstring, string->chars, string->length);
124 cstring[string->length] = '\0';
125
126 return cstring;
127}
128