Mercurial > hg > octave-nkf
diff src/utils.cc @ 1711:4d552a89ceaa
[project @ 1996-01-08 01:12:38 by jwe]
author | jwe |
---|---|
date | Mon, 08 Jan 1996 01:13:57 +0000 |
parents | a38bd8df9d33 |
children | 42b4f904f1af |
line wrap: on
line diff
--- a/src/utils.cc +++ b/src/utils.cc @@ -808,6 +808,91 @@ return retval; } +// This function was adapted from xputenv from Karl Berry's kpathsearch +// library. + +void +oct_putenv (const char *var_name, const char *value) +{ + static const char **saved_env_items = 0; + static unsigned saved_len; + char *old_item = 0; + + int new_len = strlen (var_name) + strlen (value) + 2; + + char *new_item = new char [new_len]; + + sprintf (new_item, "%s=%s", var_name, value); + +#ifndef SMART_PUTENV + + // Check if we have saved anything yet. + + if (! saved_env_items) + { + saved_env_items = new const char * [1]; + saved_env_items[0] = var_name; + saved_len = 1; + } + else + { + // Check if we've assigned VAR_NAME before. + + unsigned len = strlen (var_name); + + for (unsigned i = 0; i < saved_len && ! old_item; i++) + { + if (strcmp (saved_env_items[i], var_name) == 0) + { + old_item = getenv (var_name); + + assert (old_item); + + // Back up to the `NAME=' in the environment before the + // value that getenv returns. + + old_item -= (len + 1); + } + } + + if (! old_item) + { + // If we haven't seen VAR_NAME before, save it. Assume it + // is in safe storage. + + saved_len++; + + const char **tmp = new const char * [saved_len]; + + for (unsigned i = 0; i < saved_len - 1; i++) + tmp[i] = saved_env_items[i]; + + tmp[saved_len - 1] = var_name; + + delete [] saved_env_items; + + saved_env_items = tmp; + } + } + +#endif + + // As far as I can see there's no way to distinguish between the + // various errors; putenv doesn't have errno values. + + if (putenv (new_item) < 0) + error ("putenv (%s) failed", new_item); + +#ifndef SMART_PUTENV + + // Can't free `new_item' because its contained value is now in + // `environ', but we can free `old_item', since it's been replaced. + + delete [] old_item; + +#endif +} + /* ;;; Local Variables: *** ;;; mode: C++ ***