30#define _RWSTD_TEST_SRC
43#ifndef _RWSTD_NO_PUTENV_CONST_CHAR
54#ifdef _RWSTD_NO_UNSETENV
55# ifndef _RWSTD_NO_UNSETENV_IN_LIBC
59# undef _RWSTD_NO_UNSETENV
75 str = getenv (
"RW_PUTENV");
83 if (sep < 0 ||
int (_RWSTD_UCHAR_MAX) < sep)
86 for (
const char *pvar =
str; pvar && *pvar; ++nset) {
89 const char *
pend = strchr (pvar, sep);
92 pend = pvar + strlen (pvar);
94 const size_t varlen =
pend - pvar;
97 char*
const envvar = (
char*)malloc (varlen + 2);
101 memcpy (envvar, pvar, varlen);
102 envvar [varlen] =
'\0';
105 char*
const equals = strchr (envvar,
'=');
121 const size_t namelen = equals - envvar;
122 assert (namelen <
sizeof (namebuf));
124 memcpy (namebuf, envvar, namelen);
125 namebuf [namelen] =
'\0';
127 switch (!equals [1] *
mode) {
133 if (getenv (namebuf)) {
153 var = getenv (namebuf);
156 if (!equals [1] && 2 ==
mode)
159 if (equals + 1 !=
var)
162 else if ((
var = getenv (envvar))) {
165#ifndef _RWSTD_NO_UNSETENV
166# if defined (_RWSTD_OS_FREEBSD) || defined (_RWSTD_OS_DARWIN)
172 ret = unsetenv (envvar);
181 if (!getenv (envvar)) {
190 envvar [varlen] =
'=';
191 envvar [varlen + 1] =
'\0';
193 envvar [varlen] =
'\0';
200 var = getenv (envvar);
206 *(
var - 1 - varlen) =
'\0';
210 char **penv = environ;
212 while (*penv && *penv != (
var - 1 - varlen))
_TEST_EXPORT int rw_putenv(const char *str, int sep)
_RWSTD_DLLIMPORT int putenv(const char *) _LIBC_THROWS()