Add some details on exactly how to comply with the GPL
[oweals/busybox.git] / libbb / get_last_path_component.c
index a322288a6e85e628c9cc7a09ae0c061a3e6970f9..497d6ae4ed9ea572dcff930beffcdb929df0a909 100644 (file)
@@ -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  <mjn3@codepoet.org>
  *
  * 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 *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;
+}