home *** CD-ROM | disk | FTP | other *** search
- static char sccs_id[] = "@(#) getenv.c 1.1 " __DATE__ " HJR";
-
- /* getenv.c (c) Copyright 1990 H.Rogers */
-
- #include <stdlib.h>
- #include <string.h>
-
- #include "sys/os.h"
- #include "sys/unix.h"
-
- static char *__environ[] =
- {0};
- char **environ = __environ;
-
- int __envcnt, __envsiz;
-
- static int
- __cmpenv (register char *s1, register const char *s2)
- {
- register int i, j;
-
- while ((i = *s1) && i != '=' && i == *s2)
- s1++, s2++;
-
- if (i == '=')
- i = 0;
- if ((j = *s2) == '=')
- j = 0;
-
- return (i - j);
- }
-
- char *
- __addenv (const char *s, char *v)
- {
- register char **e, *t;
- register int i, j, k;
-
- i = strlen (s) + 1;
- if (v)
- {
- j = strlen (v) + 1;
- k = i + j;
- }
- else
- {
- k = i;
- t = (char *) s;
- while (*++t != '=');
- i = t - s + 1;
- j = k - i;
- }
-
- for (e = environ; t = *e; e++)
- if (!__cmpenv (t, s))
- {
- t = realloc (t, k);
- goto add;
- }
-
- t = environ[__envcnt++] = malloc (k);
-
- if (__envcnt >= __envsiz)
- {
- __envsiz = (__envsiz + 64) & ~63;
- environ = realloc (environ, __envsiz * sizeof (int));
- }
-
- environ[__envcnt] = 0;
-
- add:
-
- if (!v)
- memcpy (t, s, k);
- else
- {
- memcpy (t, s, i);
- t[i - 1] = '=';
- memcpy (t + i, v, j);
- }
-
- return (t + i);
- }
-
- char *
- __chkenv (const char *s)
- {
- register char **e, *t;
-
- for (e = environ; t = *e; e++)
- if (!__cmpenv (t, s))
- {
- while (*t++ != '=');
- return (t);
- }
-
- return (0);
- }
-
- int
- __intenv (const char *s, register int c)
- {
- int r[10];
- char buf[256];
- char *b;
- os_error *e;
-
- if (c && (b = __chkenv (s)))
- goto found;
-
- b = buf;
- r[0] = (int) s;
- r[1] = (int) b;
- r[2] = 256;
- r[3] = 0;
- r[4] = 3;
-
- if (e = os_swi (0x23, r))
- {
- __seterr (e);
- return (0);
- }
-
- b[r[2]] = '\0';
-
- b = __addenv (s, b);
-
- found:
- #ifdef DEBUG
- os_print ("read var : ");
- os_print ((char *) s);
- os_print (" = ");
- os_print (b);
- os_print ("\r\n");
- #endif
-
- r[0] = 10;
- r[1] = (int) b;
-
- if (e = os_swi (0x21, r))
- {
- __seterr (e);
- return (0);
- }
-
- return (r[2]);
- }
-
- char *
- __getenv (const char *s, register int c)
- {
- int r[10];
- char buf[256];
- char *b;
- os_error *e;
-
- if (c && (b = __chkenv (s)))
- return (b);
- else
- b = buf;
-
- r[0] = (int) s;
- r[1] = (int) b;
- r[2] = 256;
- r[3] = 0;
- r[4] = 3;
-
- if (e = os_swi (0x23, r))
- {
- __seterr (e);
- return (0);
- }
-
- b[r[2]] = 0;
-
- return (__addenv (s, b));
- }
-
- char *
- getenv (const char *s)
- {
- return (__getenv (s, -1));
- }
-