/* vi: set sw=4 ts=4: */
/*
- * Utility routines.
+ * 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 <mjn3@opensource.lineo.com>
*
* 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
* 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 <stdio.h>
-#include <string.h>
-#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 *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;
+}