diff --git a/2023/1/2.c b/2023/1/2.c index 62335dd..23139b7 100644 --- a/2023/1/2.c +++ b/2023/1/2.c @@ -1,3 +1,5 @@ +#include "../../util.h" + #include #include #include @@ -7,28 +9,6 @@ typedef struct { char* value; } number; -void replace(char *target, const char *needle, const char *replacement) -{ - char buffer[1024] = { 0 }; - char *insert_point = &buffer[0]; - const char *tmp = target; - size_t needle_len = strlen(needle); - size_t repl_len = strlen(replacement); - while (1) { - const char *p = strstr(tmp, needle); - if (p == NULL) { // walked past last occurrence of needle; copy remaining part - strcpy(insert_point, tmp); - break; - } - memcpy(insert_point, tmp, p - tmp); // copy part before needle - insert_point += p - tmp; - memcpy(insert_point, replacement, repl_len); // copy replacement string - insert_point += repl_len; - tmp = p + needle_len; - } - strcpy(target, buffer); -} - int main() { FILE *inputfile = fopen("./input", "r"); char *line = malloc(sizeof(char) * 100); diff --git a/2023/2/1.c b/2023/2/1.c index 6937989..920465d 100644 --- a/2023/2/1.c +++ b/2023/2/1.c @@ -1,3 +1,5 @@ +#include "../../util.h" + #include #include #include @@ -10,72 +12,6 @@ typedef struct { int colors[3]; } game; -char** str_split(char* a_str, const char a_delim) -{ - char** result = 0; - size_t count = 0; - char* tmp = a_str; - char* last_comma = 0; - char delim[2]; - delim[0] = a_delim; - delim[1] = 0; - /* Count how many elements will be extracted. */ - while (*tmp) - { - if (a_delim == *tmp) - { - count++; - last_comma = tmp; - } - tmp++; - } - /* Add space for trailing token. */ - count += last_comma < (a_str + strlen(a_str) - 1); - /* Add space for terminating null string so caller - knows where the list of returned strings ends. */ - count++; - result = malloc(sizeof(char*) * count); - if (result) - { - size_t idx = 0; - char* token = strtok(a_str, delim); - while (token) - { - assert(idx < count); - *(result + idx++) = strdup(token); - token = strtok(0, delim); - } - assert(idx == count - 1); - *(result + idx) = 0; - } - return result; -} - -// Note: This function returns a pointer to a substring of the original string. -// If the given string was allocated dynamically, the caller must not overwrite -// that pointer with the returned value, since the original pointer must be -// deallocated using the same allocator with which it was allocated. The return -// value must NOT be deallocated using free() etc. -char *trimwhitespace(char *str) -{ - char *end; - - // Trim leading space - while(isspace((unsigned char)*str)) str++; - - if(*str == 0) // All spaces? - return str; - - // Trim trailing space - end = str + strlen(str) - 1; - while(end > str && isspace((unsigned char)*end)) end--; - - // Write new null terminator character - end[1] = '\0'; - - return str; -} - int main() { FILE *inputfile = fopen("./input", "r"); char line[1024] = { 0 }; diff --git a/2023/2/2.c b/2023/2/2.c index 68f195f..30d7021 100644 --- a/2023/2/2.c +++ b/2023/2/2.c @@ -1,3 +1,5 @@ +#include "../../util.h" + #include #include #include @@ -9,72 +11,6 @@ typedef struct { int colors[3]; } game; -char** str_split(char* a_str, const char a_delim) -{ - char** result = 0; - size_t count = 0; - char* tmp = a_str; - char* last_comma = 0; - char delim[2]; - delim[0] = a_delim; - delim[1] = 0; - /* Count how many elements will be extracted. */ - while (*tmp) - { - if (a_delim == *tmp) - { - count++; - last_comma = tmp; - } - tmp++; - } - /* Add space for trailing token. */ - count += last_comma < (a_str + strlen(a_str) - 1); - /* Add space for terminating null string so caller - knows where the list of returned strings ends. */ - count++; - result = malloc(sizeof(char*) * count); - if (result) - { - size_t idx = 0; - char* token = strtok(a_str, delim); - while (token) - { - assert(idx < count); - *(result + idx++) = strdup(token); - token = strtok(0, delim); - } - assert(idx == count - 1); - *(result + idx) = 0; - } - return result; -} - -// Note: This function returns a pointer to a substring of the original string. -// If the given string was allocated dynamically, the caller must not overwrite -// that pointer with the returned value, since the original pointer must be -// deallocated using the same allocator with which it was allocated. The return -// value must NOT be deallocated using free() etc. -char *trimwhitespace(char *str) -{ - char *end; - - // Trim leading space - while(isspace((unsigned char)*str)) str++; - - if(*str == 0) // All spaces? - return str; - - // Trim trailing space - end = str + strlen(str) - 1; - while(end > str && isspace((unsigned char)*end)) end--; - - // Write new null terminator character - end[1] = '\0'; - - return str; -} - int main() { FILE *inputfile = fopen("./input", "r"); char line[1024] = { 0 }; diff --git a/2023/4/1.c b/2023/4/1.c index 0b0ac50..a04ff44 100644 --- a/2023/4/1.c +++ b/2023/4/1.c @@ -1,3 +1,5 @@ +#include "../../util.h" + #include #include #include @@ -5,72 +7,6 @@ #include #include -char** str_split(char* a_str, const char a_delim) -{ - char** result = 0; - size_t count = 0; - char* tmp = a_str; - char* last_comma = 0; - char delim[2]; - delim[0] = a_delim; - delim[1] = 0; - /* Count how many elements will be extracted. */ - while (*tmp) - { - if (a_delim == *tmp) - { - count++; - last_comma = tmp; - } - tmp++; - } - /* Add space for trailing token. */ - count += last_comma < (a_str + strlen(a_str) - 1); - /* Add space for terminating null string so caller - knows where the list of returned strings ends. */ - count++; - result = malloc(sizeof(char*) * count); - if (result) - { - size_t idx = 0; - char* token = strtok(a_str, delim); - while (token) - { - assert(idx < count); - *(result + idx++) = strdup(token); - token = strtok(0, delim); - } - assert(idx == count - 1); - *(result + idx) = 0; - } - return result; -} - -// Note: This function returns a pointer to a substring of the original string. -// If the given string was allocated dynamically, the caller must not overwrite -// that pointer with the returned value, since the original pointer must be -// deallocated using the same allocator with which it was allocated. The return -// value must NOT be deallocated using free() etc. -char *trimwhitespace(char *str) -{ - char *end; - - // Trim leading space - while(isspace((unsigned char)*str)) str++; - - if(*str == 0) // All spaces? - return str; - - // Trim trailing space - end = str + strlen(str) - 1; - while(end > str && isspace((unsigned char)*end)) end--; - - // Write new null terminator character - end[1] = '\0'; - - return str; -} - int main() { FILE *inputfile = fopen("./input", "r"); char line[2048] = { 0 }; diff --git a/lib/util.c b/lib/util.c index 7389d9c..8e27738 100644 --- a/lib/util.c +++ b/lib/util.c @@ -64,3 +64,25 @@ char *trimwhitespace(char *str) end[1] = '\0'; return str; } + +void replace(char *target, const char *needle, const char *replacement) +{ + char buffer[1024] = { 0 }; + char *insert_point = &buffer[0]; + const char *tmp = target; + size_t needle_len = strlen(needle); + size_t repl_len = strlen(replacement); + while (1) { + const char *p = strstr(tmp, needle); + if (p == NULL) { // walked past last occurrence of needle; copy remaining part + strcpy(insert_point, tmp); + break; + } + memcpy(insert_point, tmp, p - tmp); // copy part before needle + insert_point += p - tmp; + memcpy(insert_point, replacement, repl_len); // copy replacement string + insert_point += repl_len; + tmp = p + needle_len; + } + strcpy(target, buffer); +} diff --git a/lib/util.h b/lib/util.h index 1e83966..80f8e32 100644 --- a/lib/util.h +++ b/lib/util.h @@ -1,4 +1,3 @@ - char** str_split(char* a_str, const char a_delim); char* trimwhitespace(char *str); - +void replace(char *target, const char *needle, const char *replacement);