ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/getpath.c
Revision: 2.3
Committed: Tue Jun 16 13:29:35 1992 UTC (31 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.2: +16 -11 lines
Log Message:
added macros for directory and path separation characters

File Contents

# Content
1 /* Copyright (c) 1991 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * getpath.c - function to search for file in a list of directories
9 */
10
11 #define NULL 0
12
13 #include <pwd.h>
14
15 #ifndef DIRSEP
16 #define DIRSEP '/'
17 #endif
18 #ifndef PATHSEP
19 #define PATHSEP ':'
20 #endif
21
22 extern char *strcpy(), *strcat(), *getenv();
23 extern struct passwd *getpwnam();
24
25
26 char *
27 getpath(fname, searchpath, mode) /* expand fname, return full path */
28 register char *fname;
29 register char *searchpath;
30 int mode;
31 {
32 static char pname[256];
33 struct passwd *pwent;
34 register char *cp;
35
36 if (fname == NULL)
37 return(NULL);
38
39 switch (*fname) {
40 case DIRSEP: /* relative to root */
41 case '.': /* relative to cwd */
42 strcpy(pname, fname);
43 return(pname);
44 #ifndef NIX
45 case '~': /* relative to home directory */
46 fname++;
47 if (*fname == '\0' || *fname == DIRSEP) { /* ours */
48 if ((cp = getenv("HOME")) == NULL)
49 return(NULL);
50 strcpy(pname, cp);
51 strcat(pname, fname);
52 return(pname);
53 }
54 cp = pname; /* user */
55 do
56 *cp++ = *fname++;
57 while (*fname && *fname != DIRSEP);
58 *cp = '\0';
59 if ((pwent = getpwnam(pname)) == NULL)
60 return(NULL);
61 strcpy(pname, pwent->pw_dir);
62 strcat(pname, fname);
63 return(pname);
64 #endif
65 }
66
67 if (searchpath == NULL) { /* don't search */
68 strcpy(pname, fname);
69 return(pname);
70 }
71 /* check search path */
72 do {
73 cp = pname;
74 while (*searchpath && (*cp = *searchpath++) != PATHSEP)
75 cp++;
76 if (cp > pname && cp[-1] != DIRSEP)
77 *cp++ = DIRSEP;
78 strcpy(cp, fname);
79 if (access(pname, mode) == 0) /* file accessable? */
80 return(pname);
81 } while (*searchpath);
82 /* not found */
83 return(NULL);
84 }