ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/getpath.c
(Generate patch)

Comparing ray/src/common/getpath.c (file contents):
Revision 2.3 by greg, Tue Jun 16 13:29:35 1992 UTC vs.
Revision 2.8 by greg, Thu Aug 26 10:14:32 1993 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1991 Regents of the University of California */
1 > /* Copyright (c) 1992 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ LBL";
# Line 8 | Line 8 | static char SCCSid[] = "$SunId$ LBL";
8   *  getpath.c - function to search for file in a list of directories
9   */
10  
11 < #define  NULL           0
11 > #include  "standard.h"
12  
13 < #include  <pwd.h>
13 > #include  "paths.h"
14  
15 < #ifndef DIRSEP
16 < #define DIRSEP          '/'
15 > #ifndef  NIX
16 > #include  <pwd.h>
17 > extern struct passwd  *getpwnam();
18   #endif
18 #ifndef PATHSEP
19 #define PATHSEP         ':'
20 #endif
19  
22 extern char  *strcpy(), *strcat(), *getenv();
23 extern struct passwd  *getpwnam();
20  
25
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 <        static char  pname[256];
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 +        pname[0] = '\0';                /* check for full specification */
37          switch (*fname) {
38 <        case DIRSEP:                            /* relative to root */
38 >        CASEDIRSEP:                             /* relative to root */
39          case '.':                               /* relative to cwd */
40                  strcpy(pname, fname);
41 <                return(pname);
41 >                break;
42   #ifndef NIX
43          case '~':                               /* relative to home directory */
44                  fname++;
45 <                if (*fname == '\0' || *fname == DIRSEP) {       /* ours */
45 >                if (*fname == '\0' || ISDIRSEP(*fname)) {       /* ours */
46                          if ((cp = getenv("HOME")) == NULL)
47                                  return(NULL);
48                          strcpy(pname, cp);
49                          strcat(pname, fname);
50 <                        return(pname);
50 >                        break;
51                  }
52                  cp = pname;                                     /* user */
53                  do
54                          *cp++ = *fname++;
55 <                while (*fname && *fname != DIRSEP);
55 >                while (*fname && !ISDIRSEP(*fname));
56                  *cp = '\0';
57                  if ((pwent = getpwnam(pname)) == NULL)
58                          return(NULL);
59                  strcpy(pname, pwent->pw_dir);
60                  strcat(pname, fname);
61 <                return(pname);
61 >                break;
62   #endif
63          }
64 +        if (pname[0])           /* got it, check access if search requested */
65 +                return(searchpath==NULL||access(pname,mode)==0 ? pname : NULL);
66  
67          if (searchpath == NULL) {                       /* don't search */
68                  strcpy(pname, fname);
# Line 73 | Line 73 | int  mode;
73                  cp = pname;
74                  while (*searchpath && (*cp = *searchpath++) != PATHSEP)
75                          cp++;
76 <                if (cp > pname && cp[-1] != DIRSEP)
76 >                if (cp > pname && !ISDIRSEP(cp[-1]))
77                          *cp++ = DIRSEP;
78                  strcpy(cp, fname);
79                  if (access(pname, mode) == 0)           /* file accessable? */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines