Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* Copyright (C) 1998 DJ Delorie, see COPYING.DJ for details */
  2. /* Copyright (C) 1997 DJ Delorie, see COPYING.DJ for details */
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6.  
  7. char *
  8. dirname (const char *fname)
  9. {
  10.   const char *p  = fname;
  11.   const char *slash = NULL;
  12.  
  13.   if (fname)
  14.   {
  15.     size_t dirlen;
  16.     char * dirpart;
  17.  
  18.     if (*fname && fname[1] == ':')
  19.     {
  20.       slash = fname + 1;
  21.       p += 2;
  22.     }
  23.  
  24.     /* Find the rightmost slash.  */
  25.     while (*p)
  26.     {
  27.       if (*p == '/' || *p == '\\')
  28.         slash = p;
  29.       p++;
  30.     }
  31.  
  32.     if (slash == NULL)
  33.     {
  34.       fname = ".";
  35.       dirlen = 1;
  36.     }
  37.     else
  38.     {
  39.       /* Remove any trailing slashes.  */
  40.       while (slash > fname && (slash[-1] == '/' || slash[-1] == '\\'))
  41.         slash--;
  42.  
  43.       /* How long is the directory we will return?  */
  44.       dirlen = slash - fname + (slash == fname || slash[-1] == ':');
  45.       if (*slash == ':' && dirlen == 1)
  46.         dirlen += 2;
  47.     }
  48.  
  49.     dirpart = (char *)malloc (dirlen + 1);
  50.     if (dirpart != NULL)
  51.     {
  52.       strncpy (dirpart, fname, dirlen);
  53.       if (slash && *slash == ':' && dirlen == 3)
  54.         dirpart[2] = '.';       /* for "x:foo" return "x:." */
  55.       dirpart[dirlen] = '\0';
  56.     }
  57.  
  58.     return dirpart;
  59.   }
  60.  
  61.   return NULL;
  62. }
  63.