1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19: #ifndef DIRNAME_H_
20: # define DIRNAME_H_ 1
21:
22: # include <stdbool.h>
23: # include <stddef.h>
24:
25: # ifndef DIRECTORY_SEPARATOR
26: # define DIRECTORY_SEPARATOR '/'
27: # endif
28:
29: # ifndef ISSLASH
30: # define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR)
31: # endif
32:
33: # ifndef FILE_SYSTEM_PREFIX_LEN
34: # if FILE_SYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX
35:
36:
37: # define _IS_DRIVE_LETTER(c) (((unsigned int) (c) | ('a' - 'A')) - 'a' \
38: <= 'z' - 'a')
39: # define FILE_SYSTEM_PREFIX_LEN(Filename) \
40: (_IS_DRIVE_LETTER ((Filename)[0]) && (Filename)[1] == ':' ? 2 : 0)
41: # else
42: # define FILE_SYSTEM_PREFIX_LEN(Filename) 0
43: # endif
44: # endif
45:
46: # ifndef FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
47: # define FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE 0
48: # endif
49:
50: # ifndef DOUBLE_SLASH_IS_DISTINCT_ROOT
51: # define DOUBLE_SLASH_IS_DISTINCT_ROOT 0
52: # endif
53:
54: # if FILE_SYSTEM_DRIVE_PREFIX_CAN_BE_RELATIVE
55: # define IS_ABSOLUTE_FILE_NAME(F) ISSLASH ((F)[FILE_SYSTEM_PREFIX_LEN (F)])
56: # else
57: # define IS_ABSOLUTE_FILE_NAME(F) \
58: (ISSLASH ((F)[0]) || 0 < FILE_SYSTEM_PREFIX_LEN (F))
59: # endif
60: # define IS_RELATIVE_FILE_NAME(F) (! IS_ABSOLUTE_FILE_NAME (F))
61:
62: char *base_name (char const *file);
63: char *dir_name (char const *file);
64: size_t base_len (char const *file);
65: size_t dir_len (char const *file);
66: char *last_component (char const *file);
67:
68: bool strip_trailing_slashes (char *file);
69:
70: #endif