home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 1 / RISC_DISC_1.iso / pd_share / code / unixlib / !UnixLib / src / unix / c / getenv < prev    next >
Encoding:
Text File  |  1994-09-30  |  2.5 KB  |  184 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.  
  111.   b = buf;
  112.   r[0] = (int) s;
  113.   r[1] = (int) b;
  114.   r[2] = 256;
  115.   r[3] = 0;
  116.   r[4] = 3;
  117.  
  118.   if (e = os_swi (0x23, r))
  119.     {
  120.       __seterr (e);
  121.       return (0);
  122.     }
  123.  
  124.   b[r[2]] = '\0';
  125.  
  126.   b = __addenv (s, b);
  127.  
  128. found:
  129. #ifdef DEBUG
  130.   os_print ("read var : ");
  131.   os_print ((char *) s);
  132.   os_print (" = ");
  133.   os_print (b);
  134.   os_print ("\r\n");
  135. #endif
  136.  
  137.   r[0] = 10;
  138.   r[1] = (int) b;
  139.  
  140.   if (e = os_swi (0x21, r))
  141.     {
  142.       __seterr (e);
  143.       return (0);
  144.     }
  145.  
  146.   return (r[2]);
  147. }
  148.  
  149. char *
  150. __getenv (const char *s, register int c)
  151. {
  152.   int r[10];
  153.   char buf[256];
  154.   char *b;
  155.   os_error *e;
  156.  
  157.   if (c && (b = __chkenv (s)))
  158.     return (b);
  159.   else
  160.     b = buf;
  161.  
  162.   r[0] = (int) s;
  163.   r[1] = (int) b;
  164.   r[2] = 256;
  165.   r[3] = 0;
  166.   r[4] = 3;
  167.  
  168.   if (e = os_swi (0x23, r))
  169.     {
  170.       __seterr (e);
  171.       return (0);
  172.     }
  173.  
  174.   b[r[2]] = 0;
  175.  
  176.   return (__addenv (s, b));
  177. }
  178.  
  179. char *
  180. getenv (const char *s)
  181. {
  182.   return (__getenv (s, -1));
  183. }
  184.