Skip to content

Commit

Permalink
perf: mutate strings instead of copy when possible
Browse files Browse the repository at this point in the history
BREAKING CHANGE: Most of string functions mutates the string instead of copying now.
This allows better performance when copy is not needed.
It also allows more granual control.
If copy is wanted, simply use `string_copy` before calling the function.

Impacted functions are:
`string_to_uppercase`, `string_to_lowercase`, `string_replace`,
`string_trim_start`, `string_trim_end`, `string_trim`,
`string_capitalize`, `string_reverse`
  • Loading branch information
theoludwig committed Aug 6, 2023
1 parent 01e9b71 commit 72645da
Show file tree
Hide file tree
Showing 10 changed files with 193 additions and 222 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,9 +92,9 @@ touch main.c
#include "libcproject/libcproject.h"

int main() {
string_t string_value = "Hello, world!"; // `string_t` is a typedef from `libcproject`
printf("%s\n", string_value);
printf("string_length = %ld\n", string_get_length(string_value)); // `string_get_length` is a function from `libcproject`
string_t string = "Hello, world!"; // `string_t` is a typedef from `libcproject`
printf("%s\n", string);
printf("string_length = %ld\n", string_get_length(string)); // `string_get_length` is a function from `libcproject`
return EXIT_SUCCESS;
}
```
Expand Down
16 changes: 8 additions & 8 deletions lib/character.c
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
#include "character.h"

void character_append(string_t string_value, const char character) {
size_t length = string_get_length(string_value);
character_append_at(string_value, character, length);
void character_append(string_t string, const char character) {
size_t length = string_get_length(string);
character_append_at(string, character, length);
}

void character_append_at(string_t string_value, const char character, const size_t index) {
size_t length = string_get_length(string_value);
void character_append_at(string_t string, const char character, const size_t index) {
size_t length = string_get_length(string);
for (size_t index_string = length; index_string > index; index_string--) {
string_value[index_string] = string_value[index_string - 1];
string[index_string] = string[index_string - 1];
}
string_value[index] = character;
string_value[length + 1] = '\0';
string[index] = character;
string[length + 1] = '\0';
}

char character_to_upper(const char character) {
Expand Down
8 changes: 4 additions & 4 deletions lib/character.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,21 @@
* @brief Append a character to a string, assuming string points to an array
* with enough space.
*
* @param string_value
* @p
* @param character
* @since v1.0.0
*/
void character_append(string_t string_value, char character);
void character_append(string_t string, char character);

/**
* @brief Append a character to a string at a specific index, assuming string points to an array with enough space.
*
* @param string_value
* @param string
* @param character
* @param index
* @since v1.0.0
*/
void character_append_at(string_t string_value, const char character, const size_t index);
void character_append_at(string_t string, const char character, const size_t index);

/**
* @brief Converts the character to uppercase.
Expand Down
23 changes: 11 additions & 12 deletions lib/convert.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ char convert_digit_to_character(const char digit) {
return digit + '0';
}

long long convert_string_to_number(const string_t string_value) {
bool is_negative = string_value[0] == '-';
long long convert_string_to_number(const string_t string) {
bool is_negative = string[0] == '-';
long long integer = 0;
size_t length = string_get_length(string_value);
size_t length = string_get_length(string);
for (size_t index = is_negative ? 1 : 0; index < length; index++) {
integer = integer * 10 + convert_character_to_digit(string_value[index]);
integer = integer * 10 + convert_character_to_digit(string[index]);
}
return is_negative ? integer * -1 : integer;
}
Expand All @@ -42,23 +42,22 @@ string_t convert_number_to_string(const long long integer) {
if (is_negative) {
length++;
}
string_t string_value = malloc(sizeof(char) * length);
if (string_value == NULL) {
string_t string = malloc(sizeof(char) * length);
if (string == NULL) {
exit(EXIT_FAILURE);
}
current = mathematics_absolute_value(integer);
size_t index = 0;
while (current != 0) {
string_value[index++] = convert_digit_to_character(current % 10);
string[index++] = convert_digit_to_character(current % 10);
current = current / 10;
}
if (is_negative) {
string_value[index++] = '-';
string[index++] = '-';
}
string_value[index] = '\0';
char* result = string_reverse(string_value);
free(string_value);
return result;
string[index] = '\0';
string_reverse(string);
return string;
}

string_t convert_number_from_base_10_to_base(unsigned long long number, unsigned int base) {
Expand Down
4 changes: 2 additions & 2 deletions lib/convert.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,10 @@ char convert_digit_to_character(const char digit);
/**
* @brief Convert a string to a number.
*
* @param string_value
* @param string
* @since v1.0.0
*/
long long convert_string_to_number(const string_t string_value);
long long convert_string_to_number(const string_t string);

/**
* @brief Convert a number to a string.
Expand Down
Loading

0 comments on commit 72645da

Please sign in to comment.