home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume13 / vn.jan.88 / part03 / envir_set.c next >
Encoding:
C/C++ Source or Header  |  1988-01-30  |  2.8 KB  |  158 lines

  1. /*
  2. ** vn news reader.
  3. **
  4. ** envir_set.c - routine to obtain pertinent environment variable settings
  5. **        and set up file / directory names
  6. **
  7. ** see copyright disclaimer / history in vn.c source file
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <pwd.h>
  12. #include <sys/param.h>
  13. #include "tune.h"
  14. #include "config.h"
  15. #include "vn.h"
  16.  
  17. extern char *Editor, *Ps1, *Printer;
  18. extern char *Orgdir, *Savedir, *Ccfile;    /* path names */
  19. extern char Cxitop[], Cxitor[], Cxrtoi[], Cxptoi[];
  20. extern char *Home;
  21. extern int More;
  22.  
  23. #ifdef SYSV
  24. extern char *getcwd();
  25. #define getwd(a) getcwd(a,sizeof(a))
  26. #define    MAXPATHLEN 240
  27. #else
  28. extern char *getwd();
  29. #endif
  30.  
  31. /*
  32.     environment variable, original directory string setup.
  33. */
  34.  
  35. envir_set ()
  36. {
  37.     char dbuf [MAXPATHLEN], *ccname, *keyxln;
  38.     char *vn_env(), *getcwd(), *str_store();
  39.     struct passwd *ptr, *getpwuid();
  40.  
  41.     vns_envir();
  42.     More = 0;
  43.  
  44.     Ps1 = vn_env("PS1",DEF_PS1);
  45.     Editor = vn_env("EDITOR",DEF_ED);
  46.     Printer = vn_env("PRINTER",DEF_PRINT);
  47.     ccname = vn_env("CCFILE",DEF_CCFILE);
  48.     keyxln = vn_env("VNKEY",DEF_KEYXLN);
  49.     Savedir = vn_env("VNSAVE",NULL);
  50.     More = (strcmp(vn_env("MORE",""), "-c") == 0 ? TRUE : FALSE);
  51.  
  52.     /*
  53.         set original directory strings.
  54.     */
  55.  
  56.     if ((ptr = getpwuid(getuid())) == NULL)
  57.         printex("Cannot obtain /etc/passwd entry");
  58.     Home = str_store(ptr->pw_dir);
  59.     if ((Orgdir = getwd(dbuf)) == NULL)
  60.         printex ("cannot stat pwd");
  61.     Orgdir = str_store (Orgdir);
  62.     if (Savedir == NULL)
  63.         Savedir = Orgdir;
  64.     if (*ccname != '/')
  65.     {
  66.         sprintf (dbuf, "%s/%s",Home,ccname);
  67.         Ccfile = str_store (dbuf);
  68.     }
  69.     else
  70.         Ccfile = str_store (ccname);
  71.     sprintf (dbuf, "%s/%s%s",Home,".vn","XXXXXX");
  72.  
  73.     if (*keyxln != '/')
  74.     {
  75.         sprintf(dbuf, "%s/%s",Home,keyxln);
  76.         set_kxln(dbuf);
  77.     }
  78.     else
  79.         set_kxln(keyxln);
  80. }
  81.  
  82. char *
  83. vn_env(var,def)
  84. char *var;
  85. char *def;
  86. {
  87.     char pfx[RECLEN];
  88.     char *res;
  89.     char *getenv();
  90.  
  91.     if (var[0] != 'V' || var[1] != 'N')
  92.     {
  93.         sprintf(pfx,"VN%s",var);
  94.         if ((res = getenv(pfx)) != NULL)
  95.             return(res);
  96.     }
  97.  
  98.     if ((res = getenv(var)) != NULL)
  99.         return(res);
  100.  
  101.     return(def);
  102. }
  103.  
  104. static
  105. set_kxln(fname)
  106. char *fname;
  107. {
  108.     FILE *fp;
  109.     int i;
  110.     char bufr[80];
  111.     char in,out,*ptr;
  112.     char *index(), xln_str();
  113.  
  114.     for (i=0; i < 128; ++i)
  115.         Cxitop[i] = Cxitor[i] = Cxptoi[i] = Cxrtoi[i] = i;
  116.  
  117.     if ((fp = fopen(fname,"r")) != NULL)
  118.     {
  119.         while(fgets(bufr,79,fp) != NULL)
  120.         {
  121.             if (strncmp(bufr+1,"==",2) == 0)
  122.                 ptr = bufr+2;
  123.             else
  124.                 ptr = index(bufr+1,'=');
  125.             if (ptr == NULL)
  126.                 continue;
  127.             *ptr = '\0';
  128.             ++ptr;
  129.             in = xln_str(bufr+1);
  130.             out = xln_str(ptr);
  131.             switch(bufr[0])
  132.             {
  133.             case 'r':
  134.             case 'R':
  135.                 Cxrtoi[out] = in;
  136.                 Cxitor[in] = out;
  137.                 break;
  138.             case 'p':
  139.             case 'P':
  140.                 Cxptoi[out] = in;
  141.                 Cxitop[in] = out;
  142.             default:
  143.                 break;
  144.             }
  145.         }
  146.         fclose(fp);
  147.     }
  148. }
  149.  
  150. static char
  151. xln_str(s)
  152. char *s;
  153. {
  154.     if (*s < '0' || *s > '9')
  155.         return(*s & 0x7f);
  156.     return((char)(atoi(s) & 0x7f));
  157. }
  158.