=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/dirname/dirname.c,v retrieving revision 1.2 retrieving revision 1.3 diff -c -r1.2 -r1.3 *** src/usr.bin/dirname/dirname.c 1996/06/26 05:32:36 1.2 --- src/usr.bin/dirname/dirname.c 1997/08/17 21:32:46 1.3 *************** *** 1,9 **** ! /* $OpenBSD: dirname.c,v 1.2 1996/06/26 05:32:36 deraadt Exp $ */ ! /* $NetBSD: dirname.c,v 1.6 1995/09/02 06:02:25 jtc Exp $ */ ! /*- ! * Copyright (c) 1991, 1993, 1994 ! * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions --- 1,8 ---- ! /* $OpenBSD: dirname.c,v 1.3 1997/08/17 21:32:46 millert Exp $ */ ! /* ! * Copyright (c) 1997 Todd C. Miller ! * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions *************** *** 15,155 **** * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: ! * This product includes software developed by the University of ! * California, Berkeley and its contributors. ! * 4. Neither the name of the University nor the names of its contributors ! * 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 ! * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! * SUCH DAMAGE. */ #ifndef lint ! static char copyright[] = ! "@(#) Copyright (c) 1991, 1993, 1994\n\ ! The Regents of the University of California. All rights reserved.\n"; ! #endif /* not lint */ ! #ifndef lint ! #if 0 ! static char sccsid[] = "@(#)dirname.c 8.4 (Berkeley) 5/4/95"; ! #endif ! static char rcsid[] = "$OpenBSD: dirname.c,v 1.2 1996/06/26 05:32:36 deraadt Exp $"; ! #endif /* not lint */ ! ! #include ! #include #include ! #include - static void usage __P((void)); - int main(argc, argv) int argc; char **argv; { ! register char *p; ! int ch; setlocale(LC_ALL, ""); ! while ((ch = getopt(argc, argv, "")) != -1) ! switch(ch) { ! case '?': ! 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; } ! /* ! * (3) If there are any trailing slash characters in string, they ! * shall be removed. ! */ ! 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); } - - static void - usage() - { - - (void)fprintf(stderr, "usage: dirname path\n"); - exit(1); - } - --- 14,60 ---- * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: ! * This product includes software developed by Todd C. Miller. ! * 4. The name of the author may not be used to endorse or promote products ! * derived from this software without specific prior written permission. * ! * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, ! * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY ! * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ! * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, ! * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ! * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; ! * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ! * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR ! * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ! * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef lint ! static char rcsid[] = "$OpenBSD: dirname.c,v 1.3 1997/08/17 21:32:46 millert Exp $"; ! #endif /* not lint */ ! #include #include ! #include int main(argc, argv) int argc; char **argv; { ! char *dir; ! extern char *__progname; setlocale(LC_ALL, ""); ! if (argc != 2) { ! (void)fprintf(stderr, "Usage: %s dirname\n", __progname); ! exit(1); } ! if ((dir = dirname(argv[1])) == NULL) ! err(1, NULL); ! puts(dir); exit(0); }