#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))
#include "defs.h"
#include "environ.h"
#include "gdb_string.h"
struct environ *
make_environ (void)
{
register struct environ *e;
e = (struct environ *) xmalloc (sizeof (struct environ));
e->allocated = 10;
e->vector = (char **) xmalloc ((e->allocated + 1) * sizeof (char *));
e->vector[0] = 0;
return e;
}
void
free_environ (register struct environ *e)
{
register char **vector = e->vector;
while (*vector)
xfree (*vector++);
xfree (e);
}
void
init_environ (register struct environ *e)
{
#if defined(NeXT_PDO) && defined(__WIN32__)
char **environ = (*_environ_dll);
#else
extern char **environ;
#endif
register int i;
if (environ == NULL)
return;
for (i = 0; environ[i]; i++) ;
if (e->allocated < i)
{
e->allocated = max (i, e->allocated + 10);
e->vector = (char **) xrealloc ((char *) e->vector,
(e->allocated + 1) * sizeof (char *));
}
memcpy (e->vector, environ, (i + 1) * sizeof (char *));
while (--i >= 0)
{
register int len = strlen (e->vector[i]);
register char *new = (char *) xmalloc (len + 1);
memcpy (new, e->vector[i], len + 1);
e->vector[i] = new;
}
}
char **
environ_vector (struct environ *e)
{
return e->vector;
}
char *
get_in_environ (const struct environ *e, const char *var)
{
register int len = strlen (var);
register char **vector = e->vector;
register char *s;
for (; (s = *vector) != NULL; vector++)
if (STREQN (s, var, len) && s[len] == '=')
return &s[len + 1];
return 0;
}
void
set_in_environ (struct environ *e, const char *var, const char *value)
{
register int i;
register int len = strlen (var);
register char **vector = e->vector;
register char *s;
for (i = 0; (s = vector[i]) != NULL; i++)
if (STREQN (s, var, len) && s[len] == '=')
break;
if (s == 0)
{
if (i == e->allocated)
{
e->allocated += 10;
vector = (char **) xrealloc ((char *) vector,
(e->allocated + 1) * sizeof (char *));
e->vector = vector;
}
vector[i + 1] = 0;
}
else
xfree (s);
s = (char *) xmalloc (len + strlen (value) + 2);
strcpy (s, var);
strcat (s, "=");
strcat (s, value);
vector[i] = s;
return;
}
void
unset_in_environ (struct environ *e, char *var)
{
register int len = strlen (var);
register char **vector = e->vector;
register char *s;
for (; (s = *vector) != NULL; vector++)
{
if (STREQN (s, var, len) && s[len] == '=')
{
xfree (s);
while ((vector[0] = vector[1]) != NULL)
{
vector++;
}
break;
}
}
}