diff options
author | Slendi <slendi@socopon.com> | 2024-01-14 15:09:56 +0200 |
---|---|---|
committer | Slendi <slendi@socopon.com> | 2024-01-14 15:09:56 +0200 |
commit | 5b1f02799f851f630d56f4d70b455bbc15eb6b36 (patch) | |
tree | 81c4b6b6801ad003d02f9afdae1116bf4c5eca4f | |
parent | 4f37633315177d340cd7876df6c812377a178504 (diff) |
Fix bug in string list iteration
Signed-off-by: Slendi <slendi@socopon.com>
-rw-r--r-- | cbuild_impl.c | 30 | ||||
-rwxr-xr-x | test_project/build.c | 3 |
2 files changed, 22 insertions, 11 deletions
diff --git a/cbuild_impl.c b/cbuild_impl.c index 99fd050..cefd00b 100644 --- a/cbuild_impl.c +++ b/cbuild_impl.c @@ -303,8 +303,8 @@ void build(project_t build) { bool find_sources_in_directory(char *pattern, char *directory, char **sources) { int strlen_directory = strlen(directory); - char *sources_buffer = malloc(1); - size_t sources_buffer_size = 1; + char *sources_buffer = NULL; + size_t sources_buffer_size = 0; struct dirent *entry; regex_t reg; @@ -320,20 +320,30 @@ bool find_sources_in_directory(char *pattern, char *directory, char **sources) { } while ((entry = readdir(d))) { if (!regexec(®, entry->d_name, 0, NULL, 0)) { + printf("found: %s\n", entry->d_name); size_t len = strlen(entry->d_name); - sources_buffer = realloc(sources_buffer, sources_buffer_size + len + 2 + - strlen_directory + 1); - strcpy(sources_buffer + sources_buffer_size - 1, directory); - sources_buffer[sources_buffer_size + strlen_directory - 1] = '/'; - strcpy(sources_buffer + sources_buffer_size + strlen_directory, + size_t new_size = sources_buffer_size + len + 2 + strlen_directory + 1; + + sources_buffer = realloc(sources_buffer, new_size); + + if (sources_buffer == NULL) { + fprintf(stderr, "Memory allocation error\n"); + closedir(d); + regfree(®); + return false; + } + + strcpy(sources_buffer + sources_buffer_size, directory); + sources_buffer[sources_buffer_size + strlen_directory] = '/'; + strcpy(sources_buffer + sources_buffer_size + strlen_directory + 1, entry->d_name); - sources_buffer[sources_buffer_size + strlen_directory + len] = '\0'; - sources_buffer[sources_buffer_size + strlen_directory + len + 1] = '\0'; - sources_buffer_size += len + 2 + strlen_directory + 1; + + sources_buffer_size = new_size; } } closedir(d); regfree(®); + *sources = sources_buffer; return true; } diff --git a/test_project/build.c b/test_project/build.c index 0a8433e..a2ff2be 100755 --- a/test_project/build.c +++ b/test_project/build.c @@ -15,7 +15,8 @@ int main(int argc, char **argv) { exit(1); } fprintf(stderr, "Sources: \n"); - for (int offset = 0; sources[offset] != '\0'; offset += strlen(sources) + 1) { + for (int offset = 0; sources[offset] != '\0'; + offset += strlen(sources + offset) + 1) { fprintf(stderr, " - %s\n", sources + offset); } executable_t exe = |