home *** CD-ROM | disk | FTP | other *** search
/ Unix System Administration Handbook 1997 October / usah_oct97.iso / gnu / tar.txt / tar-1.12 / lib / dirname.c < prev    next >
C/C++ Source or Header  |  1997-04-25  |  2KB  |  72 lines

  1. /* dirname.c -- return all but the last element in a path
  2.    Copyright (C) 1990 Free Software Foundation, Inc.
  3.  
  4.    This program is free software; you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation; either version 2, or (at your option)
  7.    any later version.
  8.  
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.  
  14.    You should have received a copy of the GNU General Public License
  15.    along with this program; if not, write to the Free Software Foundation,
  16.    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
  17.  
  18. #ifdef HAVE_CONFIG_H
  19. #include <config.h>
  20. #endif
  21.  
  22. #ifdef STDC_HEADERS
  23. # include <stdlib.h>
  24. #else
  25. char *malloc ();
  26. #endif
  27.  
  28. #if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
  29. # include <string.h>
  30. #else
  31. # include <strings.h>
  32. # ifndef strrchr
  33. #  define strrchr rindex
  34. # endif
  35. #endif
  36.  
  37. /* Return the leading directories part of PATH,
  38.    allocated with malloc.  If out of memory, return 0.
  39.    Assumes that trailing slashes have already been
  40.    removed.  */
  41.  
  42. char *
  43. dirname (path)
  44.      char *path;
  45. {
  46.   char *newpath;
  47.   char *slash;
  48.   int length;            /* Length of result, not including NUL.  */
  49.  
  50.   slash = strrchr (path, '/');
  51.   if (slash == 0)
  52.     {
  53.       /* File is in the current directory.  */
  54.       path = ".";
  55.       length = 1;
  56.     }
  57.   else
  58.     {
  59.       /* Remove any trailing slashes from the result.  */
  60.       while (slash > path && *slash == '/')
  61.     --slash;
  62.  
  63.       length = slash - path + 1;
  64.     }
  65.   newpath = (char *) malloc (length + 1);
  66.   if (newpath == 0)
  67.     return 0;
  68.   strncpy (newpath, path, length);
  69.   newpath[length] = 0;
  70.   return newpath;
  71. }
  72.