/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/* Copyright (c) 1988 AT&T */
/* All Rights Reserved */
/*
* Copyright (c) 1999 by Sun Microsystems, Inc.
* All rights reserved.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* compath(pathname)
*
* This compresses pathnames. All strings of multiple slashes are
* changed to a single slash. All occurrences of "./" are removed.
* Whenever possible, strings of "/.." are removed together with
* the directory names that they follow.
*
* WARNING: since pathname is altered by this function, it should
* be located in a temporary buffer. This avoids the problem
* of accidently changing strings obtained from makefiles
* and stored in global structures.
*/
#include <string.h>
char *
{
char *nextchar;
char *lastchar;
char *sofar;
char *pnend;
int pnlen;
/*
* do not change the path if it has no "/"
*/
return (pathname);
/*
* find all strings consisting of more than one '/'
*/
/*
* find the character after the last slash
*/
while (*++lastchar == '/') {
}
/*
* eliminate the extra slashes by copying
* everything after the slashes over the slashes
*/
;
}
/*
* find all strings of "./"
*/
/*
* copy everything after the "./" over the "./"
*/
;
}
/*
* find each occurrence of "/.."
*/
/*
* find the directory name preceding the "/.."
*/
--nextchar;
/*
* make sure the preceding directory's name
* is not "." or ".."
*/
if ((*nextchar == '.') &&
/* EMPTY */;
} else {
/*
* prepare to eliminate either
* "dir_name/../" or "dir_name/.."
*/
lastchar += 4;
else
lastchar += 3;
/*
* copy everything after the "/.." to
* before the preceding directory name
*/
/*
* if the character before what was taken
* out is '/', set up to check if the
* slash is part of "/.."
*/
--lastchar;
}
}
/*
* if the string is more than a character long and ends
* in '/', eliminate the '/'.
*/
*pnend-- = '\0';
pnlen--;
}
/*
* if the string has more than two characters and ends in
* "/.", remove the "/.".
*/
*--pnend = '\0';
/*
* if all characters were deleted, return ".";
* otherwise return pathname
*/
if (*pathname == '\0')
return (pathname);
}