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
111
112
113
114
115
116
117
118
119
120
121
|
#include "str.h"
#include <string.h>
#include <stdlib.h>
/* Note, we add always 1 to length for the \0 character */
static void string_check_for_expand( String *string_, unsigned int length )
{
if(string_->length + length >= string_->allocated_length)
{
string_->allocated_length = string_->length + length + 1;
string_->data = realloc(string_->data, string_->allocated_length * sizeof(char) );
}
}
String *string_create( const char *init )
{
String *str;
if(init == NULL || *init == '\0')
{
str = string_create_by_size(1);
}
else
{
unsigned int len = strlen(init);
str = string_create_by_size(len + 1);
string_append(str, init);
}
return str;
}
String *string_create_by_size( unsigned int reserved_size)
{
String *str = malloc( sizeof(String) );
str->data = NULL;
str->length = 0;
str->allocated_length = 0;
string_check_for_expand(str, reserved_size);
str->data[0] = 0;
return str;
}
void string_assign( String *string_, const char *val )
{
}
void string_append( String *string_, const char *val )
{
string_insert(string_, string_->length, val);
}
void string_append_char( String *string_, char c )
{
string_insert(string_, string_->length, &c);
}
void string_insert( String *string_, int index, const char *val)
{
if(index > string_->length)
return;
unsigned int length = strlen(val);
string_check_for_expand(string_, length);
if(index == string_->length - 1)
{
strcpy(string_->data + string_->length, val);
}
else
{
memmove(string_->data + index + length,
string_->data + index,
(string_->length - index) * sizeof(char) );
memcpy(string_->data + index, val, length * sizeof(char) );
}
string_->length += length;
string_->data[string_->length] = '\0';
}
void string_insert_char( String *string_, int index, char val)
{
string_insert(string_, index, &val);
}
void string_free( String *string_ )
{
if(string_)
{
free(string_->data);
free(string_);
}
}
unsigned int string_hash( String *string_ )
{
unsigned int hash, i;
for(hash = i = 0; i < string_->length; ++i)
{
hash += string_->data[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
return hash;
}
bool string_equal( String *a, String *b )
{
return !strcmp(a->data, b->data);
}
|