aboutsummaryrefslogtreecommitdiff
path: root/09-september/tomcat/util/str.c
blob: 295b39036727b8c1030fbea81a603c7f7fb999aa (plain)
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);
}