diff --git a/c-programming/strings/str_replace.c b/c-programming/strings/str_replace.c index e545cbe..9a6c658 100644 --- a/c-programming/strings/str_replace.c +++ b/c-programming/strings/str_replace.c @@ -13,7 +13,8 @@ char* str_replace( const char* str, const char* substr, const char* replacement, - ssize_t max_count + size_t max_count, + bool direction ) { /* * input arguments: @@ -24,6 +25,15 @@ char* str_replace( size_t substr_len = strlen(substr), replacement_len = strlen(replacement), count = 0; + + if (direction == STR_REPLACE_DIR_BACKWARD) { + // TODO: implement replacing from the end + fprintf(stderr, "str_replace, STR_REPLACE_DIR_BACKWARD: Work in " + "progress\n"); + return str_replace(str, substr, replacement, max_count, + STR_REPLACE_DIR_FORWARD); + } + const char* p = str; // count the number of occurrences of the substring @@ -58,16 +68,59 @@ char* str_replace( } #ifdef TEST -#include +# include +# include + +uintmax_t tests_failed = 0; + +static void func_expect( + const char* str, + const char* substr, + const char* replacement, + size_t max_count, + bool direction, + const char* expected_output +); + +static void func_expect( + const char* str, + const char* substr, + const char* replacement, + size_t max_count, + bool direction, + const char* expected_output +) { + char* result = str_replace(str, substr, replacement, max_count, direction); + if (result == NULL) { + perror("str_replace"); + exit(EXIT_FAILURE); + } + + if (strcmp(result, expected_output)) { + puts("Failed!\n"); + tests_failed++; + return; + } + + puts("Passed\n"); +} int main(void) { + func_expect("Hello; peace! This is a peaceful test.", + "; peace", + ", universe", + STR_REPLACE_ALL, + STR_REPLACE_DIR_FORWARD, + "Hello, universe! This is a peaceful test."); const char* str = "Hello; peace! This is a peaceful test.", * substr = "peace", * replacement1 = "universe", * replacement2 = "_____"; - char* result1 = str_replace(str, substr, replacement1, STR_REPLACE_ALL), - * result2 = str_replace(str, substr, replacement2, 1); + char* result1 = str_replace(str, substr, replacement1, STR_REPLACE_ALL, + STR_REPLACE_DIR_FORWARD), + * result2 = str_replace(str, substr, replacement2, 1, + STR_REPLACE_DIR_FORWARD); puts(result1); free(result1); puts(result2); free(result2); diff --git a/c-programming/strings/str_replace.h b/c-programming/strings/str_replace.h index 4cbc90f..55de70f 100644 --- a/c-programming/strings/str_replace.h +++ b/c-programming/strings/str_replace.h @@ -8,6 +8,7 @@ #ifndef _STR_REPLACE_H #define _STR_REPLACE_H +#include #include #include