- char *newpath;
- char *slash;
- int length; /* Length of result, not including NUL. */
-
- slash = strrchr (path, '/');
-
- /* Make sure there are no trailing slashes. */
- assert (slash == NULL /* There are no slashes in PATH. */
- || slash[1] != 0 /* There is a non-NUL byte after the last slash. */
- || path == slash /* PATH is just `/'. */
- );
-
- if (slash == 0)
- {
- /* File is in the current directory. */
- path = ".";
- length = 1;
- }
- else
- {
- /* Remove any trailing slashes from the result. */
-#ifdef MSDOS
- const char *lim = ((path[0] >= 'A' && path[0] <= 'z' && path[1] == ':')
- ? path + 2 : path);
-
- /* If canonicalized "d:/path", leave alone the root case "d:/". */
- while (slash > lim && *slash == '/')
- --slash;
-#else
- while (slash > path && *slash == '/')
- --slash;
-#endif
-
- length = slash - path + 1;
- }
- newpath = (char *) malloc (length + 1);
- if (newpath == 0)
- return 0;
- strncpy (newpath, path, length);
- newpath[length] = 0;
- return newpath;