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.
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';
}
/*

8
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

8
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);

Loading…
Cancel
Save