4.4BSD/usr/src/contrib/mkmf/src/optpath.c

Compare this file to the similar file:
Show the results in this format:

/*
 * 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);
}