diff options
Diffstat (limited to 'libbb/get_last_path_component.c')
| -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 | } |
