* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / linux86-0.16.17 / libc / misc / setenv.c
blob10b32d2e30c30d0f81479a598ca832c644b4be1d
1 /* Copyright (C) 1992, 1995 Free Software Foundation, Inc.
2 This file is part of the GNU C Library. */
4 #include <stdlib.h>
5 #include <string.h>
6 #include <unistd.h>
7 #include <errno.h>
9 extern char ** environ;
11 int
12 setenv(name, value, replace)
13 __const char *name;
14 __const char *value;
15 int replace;
17 register char **ep;
18 register size_t size;
19 __const size_t namelen = strlen (name);
20 __const size_t vallen = strlen (value);
21 int result = 0;
23 size = 0;
24 for (ep = environ; *ep != NULL; ++ep)
25 if (!memcmp (*ep, name, namelen) && (*ep)[namelen] == '=')
26 break;
27 else
28 ++size;
30 if (*ep == NULL)
32 static char **last_environ = NULL;
33 char **new_environ = (char **) malloc((size + 2) * sizeof(char *));
34 if (new_environ == NULL)
36 result = -1;
37 goto do_return;
39 (void) memcpy((void*) new_environ, (void*) environ, size * sizeof(char *));
41 new_environ[size] = malloc (namelen + 1 + vallen + 1);
42 if (new_environ[size] == NULL)
44 free (new_environ);
45 errno = ENOMEM;
46 result = -1;
47 goto do_return;
49 memcpy (new_environ[size], name, namelen);
50 new_environ[size][namelen] = '=';
51 memcpy (&new_environ[size][namelen + 1], value, vallen + 1);
53 new_environ[size + 1] = NULL;
55 if (last_environ != NULL)
56 free ((void*) last_environ);
57 last_environ = new_environ;
58 environ = new_environ;
60 else if (replace)
62 size_t len = strlen (*ep);
63 if (len < namelen + 1 + vallen)
65 char *new = malloc (namelen + 1 + vallen + 1);
66 if (new == NULL)
68 result = -1;
69 goto do_return;
71 *ep = new;
73 memcpy (*ep, name, namelen);
74 (*ep)[namelen] = '=';
75 memcpy (&(*ep)[namelen + 1], value, vallen + 1);
78 do_return:
79 return result;
82 void
83 unsetenv(name)
84 __const char *name;
86 register char **ep;
87 register char **dp;
88 __const size_t namelen = strlen (name);
90 for (dp = ep = environ; *ep != NULL; ++ep)
91 if (memcmp (*ep, name, namelen) || (*ep)[namelen] != '=')
93 *dp = *ep;
94 ++dp;
96 *dp = NULL;