home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 2 / DATAFILE_PDCD2.iso / utilities2 / unixlib36d / UnixLib36d / src / unix / c / getenv < prev    next >
Encoding:
Text File  |  1994-03-08  |  2.3 KB  |  174 lines

  1. static char sccs_id[] = "@(#) getenv.c 1.1 " __DATE__ " HJR";
  2.  
  3. /* getenv.c (c) Copyright 1990 H.Rogers */
  4.  
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. #include "sys/os.h"
  9. #include "sys/unix.h"
  10.  
  11. static char *__environ[] =
  12. {0};
  13. char **environ = __environ;
  14.  
  15. int __envcnt, __envsiz;
  16.  
  17. static int
  18. __cmpenv (register char *s1, register const char *s2)
  19. {
  20.   register int i, j;
  21.  
  22.   while ((i = *s1) && i != '=' && i == *s2)
  23.     s1++, s2++;
  24.  
  25.   if (i == '=')
  26.     i = 0;
  27.   if ((j = *s2) == '=')
  28.     j = 0;
  29.  
  30.   return (i - j);
  31. }
  32.  
  33. char *
  34. __addenv (const char *s, char *v)
  35. {
  36.   register char **e, *t;
  37.   register int i, j, k;
  38.  
  39.   i = strlen (s) + 1;
  40.   if (v)
  41.     {
  42.       j = strlen (v) + 1;
  43.       k = i + j;
  44.     }
  45.   else
  46.     {
  47.       k = i;
  48.       t = (char *) s;
  49.       while (*++t != '=');
  50.       i = t - s + 1;
  51.       j = k - i;
  52.     }
  53.  
  54.   for (e = environ; t = *e; e++)
  55.     if (!__cmpenv (t, s))
  56.       {
  57.     t = realloc (t, k);
  58.     goto add;
  59.       }
  60.  
  61.   t = environ[__envcnt++] = malloc (k);
  62.  
  63.   if (__envcnt >= __envsiz)
  64.     {
  65.       __envsiz = (__envsiz + 64) & ~63;
  66.       environ = realloc (environ, __envsiz * sizeof (int));
  67.     }
  68.  
  69.   environ[__envcnt] = 0;
  70.  
  71. add:
  72.  
  73.   if (!v)
  74.     memcpy (t, s, k);
  75.   else
  76.     {
  77.       memcpy (t, s, i);
  78.       t[i - 1] = '=';
  79.       memcpy (t + i, v, j);
  80.     }
  81.  
  82.   return (t + i);
  83. }
  84.  
  85. char *
  86. __chkenv (const char *s)
  87. {
  88.   register char **e, *t;
  89.  
  90.   for (e = environ; t = *e; e++)
  91.     if (!__cmpenv (t, s))
  92.       {
  93.     while (*t++ != '=');
  94.     return (t);
  95.       }
  96.  
  97.   return (0);
  98. }
  99.  
  100. int
  101. __intenv (const char *s, register int c)
  102. {
  103.   int r[10];
  104.   char buf[256];
  105.   char *b;
  106.   os_error *e;
  107.  
  108.   if (c && (b = __chkenv (s)))
  109.     goto found;
  110.   else
  111.     b = buf;
  112.  
  113.   r[0] = (int) s;
  114.   r[1] = (int) b;
  115.   r[2] = 256;
  116.   r[3] = 0;
  117.   r[4] = 3;
  118.  
  119.   if (e = os_swi (0x23, r))
  120.     {
  121.       __seterr (e);
  122.       return (0);
  123.     }
  124.  
  125.   b = __addenv (s, b);
  126.  
  127. found:r[0] = 10;
  128.   r[1] = (int) b;
  129.  
  130.   if (e = os_swi (0x21, r))
  131.     {
  132.       __seterr (e);
  133.       return (0);
  134.     }
  135.  
  136.   return (r[2]);
  137. }
  138.  
  139. char *
  140. __getenv (const char *s, register int c)
  141. {
  142.   int r[10];
  143.   char buf[256];
  144.   char *b;
  145.   os_error *e;
  146.  
  147.   if (c && (b = __chkenv (s)))
  148.     return (b);
  149.   else
  150.     b = buf;
  151.  
  152.   r[0] = (int) s;
  153.   r[1] = (int) b;
  154.   r[2] = 256;
  155.   r[3] = 0;
  156.   r[4] = 3;
  157.  
  158.   if (e = os_swi (0x23, r))
  159.     {
  160.       __seterr (e);
  161.       return (0);
  162.     }
  163.  
  164.   b[r[2]] = 0;
  165.  
  166.   return (__addenv (s, b));
  167. }
  168.  
  169. char *
  170. getenv (const char *s)
  171. {
  172.   return (__getenv (s, -1));
  173. }
  174.