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++ ***