mirror of
https://github.com/theoludwig/libcproject.git
synced 2024-11-13 23:43:13 +01:00
fix: more memory issues thanks to -fsanitize=address flag
Work In Progress #5
This commit is contained in:
parent
d345c90ba3
commit
145dfcf546
@ -123,7 +123,7 @@ struct hash_map *hash_map_initialization() {
|
|||||||
return hash_map;
|
return hash_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hash_map_add(struct hash_map *hash_map, string_t key, void *data) {
|
void hash_map_add(struct hash_map *hash_map, string_t key_value, void *data) {
|
||||||
if (hash_map->length == hash_map->capacity) {
|
if (hash_map->length == hash_map->capacity) {
|
||||||
size_t previous_capacity = hash_map->capacity;
|
size_t previous_capacity = hash_map->capacity;
|
||||||
hash_map->capacity += HASH_MAP_INITIAL_CAPACITY;
|
hash_map->capacity += HASH_MAP_INITIAL_CAPACITY;
|
||||||
@ -132,6 +132,7 @@ void hash_map_add(struct hash_map *hash_map, string_t key, void *data) {
|
|||||||
hash_map->items[index] = NULL;
|
hash_map->items[index] = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
string_t key = string_copy(key_value);
|
||||||
uint64_t hash_value = hash(key, hash_map->capacity);
|
uint64_t hash_value = hash(key, hash_map->capacity);
|
||||||
struct linked_list *list = hash_map->items[hash_value];
|
struct linked_list *list = hash_map->items[hash_value];
|
||||||
struct hash_map_item *item = malloc(sizeof(struct hash_map_item));
|
struct hash_map_item *item = malloc(sizeof(struct hash_map_item));
|
||||||
@ -156,6 +157,9 @@ void hash_map_add(struct hash_map *hash_map, string_t key, void *data) {
|
|||||||
if (!found) {
|
if (!found) {
|
||||||
linked_list_add_in_head(list, (void *)item);
|
linked_list_add_in_head(list, (void *)item);
|
||||||
hash_map->length++;
|
hash_map->length++;
|
||||||
|
} else {
|
||||||
|
free(key);
|
||||||
|
free(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -172,10 +176,13 @@ void hash_map_remove(struct hash_map *hash_map, string_t key) {
|
|||||||
struct hash_map_item *item = (struct hash_map_item *)node->data;
|
struct hash_map_item *item = (struct hash_map_item *)node->data;
|
||||||
if (!string_equals(key, item->key)) {
|
if (!string_equals(key, item->key)) {
|
||||||
linked_list_add_in_head(new_list, item);
|
linked_list_add_in_head(new_list, item);
|
||||||
|
} else {
|
||||||
|
free(item->key);
|
||||||
|
free(item);
|
||||||
}
|
}
|
||||||
node = node->next;
|
node = node->next;
|
||||||
}
|
}
|
||||||
free(list);
|
linked_list_free(list);
|
||||||
hash_map->items[hash_value] = new_list;
|
hash_map->items[hash_value] = new_list;
|
||||||
hash_map->length--;
|
hash_map->length--;
|
||||||
}
|
}
|
||||||
@ -220,10 +227,18 @@ string_t *hash_map_get_keys(struct hash_map *hash_map) {
|
|||||||
|
|
||||||
void hash_map_free(struct hash_map *hash_map) {
|
void hash_map_free(struct hash_map *hash_map) {
|
||||||
for (size_t index = 0; index < hash_map->capacity; index++) {
|
for (size_t index = 0; index < hash_map->capacity; index++) {
|
||||||
if (hash_map->items[index] != NULL) {
|
struct linked_list *list = hash_map->items[index];
|
||||||
free(hash_map->items[index]->head->data);
|
if (list != NULL) {
|
||||||
linked_list_free(hash_map->items[index]);
|
struct linked_list_node *node = list->head;
|
||||||
|
while (node != NULL) {
|
||||||
|
struct hash_map_item *item = (struct hash_map_item *)node->data;
|
||||||
|
free(item->key);
|
||||||
|
free(item);
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
linked_list_free(list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
free(hash_map->items);
|
||||||
free(hash_map);
|
free(hash_map);
|
||||||
}
|
}
|
||||||
|
38
lib/string.c
38
lib/string.c
@ -87,8 +87,9 @@ string_t string_trim_end(string_t string_value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
string_t string_trim(string_t string_value) {
|
string_t string_trim(string_t string_value) {
|
||||||
string_t result = string_trim_start(string_value);
|
string_t result_start = string_trim_start(string_value);
|
||||||
result = string_trim_end(result);
|
string_t result = string_trim_end(result_start);
|
||||||
|
free(result_start);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,16 +275,26 @@ bool string_get_has_unique_characters(const string_t string_value) {
|
|||||||
bool has_unique = true;
|
bool has_unique = true;
|
||||||
size_t string_length = string_get_length(string_value);
|
size_t string_length = string_get_length(string_value);
|
||||||
struct hash_map* characters_already_seen = hash_map_initialization();
|
struct hash_map* characters_already_seen = hash_map_initialization();
|
||||||
|
string_t* keys = malloc(sizeof(string_t) * string_length);
|
||||||
|
for (size_t index = 0; index < string_length; index++) {
|
||||||
|
keys[index] = NULL;
|
||||||
|
}
|
||||||
for (size_t index = 0; index < string_length && has_unique; index++) {
|
for (size_t index = 0; index < string_length && has_unique; index++) {
|
||||||
char character = string_value[index];
|
char character = string_value[index];
|
||||||
string_t key = convert_character_to_string(character);
|
keys[index] = convert_character_to_string(character);
|
||||||
|
string_t key = keys[index];
|
||||||
if (hash_map_contains_key(characters_already_seen, key)) {
|
if (hash_map_contains_key(characters_already_seen, key)) {
|
||||||
has_unique = false;
|
has_unique = false;
|
||||||
free(key);
|
|
||||||
} else {
|
} else {
|
||||||
hash_map_add(characters_already_seen, key, (void*)true);
|
hash_map_add(characters_already_seen, key, (void*)true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for (size_t index = 0; index < string_length; index++) {
|
||||||
|
if (keys[index] != NULL) {
|
||||||
|
free(keys[index]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(keys);
|
||||||
hash_map_free(characters_already_seen);
|
hash_map_free(characters_already_seen);
|
||||||
return has_unique;
|
return has_unique;
|
||||||
}
|
}
|
||||||
@ -315,10 +326,12 @@ bool string_get_is_substring(const string_t string_value, const string_t substri
|
|||||||
}
|
}
|
||||||
|
|
||||||
string_t string_get_formatted_number(const long long number, string_t separator) {
|
string_t string_get_formatted_number(const long long number, string_t separator) {
|
||||||
string_t number_string = convert_number_to_string(number);
|
string_t number_string_temp = convert_number_to_string(number);
|
||||||
bool is_negative = number_string[0] == '-';
|
string_t number_string = number_string_temp;
|
||||||
|
bool is_negative = number_string_temp[0] == '-';
|
||||||
if (is_negative) {
|
if (is_negative) {
|
||||||
number_string = string_substring(number_string, 1, string_get_length(number_string));
|
number_string = string_substring(number_string_temp, 1, string_get_length(number_string_temp));
|
||||||
|
free(number_string_temp);
|
||||||
}
|
}
|
||||||
size_t number_string_length = string_get_length(number_string);
|
size_t number_string_length = string_get_length(number_string);
|
||||||
size_t formatted_length = number_string_length + (number_string_length - 1) / 3;
|
size_t formatted_length = number_string_length + (number_string_length - 1) / 3;
|
||||||
@ -343,11 +356,16 @@ string_t string_get_formatted_number(const long long number, string_t separator)
|
|||||||
}
|
}
|
||||||
free(number_string);
|
free(number_string);
|
||||||
result[formatted_length] = '\0';
|
result[formatted_length] = '\0';
|
||||||
result = string_reverse(result);
|
string_t new_result = string_reverse(result);
|
||||||
|
free(result);
|
||||||
if (is_negative) {
|
if (is_negative) {
|
||||||
result = string_concatenate(convert_character_to_string('-'), result);
|
string_t dash = convert_character_to_string('-');
|
||||||
|
string_t negative_result = string_concatenate(dash, new_result);
|
||||||
|
free(new_result);
|
||||||
|
free(dash);
|
||||||
|
return negative_result;
|
||||||
}
|
}
|
||||||
return result;
|
return new_result;
|
||||||
}
|
}
|
||||||
|
|
||||||
string_t string_get_last_occurence_of_character(const string_t string_value, char character) {
|
string_t string_get_last_occurence_of_character(const string_t string_value, char character) {
|
||||||
|
Loading…
Reference in New Issue
Block a user