1*35183Smarc /* 2*35183Smarc 3*35183Smarc * Copyright (c) 1984, 1985, 1986 AT&T 4*35183Smarc * All Rights Reserved 5*35183Smarc 6*35183Smarc * THIS IS UNPUBLISHED PROPRIETARY SOURCE 7*35183Smarc * CODE OF AT&T. 8*35183Smarc * The copyright notice above does not 9*35183Smarc * evidence any actual or intended 10*35183Smarc * publication of such source code. 11*35183Smarc 12*35183Smarc */ 13*35183Smarc 14*35183Smarc /* @(#)cannon.c 1.1 */ 15*35183Smarc 16*35183Smarc /* 17*35183Smarc * cannon_path - Generate canonical pathname from given pathname 18*35183Smarc * 19*35183Smarc * David Korn 20*35183Smarc * AT&T Bell Laboratories 21*35183Smarc * Room 5D-112 22*35183Smarc * Murray Hill, N. J. 07974 23*35183Smarc * Tel. x7975 24*35183Smarc * 25*35183Smarc * Written December 1982 26*35183Smarc */ 27*35183Smarc 28*35183Smarc #ifdef BSD 29*35183Smarc #define strrchr rindex 30*35183Smarc #endif /* BSD */ 31*35183Smarc extern char *strrchr(); 32*35183Smarc extern char *strcpy(); 33*35183Smarc 34*35183Smarc /* 35*35183Smarc * canonicalize path-name 36*35183Smarc * The canonicalized pathname replaces path 37*35183Smarc */ 38*35183Smarc cannon_path(path)39*35183Smarcvoid cannon_path(path) 40*35183Smarc char *path; 41*35183Smarc { 42*35183Smarc register char *a1; 43*35183Smarc register char *newdir = path; 44*35183Smarc register char *dp; 45*35183Smarc /* eliminate redundant / */ 46*35183Smarc a1 = newdir; 47*35183Smarc for(dp=a1;*dp = *a1++;dp++) 48*35183Smarc { 49*35183Smarc if(*dp == '/') 50*35183Smarc while(*a1 == '/') 51*35183Smarc a1++; 52*35183Smarc } 53*35183Smarc /* check for ./ and ../ */ 54*35183Smarc a1 = newdir; 55*35183Smarc while(*a1) 56*35183Smarc { 57*35183Smarc if(*a1++ != '/' || *a1 != '.') 58*35183Smarc continue; 59*35183Smarc /* pathname begins with /. */ 60*35183Smarc dp = a1-1; 61*35183Smarc if(*++a1 == '/') /* skip ./ */ 62*35183Smarc a1++; 63*35183Smarc else if(*a1 == '.') 64*35183Smarc { 65*35183Smarc /* pathname begins with /.. */ 66*35183Smarc if(*++a1 != '/' && *a1 != 0) 67*35183Smarc /* file name begins with .. */ 68*35183Smarc continue; 69*35183Smarc else 70*35183Smarc { 71*35183Smarc /* parent directory */ 72*35183Smarc *dp = 0; 73*35183Smarc if((dp=strrchr(newdir,'/')) == 0) 74*35183Smarc dp = newdir; 75*35183Smarc *dp = *a1++; 76*35183Smarc } 77*35183Smarc } 78*35183Smarc else if(*a1 == 0) 79*35183Smarc *dp = 0; 80*35183Smarc else 81*35183Smarc continue; 82*35183Smarc if(*dp == 0) 83*35183Smarc break; 84*35183Smarc strcpy(dp+1,a1); 85*35183Smarc a1 = dp; 86*35183Smarc } 87*35183Smarc for(a1=newdir;*a1;a1++); /* skip to last character*/ 88*35183Smarc if(*--a1 == '/') /* eliminate trailing / */ 89*35183Smarc *a1 = 0; 90*35183Smarc if(*newdir == 0) 91*35183Smarc { 92*35183Smarc *newdir = '/'; 93*35183Smarc newdir[1] = 0; 94*35183Smarc } 95*35183Smarc } 96