4.4BSD/usr/src/contrib/mkmf/src/optpath.c
/*
* Copyright (c) 1983, 1985, 1991 Peter J. Nicklin.
* Copyright (c) 1991 Version Technology.
* All Rights Reserved.
*
* $License: VT.1.1 $
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met: (1) Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer. (2) Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and the following
* disclaimer in the 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
* Version Technology.'' Neither the name of Version Technology nor
* the name of Peter J. Nicklin may be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY VERSION TECHNOLOGY ``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 VERSION TECHNOLOGY 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.
*
* Report problems and direct questions to nicklin@netcom.com
*
* $Header: optpath.c,v 4.4 91/11/25 19:44:59 nicklin Exp $
*
* Author: Peter J. Nicklin
*/
/*
* optpath() condenses a pathname by eliminating adjacent separator
* characters, and current and parent directory names. If optpath()
* encounters a parent directory, it backtracks to eliminate the
* previous directory. If the beginning of the pathname is reached
* during backtracking, then if the pathname is absolute, the parent
* directory is purged, otherwise it is shifted to the beginning of
* pathname. Special care is taken not to clobber a shifted parent
* by using a guard pointer. Returns pathname.
*
* Note 1) For Apollo Domain/OS, adjacent separator characters are
* allowed as the first two characters of the path name. This correctly
* passes through paths containing nodenames. (eg. //nodename/myusr/include)
*/
#include "path.h"
#define absolute_path (*pathname == _RDIRC)
char *
optpath(pathname)
register char *pathname; /* pathname to be optimized */
{
register char *bp; /* back pathname pointer */
register char *fp; /* forward pathname pointer */
register char *up; /* pathname update guard pointer */
bp = fp = up = pathname;
/* elimination of initial "./" causes no harmful side-effects */
if (fp[0] == _CDIRC && fp[1] == _PSC) fp += 2;
#ifdef _HasNetRoot
else if (fp[0] == _PSC)
*bp++ = *fp++; /* allow initial "//": see note 1 */
#endif
while (*fp != '\0')
if (fp[0] == _PSC)
if (fp[1] == _PSC || fp[1] == '\0')
fp += 1; /* "//" or trailing `/' */
else if (fp[1]==_CDIRC && (fp[2]==_PSC || fp[2]=='\0'))
fp += 2; /* `.' */
else {
*bp++ = *fp++;
}
else {
*bp++ = *fp++;
}
if (bp == pathname && *pathname != '\0')
*bp++ = (absolute_path) ? _RDIRC : _CDIRC;
*bp = '\0';
return(pathname);
}