/* * This file is part of the UCB release of Plan 9. It is subject to the license * terms in the LICENSE file found in the top-level directory of this * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No * part of the UCB release of Plan 9, including this file, may be copied, * modified, propagated, or distributed except according to the terms contained * in the LICENSE file. */ #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,}; voidinitenv(void){ char **p; for(p = myenv; *p; p++) symlook(*p, S_INTERNAL, (void *)""); readenv(); /* o.s. dependent */} static voidenvinsert(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 voidenvupd(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 voidecopy(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);} voidexecinit(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®EXP) envupd("stem",newword("")); else envupd("stem", newword(j->stem)); envupd("prereq", wdup(j->p)); snprint(buf, sizeof buf, "%d", getpid()); envupd("pid", newword(buf)); snprint(buf, sizeof 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®EXP) && j->match[i]) envupd(*p, newword(j->match[i])); else envupd(*p, newword("")); } return envy;}
/*
* This file is part of the UCB release of Plan 9. It is subject to the license
* terms in the LICENSE file found in the top-level directory of this
* distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
* part of the UCB release of Plan 9, including this file, may be copied,
* modified, propagated, or distributed except according to the terms contained
* in the LICENSE file.
*/
#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®EXP)
envupd("stem",newword(""));
else
envupd("stem", newword(j->stem));
envupd("prereq", wdup(j->p));
snprint(buf, sizeof buf, "%d", getpid());
envupd("pid", newword(buf));
snprint(buf, sizeof 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®EXP) && j->match[i])
envupd(*p, newword(j->match[i]));
else
envupd(*p, newword(""));
}
return envy;
}