| #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; |
| } |