home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 8
/
CDASC08.ISO
/
NEWS
/
RADIANCE
/
SRC
/
COMMON
/
GETPATH.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-10-07
|
2KB
|
82 lines
/* Copyright (c) 1992 Regents of the University of California */
#ifndef lint
static char SCCSid[] = "@(#)getpath.c 2.6 9/8/92 LBL";
#endif
/*
* getpath.c - function to search for file in a list of directories
*/
#include "standard.h"
#include "paths.h"
#ifndef NIX
#include <pwd.h>
extern struct passwd *getpwnam();
#endif
char *
getpath(fname, searchpath, mode) /* expand fname, return full path */
register char *fname;
register char *searchpath;
int mode;
{
#ifndef NIX
struct passwd *pwent;
#endif
static char pname[MAXPATH];
register char *cp;
if (fname == NULL)
return(NULL);
switch (*fname) {
CASEDIRSEP: /* relative to root */
case '.': /* relative to cwd */
strcpy(pname, fname);
return(pname);
#ifndef NIX
case '~': /* relative to home directory */
fname++;
if (*fname == '\0' || ISDIRSEP(*fname)) { /* ours */
if ((cp = getenv("HOME")) == NULL)
return(NULL);
strcpy(pname, cp);
strcat(pname, fname);
return(pname);
}
cp = pname; /* user */
do
*cp++ = *fname++;
while (*fname && !ISDIRSEP(*fname));
*cp = '\0';
if ((pwent = getpwnam(pname)) == NULL)
return(NULL);
strcpy(pname, pwent->pw_dir);
strcat(pname, fname);
return(pname);
#endif
}
if (searchpath == NULL) { /* don't search */
strcpy(pname, fname);
return(pname);
}
/* check search path */
do {
cp = pname;
while (*searchpath && (*cp = *searchpath++) != PATHSEP)
cp++;
if (cp > pname && !ISDIRSEP(cp[-1]))
*cp++ = DIRSEP;
strcpy(cp, fname);
if (access(pname, mode) == 0) /* file accessable? */
return(pname);
} while (*searchpath);
/* not found */
return(NULL);
}