home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume40 / vname / part01 / vname.c < prev    next >
C/C++ Source or Header  |  1993-11-08  |  1KB  |  82 lines

  1. #include "config.h"
  2. #include "vname.h"
  3. #include <pwd.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6.  
  7. #define isvchar(c)    ((c) && ((isalnum((c))) || ((c) == '_')))
  8.  
  9. static char *homedir P_((char *uname));
  10.  
  11. char last_vname[MAXPATHLEN];
  12.  
  13. /*
  14.  * char *vname(path)
  15.  * char *path;
  16.  *
  17.  * Return a pointer to a newly-built path. The following patterns are
  18.  * parsed in FNAME.
  19.  *
  20.  *    ~/                My home
  21.  *    ~user/                User's home
  22.  *    .../$VAR/...            Shell Environment
  23.  */
  24.  
  25. char *vname(path)
  26. char *path;
  27. {
  28.     char *lp = last_vname;
  29.     char buf[BLEN], *bp, *getlogin(), *getenv();
  30.  
  31.     if (*path == '~') {
  32.         if (*++path == '/')             /* ~/ */
  33.             (void) strcpy(buf, getlogin());
  34.         else {
  35.             for (bp = buf; *path != '/'; )
  36.                 *bp++ = *path++;
  37.             *bp = EOS;
  38.         }
  39.         (void) strcpy(last_vname, homedir(buf));
  40.         lp += strlen(last_vname);
  41.     }
  42.  
  43.     for (; path && *path;) {
  44.         if (*path != '$')
  45.             *lp++ = *path++;
  46.         else {
  47.             /*
  48.              * Find $SOMETHING
  49.              */
  50.  
  51.             *lp = EOS;
  52.             for (bp = buf, ++path; isvchar(*path); path++)
  53.                 *bp++ = *path;
  54.             *bp = EOS;
  55.  
  56.             /*
  57.              * Get from environment. If not found use the literal
  58.              */
  59.  
  60.             bp = (bp = getenv(buf)) ? bp : buf;
  61.             for (; bp && *bp; )
  62.                 *lp++ = *bp++;
  63.         }
  64.     }
  65.     *lp = EOS;
  66.     return (last_vname);
  67. }
  68.  
  69. static char *homedir(user)
  70. char *user;
  71. {
  72.     struct passwd *pw, *getpwnam();
  73.     static char buf[BLEN];
  74.  
  75.     if ((pw = getpwnam(user)) != (struct passwd *)0)
  76.         return (pw->pw_dir);
  77.  
  78.     *buf = '~';
  79.     (void) strcpy(buf + 1, user);
  80.     return (buf);
  81. }
  82.