ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/getpath.c
Revision: 2.7
Committed: Mon Sep 21 11:59:42 1992 UTC (31 years, 7 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.6: +4 -6 lines
Log Message:
Changes for PC port

File Contents

# Content
1 /* Copyright (c) 1992 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 #include "standard.h"
12
13 #include "paths.h"
14
15 #ifndef NIX
16 #include <pwd.h>
17 extern struct passwd *getpwnam();
18 #endif
19
20
21 char *
22 getpath(fname, searchpath, mode) /* expand fname, return full path */
23 register char *fname;
24 register char *searchpath;
25 int mode;
26 {
27 #ifndef NIX
28 struct passwd *pwent;
29 #endif
30 static char pname[MAXPATH];
31 register char *cp;
32
33 if (fname == NULL)
34 return(NULL);
35
36 switch (*fname) {
37 CASEDIRSEP: /* relative to root */
38 case '.': /* relative to cwd */
39 strcpy(pname, fname);
40 return(pname);
41 #ifndef NIX
42 case '~': /* relative to home directory */
43 fname++;
44 if (*fname == '\0' || ISDIRSEP(*fname)) { /* ours */
45 if ((cp = getenv("HOME")) == NULL)
46 return(NULL);
47 strcpy(pname, cp);
48 strcat(pname, fname);
49 return(pname);
50 }
51 cp = pname; /* user */
52 do
53 *cp++ = *fname++;
54 while (*fname && !ISDIRSEP(*fname));
55 *cp = '\0';
56 if ((pwent = getpwnam(pname)) == NULL)
57 return(NULL);
58 strcpy(pname, pwent->pw_dir);
59 strcat(pname, fname);
60 return(pname);
61 #endif
62 }
63
64 if (searchpath == NULL) { /* don't search */
65 strcpy(pname, fname);
66 return(pname);
67 }
68 /* check search path */
69 do {
70 cp = pname;
71 while (*searchpath && (*cp = *searchpath++) != PATHSEP)
72 cp++;
73 if (cp > pname && !ISDIRSEP(cp[-1]))
74 *cp++ = DIRSEP;
75 strcpy(cp, fname);
76 if (access(pname, mode) == 0) /* file accessable? */
77 return(pname);
78 } while (*searchpath);
79 /* not found */
80 return(NULL);
81 }