-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpath_utils.h
59 lines (48 loc) · 2.65 KB
/
path_utils.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <stdbool.h>
#include "HashMap.h"
// Max length of path (excluding terminating null character).
#define MAX_PATH_LENGTH 4095
// Max length of folder name (excluding terminating null character).
#define MAX_FOLDER_NAME_LENGTH 255
bool is_subdirectory(const char *path_a, const char *path_b);
// Return whether a path is valid.
// Valid paths are '/'-separated sequences of folder names, always starting and ending with '/'.
// Valid paths have length at most MAX_PATH_LENGTH (and at least 1). Valid folder names are are
// sequences of 'a'-'z' ASCII characters, of length from 1 to MAX_FOLDER_NAME_LENGTH.
bool is_path_valid(const char *path);
// Return the subpath obtained by removing the first component.
// Args:
// - `path`: should be a valid path (see `is_path_valid`).
// - `component`: if not NULL, should be a buffer of size at least MAX_FOLDER_NAME_LENGTH + 1.
// Then the first component will be copied there (without any '/' characters).
// If path is "/", returns NULL and leaves `component` unchanged.
// Otherwise the returns a pointer into `path`, representing a valid subpath.
//
// This can be used to iterate over all components of a path:
// char component[MAX_FOLDER_NAME_LENGTH + 1];
// const char* subpath = path;
// while (subpath = split_path(subpath, component))
// printf("%s", component);
const char *split_path(const char *path, char *component);
// Return a copy of the subpath obtained by removing the last component.
// The caller should free the result, unless it is NULL.
// Args:
// - `path`: should be a valid path (see `is_path_valid`).
// - `component`: if not NULL, should be a buffer of size at least MAX_FOLDER_NAME_LENGTH + 1.
// Then the last component will be copied there (without any '/' characters).
// If path is "/", returns NULL and leaves `component` unchanged.
// Otherwise the result is a valid path.
char *make_path_to_parent(const char *path, char *component);
// Return an array containing all keys, lexicographically sorted.
// The result is null-terminated.
// Keys are not copied, they are only valid as long as the map.
// The caller should free the result.
const char **make_map_contents_array(HashMap *map);
// Return a string containing all keys in map, sorted, comma-separated.
// The result has no trailing comma. An empty map yields an empty string.
// The caller should free the result.
char *make_map_contents_string(HashMap *map);
// Return a string containing the longest common path of two given paths.
char *longest_common_path(const char *path_a, const char *path_b);
// Return the subpath obtained by removing its given prefix.
const char *remove_prefix(const char *prefix, const char *path);