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*35183Smarc void	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