blob: 11df34e31051127ecc860caeeeb079dce3e24498 [file] [log] [blame]
#include "mk.h"
enum {
ENVQUANTA=10
};
Envy *envy;
static int nextv;
static char *myenv[] =
{
"target",
"stem",
"prereq",
"pid",
"nproc",
"newprereq",
"alltarget",
"newmember",
"stem0", /* must be in order from here */
"stem1",
"stem2",
"stem3",
"stem4",
"stem5",
"stem6",
"stem7",
"stem8",
"stem9",
0
};
void
initenv(void)
{
char **p;
for(p = myenv; *p; p++)
symlook(*p, S_INTERNAL, (void *)"");
readenv(); /* o.s. dependent */
}
static void
envinsert(char *name, Word *value)
{
static int envsize;
if (nextv >= envsize) {
envsize += ENVQUANTA;
envy = (Envy *) Realloc((char *) envy, envsize*sizeof(Envy));
}
envy[nextv].name = name;
envy[nextv++].values = value;
}
static void
envupd(char *name, Word *value)
{
Envy *e;
for(e = envy; e->name; e++)
if(strcmp(name, e->name) == 0){
delword(e->values);
e->values = value;
return;
}
e->name = name;
e->values = value;
envinsert(0,0);
}
static void
ecopy(Symtab *s)
{
char **p;
if(symlook(s->name, S_NOEXPORT, 0))
return;
for(p = myenv; *p; p++)
if(strcmp(*p, s->name) == 0)
return;
envinsert(s->name, s->u.ptr);
}
void
execinit(void)
{
char **p;
nextv = 0;
for(p = myenv; *p; p++)
envinsert(*p, stow(""));
symtraverse(S_VAR, ecopy);
envinsert(0, 0);
}
Envy*
buildenv(Job *j, int slot)
{
char **p, *cp, *qp;
Word *w, *v, **l;
int i;
char buf[256];
envupd("target", wdup(j->t));
if(j->r->attr&REGEXP)
envupd("stem",newword(""));
else
envupd("stem", newword(j->stem));
envupd("prereq", wdup(j->p));
sprint(buf, "%d", getpid());
envupd("pid", newword(buf));
sprint(buf, "%d", slot);
envupd("nproc", newword(buf));
envupd("newprereq", wdup(j->np));
envupd("alltarget", wdup(j->at));
l = &v;
v = w = wdup(j->np);
while(w){
cp = strchr(w->s, '(');
if(cp){
qp = strchr(cp+1, ')');
if(qp){
*qp = 0;
strcpy(w->s, cp+1);
l = &w->next;
w = w->next;
continue;
}
}
*l = w->next;
free(w->s);
free(w);
w = *l;
}
envupd("newmember", v);
/* update stem0 -> stem9 */
for(p = myenv; *p; p++)
if(strcmp(*p, "stem0") == 0)
break;
for(i = 0; *p; i++, p++){
if((j->r->attr&REGEXP) && j->match[i])
envupd(*p, newword(j->match[i]));
else
envupd(*p, newword(""));
}
return envy;
}