home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 8 / CDASC08.ISO / NEWS / RADIANCE / SRC / COMMON / GETPATH.C < prev    next >
C/C++ Source or Header  |  1993-10-07  |  2KB  |  82 lines

  1. /* Copyright (c) 1992 Regents of the University of California */
  2.  
  3. #ifndef lint
  4. static char SCCSid[] = "@(#)getpath.c 2.6 9/8/92 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. }
  82.