mk: treat X= as empty list in rc shell

This brings mk's behavior when using rc in line with Plan 9's.
The existing code is for Unix environment data structures but
also was assuming Unix shell semantics where empty and missing
variables are mostly equivalent.

The Plan 9 code (/sys/src/cmd/mk/plan9.c in the distribution)
explicitly removes /env/name (creating an empty list) when the
value is missing or an empty string.

Fixes #255.
This commit is contained in:
Russ Cox 2020-01-13 19:20:34 -05:00
parent 9962d916e8
commit 6c17f63090

View file

@ -53,20 +53,26 @@ readenv(void)
void
exportenv(Envy *e, Shell *sh)
{
int i;
int w, n;
char **p;
Envy *e1;
static char buf[16384];
p = 0;
for(i = 0; e->name; e++, i++) {
p = (char**) Realloc(p, (i+2)*sizeof(char*));
n = 0;
for(e1 = e; e1->name; e1++)
n++;
p = Malloc((n+1)*sizeof(char*));
w = 0;
for(; e->name; e++) {
if(sh == &rcshell && (e->values == 0 || e->values->s == 0 || e->values->s[0] == 0))
continue; /* do not write empty string for empty list */
if(e->values)
snprint(buf, sizeof buf, "%s=%s", e->name, wtos(e->values, sh->iws));
else
snprint(buf, sizeof buf, "%s=", e->name);
p[i] = strdup(buf);
p[w++] = strdup(buf);
}
p[i] = 0;
p[w] = 0;
environ = p;
}