-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathdynamic_string.c
110 lines (82 loc) · 2.02 KB
/
dynamic_string.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/**
* Project: Implementace překladače imperativního jazyka IFJ17.
*
* @brief Dynamic string.
*
* @author Timotej Halás <xhalas10@stud.fit.vutbr.cz>
* @author Dominik Harmim <xharmi00@stud.fit.vutbr.cz>
*/
#include <stdlib.h>
#include <string.h>
#include "dynamic_string.h"
#define DYNAMIC_STRING_LEN_INC 8 /// Inicialization lenght of string.
void dynamic_string_clear(Dynamic_string *s)
{
s->length = 0;
s->str[s->length] = '\0';
}
bool dynamic_string_init(Dynamic_string *s)
{
if (!(s->str = (char *) malloc(DYNAMIC_STRING_LEN_INC)))
{
return false;
}
dynamic_string_clear(s);
s->alloc_size = DYNAMIC_STRING_LEN_INC;
return true;
}
void dynamic_string_free(Dynamic_string *s)
{
free(s->str);
}
bool dynamic_string_add_char(Dynamic_string *s, char c)
{
if (s->length + 1 >= s->alloc_size)
{
unsigned int new_size = s->length + DYNAMIC_STRING_LEN_INC;
if (!(s->str = (char *) realloc(s->str, new_size)))
{
return false;
}
s->alloc_size = new_size;
}
s->str[s->length++] = c;
s->str[s->length] = '\0';
return true;
}
bool dynamic_string_add_const_str(Dynamic_string *s, const char *const_string)
{
unsigned int const_str_length = (unsigned int) strlen(const_string);
if (s->length + const_str_length + 1 >= s->alloc_size)
{
unsigned int new_size = s->length + const_str_length + 1;
if (!(s->str = (char *) realloc(s->str, new_size)))
{
return false;
}
s->alloc_size = new_size;
}
s->length += const_str_length;
strcat(s->str, const_string);
s->str[s->length] = '\0';
return true;
}
int dynamic_string_cmp_const_str(Dynamic_string *dynamic_string, const char *const_string)
{
return strcmp(dynamic_string->str, const_string);
}
bool dynamic_string_copy(Dynamic_string *src, Dynamic_string *dest)
{
unsigned int new_length = src->length;
if (new_length >= dest->alloc_size)
{
if (!(dest->str = (char *) realloc(dest->str, new_length + 1)))
{
return false;
}
dest->alloc_size = new_length + 1;
}
strcpy(dest->str, src->str);
dest->length = new_length;
return true;
}