Browse Source

Added path_parent and reworked path_parent_copy

master
parent
commit
09cee892a7
  1. 47
      libpath.c
  2. 8
      libpath.h
  3. 8
      test.c

47
libpath.c

@ -133,12 +133,12 @@ void path_free(char** path) {
Creates a new path pointing to the parent. Creates a new path pointing to the parent.
Be sure to path_free() on the base as well after use. 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) { if (!path) {
return NULL; return NULL;
} }
char* base_path = NULL; char* parent_path = NULL;
char* clean_path = NULL; char* clean_path = NULL;
size_t path_len; size_t path_len;
size_t last_separator_index = 0; 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 // allocate memory to hold up to last separator bytes
base_path = malloc(sizeof(char) * last_separator_index); parent_path = malloc(sizeof(char) * last_separator_index);
if (!base_path) { if (!parent_path) {
return NULL; return NULL;
} }
// copy over // copy over
memcpy(base_path, clean_path, sizeof(char) * last_separator_index); memcpy(parent_path, clean_path, sizeof(char) * last_separator_index);
base_path[last_separator_index] = '\0'; parent_path[last_separator_index] = '\0';
// free temporary cleaned path // free temporary cleaned path
path_free(&clean_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';
} }
/* /*

8
libpath.h

@ -38,7 +38,13 @@ void path_free(char** path);
Creates a new path pointing to the parent. Creates a new path pointing to the parent.
Be sure to path_free() on the base as well after use. 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 Swaps Windows' path separators (\) in given path with

8
test.c

@ -19,16 +19,16 @@ int main() {
char* path = path_join(4, "//here", "there", "/over/there_as_well", "file.txt"); char* path = path_join(4, "//here", "there", "/over/there_as_well", "file.txt");
printf("Joined path: %s\n", path); printf("Joined path: %s\n", path);
char* parent = path_parent(path); char* parent = path_parent_copy(path);
printf("Parent: %s\n", parent); printf("Parent: %s\n", parent);
path_free(&path); path_free(&path);
char* parent_of_parent = path_parent(parent); // becomes parent of parent
printf("Parent of parent: %s\n", parent_of_parent); path_parent(parent);
printf("Parent of parent: %s\n", parent);
path_free(&parent); path_free(&parent);
path_free(&parent_of_parent);
char* windows_path = path_join(2, "C:\\Documents\\", "file.txt"); char* windows_path = path_join(2, "C:\\Documents\\", "file.txt");
printf("Windows path: %s\n", windows_path); printf("Windows path: %s\n", windows_path);

Loading…
Cancel
Save