diff src/callproc.c @ 386:4af0ddfb7c5b r21-2-8

Import from CVS: tag r21-2-8
author cvs
date Mon, 13 Aug 2007 11:08:50 +0200
parents bbff43aa5eb7
children 74fd4e045ea6
line wrap: on
line diff
--- a/src/callproc.c	Mon Aug 13 11:08:25 2007 +0200
+++ b/src/callproc.c	Mon Aug 13 11:08:50 2007 +0200
@@ -626,19 +626,11 @@
   }
 
   /* Set `env' to a vector of the strings in Vprocess_environment.  */
+  /* + 2 to include PWD and terminating 0.  */
+  env = alloca_array (char *, XINT (Flength (Vprocess_environment)) + 2);
   {
-    REGISTER Lisp_Object tem;
-    REGISTER char **new_env;
-    REGISTER int new_length = 0;
-
-    for (tem = Vprocess_environment;
-	 (CONSP (tem)
-	  && STRINGP (XCAR (tem)));
-	 tem = XCDR (tem))
-      new_length++;
-
-    /* new_length + 2 to include PWD and terminating 0.  */
-    env = new_env = alloca_array (char *, new_length + 2);
+    REGISTER Lisp_Object tail;
+    char **new_env = env;
 
     /* If we have a PWD envvar and we know the real current directory,
        pass one down, but with corrected value.  */
@@ -646,20 +638,23 @@
       *new_env++ = pwd;
 
     /* Copy the Vprocess_environment strings into new_env.  */
-    for (tem = Vprocess_environment;
-	 (CONSP (tem)
-	  && STRINGP (XCAR (tem)));
-	 tem = XCDR (tem))
+    for (tail = Vprocess_environment;
+	 CONSP (tail) && STRINGP (XCAR (tail));
+	 tail = XCDR (tail))
     {
       char **ep = env;
-      char *string = (char *) XSTRING_DATA (XCAR (tem));
-      /* See if this string duplicates any string already in the env.
+      char *envvar_external;
+      Bufbyte *envvar_internal = XSTRING_DATA (XCAR (tail));
+
+      GET_C_CHARPTR_EXT_FILENAME_DATA_ALLOCA (envvar_internal, envvar_external);
+
+      /* See if envvar_external duplicates any string already in the env.
 	 If so, don't put it in.
 	 When an env var has multiple definitions,
 	 we keep the definition that comes first in process-environment.  */
       for (; ep != new_env; ep++)
 	{
-	  char *p = *ep, *q = string;
+	  char *p = *ep, *q = envvar_external;
 	  while (1)
 	    {
 	      if (*q == 0)
@@ -672,17 +667,19 @@
 	      p++, q++;
 	    }
 	}
-      if (pwd && !strncmp ("PWD=", string, 4))
+      if (pwd && !strncmp ("PWD=", envvar_external, 4))
 	{
 	  *new_env++ = pwd;
 	  pwd = 0;
 	}
       else
-        *new_env++ = string;
+        *new_env++ = envvar_external;
+
     duplicate: ;
     }
     *new_env = 0;
   }
+
 #ifdef WINDOWSNT
   prepare_standard_handles (in, out, err, handles);
   set_process_dir (current_dir);
@@ -699,11 +696,11 @@
   close (STDIN_FILENO);
   close (STDOUT_FILENO);
   close (STDERR_FILENO);
-  
+
   dup2 (in,  STDIN_FILENO);
   dup2 (out, STDOUT_FILENO);
   dup2 (err, STDERR_FILENO);
-  
+
   close (in);
   close (out);
   close (err);