dirname.c revision 41568
11590Srgrimes/*- 21590Srgrimes * Copyright (c) 1991, 1993, 1994 31590Srgrimes * The Regents of the University of California. All rights reserved. 41590Srgrimes * 51590Srgrimes * Redistribution and use in source and binary forms, with or without 61590Srgrimes * modification, are permitted provided that the following conditions 71590Srgrimes * are met: 81590Srgrimes * 1. Redistributions of source code must retain the above copyright 91590Srgrimes * notice, this list of conditions and the following disclaimer. 101590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 111590Srgrimes * notice, this list of conditions and the following disclaimer in the 121590Srgrimes * documentation and/or other materials provided with the distribution. 131590Srgrimes * 3. All advertising materials mentioning features or use of this software 141590Srgrimes * must display the following acknowledgement: 151590Srgrimes * This product includes software developed by the University of 161590Srgrimes * California, Berkeley and its contributors. 171590Srgrimes * 4. Neither the name of the University nor the names of its contributors 181590Srgrimes * may be used to endorse or promote products derived from this software 191590Srgrimes * without specific prior written permission. 201590Srgrimes * 211590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 221590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 231590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 241590Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 251590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 261590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 271590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 281590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 291590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 301590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 311590Srgrimes * SUCH DAMAGE. 321590Srgrimes */ 331590Srgrimes 341590Srgrimes#ifndef lint 3541568Sarchiestatic const char copyright[] = 361590Srgrimes"@(#) Copyright (c) 1991, 1993, 1994\n\ 371590Srgrimes The Regents of the University of California. All rights reserved.\n"; 381590Srgrimes#endif /* not lint */ 391590Srgrimes 401590Srgrimes#ifndef lint 4141568Sarchiestatic const char sccsid[] = "@(#)dirname.c 8.4 (Berkeley) 5/4/95"; 421590Srgrimes#endif /* not lint */ 431590Srgrimes 441590Srgrimes#include <stdio.h> 451590Srgrimes#include <stdlib.h> 4623693Speter#include <unistd.h> 471590Srgrimes 481590Srgrimesvoid usage __P((void)); 491590Srgrimes 501590Srgrimesint 511590Srgrimesmain(argc, argv) 521590Srgrimes int argc; 531590Srgrimes char **argv; 541590Srgrimes{ 551590Srgrimes char *p; 561590Srgrimes int ch; 571590Srgrimes 5824360Simp while ((ch = getopt(argc, argv, "")) != -1) 591590Srgrimes switch(ch) { 601590Srgrimes case '?': 611590Srgrimes default: 621590Srgrimes usage(); 631590Srgrimes } 641590Srgrimes argc -= optind; 651590Srgrimes argv += optind; 661590Srgrimes 671590Srgrimes if (argc != 1) 681590Srgrimes usage(); 691590Srgrimes 701590Srgrimes /* 711590Srgrimes * (1) If string is //, skip steps (2) through (5). 721590Srgrimes * (2) If string consists entirely of slash characters, string 731590Srgrimes * shall be set to a single slash character. In this case, 741590Srgrimes * skip steps (3) through (8). 751590Srgrimes */ 761590Srgrimes for (p = *argv;; ++p) { 771590Srgrimes if (!*p) { 781590Srgrimes if (p > *argv) 791590Srgrimes (void)printf("/\n"); 801590Srgrimes else 811590Srgrimes (void)printf(".\n"); 821590Srgrimes exit(0); 831590Srgrimes } 841590Srgrimes if (*p != '/') 851590Srgrimes break; 861590Srgrimes } 871590Srgrimes 881590Srgrimes /* 891590Srgrimes * (3) If there are any trailing slash characters in string, they 901590Srgrimes * shall be removed. 911590Srgrimes */ 921590Srgrimes for (; *p; ++p); 931590Srgrimes while (*--p == '/') 941590Srgrimes continue; 951590Srgrimes *++p = '\0'; 961590Srgrimes 971590Srgrimes /* 981590Srgrimes * (4) If there are no slash characters remaining in string, 991590Srgrimes * string shall be set to a single period character. In this 1001590Srgrimes * case skip steps (5) through (8). 1011590Srgrimes * 1021590Srgrimes * (5) If there are any trailing nonslash characters in string, 1031590Srgrimes * they shall be removed. 1041590Srgrimes */ 1051590Srgrimes while (--p >= *argv) 1061590Srgrimes if (*p == '/') 1071590Srgrimes break; 1081590Srgrimes ++p; 1091590Srgrimes if (p == *argv) { 1101590Srgrimes (void)printf(".\n"); 1111590Srgrimes exit(0); 1121590Srgrimes } 1131590Srgrimes 1141590Srgrimes /* 1151590Srgrimes * (6) If the remaining string is //, it is implementation defined 1161590Srgrimes * whether steps (7) and (8) are skipped or processed. 1171590Srgrimes * 1181590Srgrimes * This case has already been handled, as part of steps (1) and (2). 1191590Srgrimes */ 1208874Srgrimes 1211590Srgrimes /* 1221590Srgrimes * (7) If there are any trailing slash characters in string, they 1231590Srgrimes * shall be removed. 1241590Srgrimes */ 1251590Srgrimes while (--p >= *argv) 1261590Srgrimes if (*p != '/') 1271590Srgrimes break; 1281590Srgrimes ++p; 1291590Srgrimes 1301590Srgrimes /* 1311590Srgrimes * (8) If the remaining string is empty, string shall be set to 1321590Srgrimes * a single slash character. 1331590Srgrimes */ 1341590Srgrimes *p = '\0'; 1351590Srgrimes (void)printf("%s\n", p == *argv ? "/" : *argv); 1361590Srgrimes exit(0); 1371590Srgrimes} 1381590Srgrimes 1391590Srgrimesvoid 1401590Srgrimesusage() 1411590Srgrimes{ 1421590Srgrimes 1431590Srgrimes (void)fprintf(stderr, "usage: dirname path\n"); 1441590Srgrimes exit(1); 1451590Srgrimes} 146