diff --git a/libpath.c b/libpath.c index 2a710cc..ad38cc0 100644 --- a/libpath.c +++ b/libpath.c @@ -133,12 +133,12 @@ void path_free(char** path) { Creates a new path pointing to the parent. Be sure to path_free() on the base as well after use. */ -char* path_parent(const char* path) { +char* path_parent_copy(const char* path) { if (!path) { return NULL; } - char* base_path = NULL; + char* parent_path = NULL; char* clean_path = NULL; size_t path_len; size_t last_separator_index = 0; @@ -160,20 +160,53 @@ char* path_parent(const char* path) { } } + if (last_separator_index == 0) { + return clean_path; + } + // allocate memory to hold up to last separator bytes - base_path = malloc(sizeof(char) * last_separator_index); - if (!base_path) { + parent_path = malloc(sizeof(char) * last_separator_index); + if (!parent_path) { return NULL; } // copy over - memcpy(base_path, clean_path, sizeof(char) * last_separator_index); - base_path[last_separator_index] = '\0'; + memcpy(parent_path, clean_path, sizeof(char) * last_separator_index); + parent_path[last_separator_index] = '\0'; // free temporary cleaned path path_free(&clean_path); - return base_path; + return parent_path; +} + +/* +Shrinks given path so that it points to the parent. +Reallocates memory. +*/ +void path_parent(char* path) { + if (!path) { + return; + } + + path_clean(path); + + size_t path_len = strlen(path); + size_t last_separator_index = 0; + + // find the last separator index + for (size_t i = 0; i < path_len; i++) { + if (path[i] == PATH_SEPARATOR) { + last_separator_index = i; + } + } + + if (last_separator_index == 0) { + return; + } + + path = realloc(path, sizeof(char) * last_separator_index); + path[last_separator_index] = '\0'; } /* diff --git a/libpath.h b/libpath.h index 2fff3c5..360465e 100644 --- a/libpath.h +++ b/libpath.h @@ -38,7 +38,13 @@ void path_free(char** path); Creates a new path pointing to the parent. Be sure to path_free() on the base as well after use. */ -char* path_parent(const char* path); +char* path_parent_copy(const char* path); + +/* +Shrinks given path so that it points to the parent. +Reallocates memory. +*/ +void path_parent(char* path); /* Swaps Windows' path separators (\) in given path with diff --git a/test.c b/test.c index de64366..b533800 100644 --- a/test.c +++ b/test.c @@ -19,16 +19,16 @@ int main() { char* path = path_join(4, "//here", "there", "/over/there_as_well", "file.txt"); printf("Joined path: %s\n", path); - char* parent = path_parent(path); + char* parent = path_parent_copy(path); printf("Parent: %s\n", parent); path_free(&path); - char* parent_of_parent = path_parent(parent); - printf("Parent of parent: %s\n", parent_of_parent); + // becomes parent of parent + path_parent(parent); + printf("Parent of parent: %s\n", parent); path_free(&parent); - path_free(&parent_of_parent); char* windows_path = path_join(2, "C:\\Documents\\", "file.txt"); printf("Windows path: %s\n", windows_path);