diff options
Diffstat (limited to '')
-rw-r--r-- | libbb/get_last_path_component.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/libbb/get_last_path_component.c b/libbb/get_last_path_component.c index 04fdf2a3e..46a87d7fc 100644 --- a/libbb/get_last_path_component.c +++ b/libbb/get_last_path_component.c | |||
@@ -10,12 +10,34 @@ | |||
10 | 10 | ||
11 | const char* FAST_FUNC bb_basename(const char *name) | 11 | const char* FAST_FUNC bb_basename(const char *name) |
12 | { | 12 | { |
13 | #if ENABLE_PLATFORM_MINGW32 | ||
14 | const char *cp; | ||
15 | for (cp = name; *cp; cp++) | ||
16 | if (*cp == '/' || *cp == '\\' || *cp == ':') | ||
17 | name = cp + 1; | ||
18 | #else | ||
13 | const char *cp = strrchr(name, '/'); | 19 | const char *cp = strrchr(name, '/'); |
14 | if (cp) | 20 | if (cp) |
15 | return cp + 1; | 21 | return cp + 1; |
22 | #endif | ||
16 | return name; | 23 | return name; |
17 | } | 24 | } |
18 | 25 | ||
26 | #if ENABLE_PLATFORM_MINGW32 | ||
27 | char * FAST_FUNC get_last_slash(const char *path) | ||
28 | { | ||
29 | const char *start = path + root_len(path); | ||
30 | char *slash = strrchr(start, '/'); | ||
31 | char *bslash = strrchr(start, '\\'); | ||
32 | |||
33 | if (slash && bslash) | ||
34 | slash = MAX(slash, bslash); | ||
35 | else if (!slash) | ||
36 | slash = bslash; | ||
37 | return slash; | ||
38 | } | ||
39 | #endif | ||
40 | |||
19 | /* | 41 | /* |
20 | * "/" -> "/" | 42 | * "/" -> "/" |
21 | * "abc" -> "abc" | 43 | * "abc" -> "abc" |
@@ -24,10 +46,20 @@ const char* FAST_FUNC bb_basename(const char *name) | |||
24 | */ | 46 | */ |
25 | char* FAST_FUNC bb_get_last_path_component_nostrip(const char *path) | 47 | char* FAST_FUNC bb_get_last_path_component_nostrip(const char *path) |
26 | { | 48 | { |
49 | #if ENABLE_PLATFORM_MINGW32 | ||
50 | const char *start = path + root_len(path); | ||
51 | char *slash = get_last_slash(path); | ||
52 | |||
53 | if (!slash && has_dos_drive_prefix(path) && path[2] != '\0') | ||
54 | return (char *)path + 2; | ||
55 | if (!slash || (slash == start && !slash[1])) | ||
56 | return (char*)path; | ||
57 | #else | ||
27 | char *slash = strrchr(path, '/'); | 58 | char *slash = strrchr(path, '/'); |
28 | 59 | ||
29 | if (!slash || (slash == path && !slash[1])) | 60 | if (!slash || (slash == path && !slash[1])) |
30 | return (char*)path; | 61 | return (char*)path; |
62 | #endif | ||
31 | 63 | ||
32 | return slash + 1; | 64 | return slash + 1; |
33 | } | 65 | } |
@@ -40,11 +72,20 @@ char* FAST_FUNC bb_get_last_path_component_nostrip(const char *path) | |||
40 | */ | 72 | */ |
41 | char* FAST_FUNC bb_get_last_path_component_strip(char *path) | 73 | char* FAST_FUNC bb_get_last_path_component_strip(char *path) |
42 | { | 74 | { |
75 | #if ENABLE_PLATFORM_MINGW32 | ||
76 | char *slash = last_char_is_dir_sep(path); | ||
77 | const char *start = has_dos_drive_prefix(path) ? path+2 : path; | ||
78 | |||
79 | if (slash) | ||
80 | while (is_dir_sep(*slash) && slash != start) | ||
81 | *slash-- = '\0'; | ||
82 | #else | ||
43 | char *slash = last_char_is(path, '/'); | 83 | char *slash = last_char_is(path, '/'); |
44 | 84 | ||
45 | if (slash) | 85 | if (slash) |
46 | while (*slash == '/' && slash != path) | 86 | while (*slash == '/' && slash != path) |
47 | *slash-- = '\0'; | 87 | *slash-- = '\0'; |
88 | #endif | ||
48 | 89 | ||
49 | return bb_get_last_path_component_nostrip(path); | 90 | return bb_get_last_path_component_nostrip(path); |
50 | } | 91 | } |