|  | #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)); | 
|  | 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®EXP) && j->match[i]) | 
|  | envupd(*p, newword(j->match[i])); | 
|  | else | 
|  | envupd(*p, newword("")); | 
|  | } | 
|  | return envy; | 
|  | } |