Mercurial > emacs
changeset 2757:a3ee51f30431
(child_setup): Omit duplicates from new env array.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Thu, 13 May 1993 00:21:47 +0000 |
parents | 5fb491f14ee2 |
children | ce6924085fc7 |
files | src/callproc.c |
diffstat | 1 files changed, 27 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/callproc.c Thu May 13 00:21:23 1993 +0000 +++ b/src/callproc.c Thu May 13 00:21:47 1993 +0000 @@ -463,15 +463,39 @@ tem = XCONS (tem)->cdr) new_length++; - /* new_length + 1 to include terminating 0 */ + /* new_length + 1 to include terminating 0. */ env = new_env = (char **) alloca ((new_length + 1) * sizeof (char *)); - /* Copy the Vprocess_alist strings into new_env. */ + /* Copy the Vprocess_environment strings into new_env. */ for (tem = Vprocess_environment; (XTYPE (tem) == Lisp_Cons && XTYPE (XCONS (tem)->car) == Lisp_String); tem = XCONS (tem)->cdr) - *new_env++ = (char *) XSTRING (XCONS (tem)->car)->data; + { + char **ep = env; + char *string = (char *) XSTRING (XCONS (tem)->car)->data; + /* See if this string 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; + while (1) + { + if (*q == 0) + /* The string is malformed; might as well drop it. */ + goto duplicate; + if (*q != *p) + break; + if (*q == '=') + goto duplicate; + p++, q++; + } + } + *new_env++ = string; + duplicate: ; + } *new_env = 0; }