version 1.2, 1996/06/26 05:32:36 |
version 1.3, 1997/08/17 21:32:46 |
|
|
/* $OpenBSD$ */ |
/* $OpenBSD$ */ |
/* $NetBSD: dirname.c,v 1.6 1995/09/02 06:02:25 jtc Exp $ */ |
|
|
|
/*- |
/* |
* Copyright (c) 1991, 1993, 1994 |
* Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com> |
* The Regents of the University of California. All rights reserved. |
* All rights reserved. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* modification, are permitted provided that the following conditions |
|
|
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
* 3. All advertising materials mentioning features or use of this software |
* must display the following acknowledgement: |
* must display the following acknowledgement: |
* This product includes software developed by the University of |
* This product includes software developed by Todd C. Miller. |
* California, Berkeley and its contributors. |
* 4. The name of the author may not be used to endorse or promote products |
* 4. Neither the name of the University nor the names of its contributors |
* derived from this software without specific prior written permission. |
* may be used to endorse or promote products derived from this software |
|
* without specific prior written permission. |
|
* |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
* SUCH DAMAGE. |
|
*/ |
*/ |
|
|
#ifndef lint |
#ifndef lint |
static char copyright[] = |
static char rcsid[] = "$OpenBSD$"; |
"@(#) Copyright (c) 1991, 1993, 1994\n\ |
#endif /* not lint */ |
The Regents of the University of California. All rights reserved.\n"; |
|
#endif /* not lint */ |
|
|
|
#ifndef lint |
#include <libgen.h> |
#if 0 |
|
static char sccsid[] = "@(#)dirname.c 8.4 (Berkeley) 5/4/95"; |
|
#endif |
|
static char rcsid[] = "$OpenBSD$"; |
|
#endif /* not lint */ |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <locale.h> |
#include <locale.h> |
#include <unistd.h> |
#include <stdio.h> |
|
|
static void usage __P((void)); |
|
|
|
int |
int |
main(argc, argv) |
main(argc, argv) |
int argc; |
int argc; |
char **argv; |
char **argv; |
{ |
{ |
register char *p; |
char *dir; |
int ch; |
extern char *__progname; |
|
|
setlocale(LC_ALL, ""); |
setlocale(LC_ALL, ""); |
|
|
while ((ch = getopt(argc, argv, "")) != -1) |
if (argc != 2) { |
switch(ch) { |
(void)fprintf(stderr, "Usage: %s dirname\n", __progname); |
case '?': |
exit(1); |
default: |
|
usage(); |
|
} |
|
argc -= optind; |
|
argv += optind; |
|
|
|
if (argc != 1) |
|
usage(); |
|
|
|
/* |
|
* (1) If string is //, skip steps (2) through (5). |
|
* (2) If string consists entirely of slash characters, string |
|
* shall be set to a single slash character. In this case, |
|
* skip steps (3) through (8). |
|
*/ |
|
for (p = *argv;; ++p) { |
|
if (!*p) { |
|
if (p > *argv) |
|
(void)printf("/\n"); |
|
else |
|
(void)printf(".\n"); |
|
exit(0); |
|
} |
|
if (*p != '/') |
|
break; |
|
} |
} |
|
|
/* |
if ((dir = dirname(argv[1])) == NULL) |
* (3) If there are any trailing slash characters in string, they |
err(1, NULL); |
* shall be removed. |
puts(dir); |
*/ |
|
for (; *p; ++p); |
|
while (*--p == '/') |
|
continue; |
|
*++p = '\0'; |
|
|
|
/* |
|
* (4) If there are no slash characters remaining in string, |
|
* string shall be set to a single period character. In this |
|
* case skip steps (5) through (8). |
|
* |
|
* (5) If there are any trailing nonslash characters in string, |
|
* they shall be removed. |
|
*/ |
|
while (--p >= *argv) |
|
if (*p == '/') |
|
break; |
|
++p; |
|
if (p == *argv) { |
|
(void)printf(".\n"); |
|
exit(0); |
|
} |
|
|
|
/* |
|
* (6) If the remaining string is //, it is implementation defined |
|
* whether steps (7) and (8) are skipped or processed. |
|
* |
|
* This case has already been handled, as part of steps (1) and (2). |
|
*/ |
|
|
|
/* |
|
* (7) If there are any trailing slash characters in string, they |
|
* shall be removed. |
|
*/ |
|
while (--p >= *argv) |
|
if (*p != '/') |
|
break; |
|
++p; |
|
|
|
/* |
|
* (8) If the remaining string is empty, string shall be set to |
|
* a single slash character. |
|
*/ |
|
*p = '\0'; |
|
(void)printf("%s\n", p == *argv ? "/" : *argv); |
|
exit(0); |
exit(0); |
} |
} |
|
|
static void |
|
usage() |
|
{ |
|
|
|
(void)fprintf(stderr, "usage: dirname path\n"); |
|
exit(1); |
|
} |
|
|
|