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 size_t i;
71 for(i = 0; i < haystack->length; i++)
72 {
73 if(haystack->chars[i] == needle)
74 {
75 ret = malloc(sizeof(*ret));
76 *ret = i;
77 return ret;
78 }
79 }
80 return NULL;
81}
82
83bool string_adjust_size(String* string, size_t size)
84{
85 while(string->capacity < size)
86 {
87 char* tmp = string->chars;
88 string->chars = realloc(string->chars, string->capacity*2*(sizeof(*string->chars)));
89 if(!string->chars)
90 {
91 string->chars = tmp;
92 return false;
93 }
94 string->capacity *= 2;
95 }
96 return true;
97}
98
99
100
101void delete_string(String* string)
102{
103 free(string->chars);
104 free(string);
105}
106
107String* from_cstring(const char* cstring)
108{
109 String* string = string_with_capacity(strlen(cstring));
110 if(!string)
111 {
112 return NULL;
113 } else {
114 memcpy(string->chars, cstring, strlen(cstring));
115 string->length = strlen(cstring);
116 return string;
117 }
118
119}
120
121char* to_cstring(const String* string)
122{
123 char* cstring = malloc(string->length+1);
124 memcpy(cstring, string->chars, string->length);
125 cstring[string->length] = '\0';
126
127 return cstring;
128}
129