X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fget_last_path_component.c;h=497d6ae4ed9ea572dcff930beffcdb929df0a909;hb=8f3eb1dbab647e0ceca33f573da68ad3f2aa7086;hp=a322288a6e85e628c9cc7a09ae0c061a3e6970f9;hpb=aad1a88c76f208d188fd061e3723bd637437e8d5;p=oweals%2Fbusybox.git diff --git a/libbb/get_last_path_component.c b/libbb/get_last_path_component.c index a322288a6..497d6ae4e 100644 --- a/libbb/get_last_path_component.c +++ b/libbb/get_last_path_component.c @@ -1,10 +1,8 @@ /* vi: set sw=4 ts=4: */ /* - * Utility routines. + * bb_get_last_path_component implementation for busybox * - * Copyright (C) tons of folks. Tracking down who wrote what - * isn't something I'm going to worry about... If you wrote something - * here, please feel free to acknowledge your work. + * Copyright (C) 2001 Manuel Novoa III * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -20,39 +18,39 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Based in part on code from sash, Copyright (c) 1999 by David I. Bell - * Permission has been granted to redistribute this code under the GPL. - * */ -#include -#include -#include "libbb.h" - +/* Set to 1 if you want basename() behavior for NULL or "". */ +/* WARNING!!! Doing so will break basename applet at least! */ +#define EMULATE_BASENAME 0 -char *get_last_path_component(char *path) +char *bb_get_last_path_component(char *path) { - char *s=path+strlen(path)-1; +#if EMULATE_BASENAME + static const char null_or_empty[] = "."; +#endif + char *first = path; + char *last; - /* strip trailing slashes */ - while (s != path && *s == '/') { - *s-- = '\0'; +#if EMULATE_BASENAME + if (!path || !*path) { + return (char *) null_or_empty; } +#endif - /* find last component */ - s = strrchr(path, '/'); - if (s == NULL || s[1] == '\0') - return path; - else - return s+1; -} + last = path - 1; + + while (*path) { + if ((*path != '/') && (path > ++last)) { + last = first = path; + } + ++path; + } + if (*first == '/') { + last = first; + } + last[1] = 0; -/* END CODE */ -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/ + return first; +}