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