17dd7cddfSDavid du Colombier #include "mk.h"
27dd7cddfSDavid du Colombier
37dd7cddfSDavid du Colombier enum {
47dd7cddfSDavid du Colombier ENVQUANTA=10
57dd7cddfSDavid du Colombier };
67dd7cddfSDavid du Colombier
77dd7cddfSDavid du Colombier Envy *envy;
87dd7cddfSDavid du Colombier static int nextv;
97dd7cddfSDavid du Colombier
107dd7cddfSDavid du Colombier static char *myenv[] =
117dd7cddfSDavid du Colombier {
127dd7cddfSDavid du Colombier "target",
137dd7cddfSDavid du Colombier "stem",
147dd7cddfSDavid du Colombier "prereq",
157dd7cddfSDavid du Colombier "pid",
167dd7cddfSDavid du Colombier "nproc",
177dd7cddfSDavid du Colombier "newprereq",
187dd7cddfSDavid du Colombier "alltarget",
197dd7cddfSDavid du Colombier "newmember",
207dd7cddfSDavid du Colombier "stem0", /* must be in order from here */
217dd7cddfSDavid du Colombier "stem1",
227dd7cddfSDavid du Colombier "stem2",
237dd7cddfSDavid du Colombier "stem3",
247dd7cddfSDavid du Colombier "stem4",
257dd7cddfSDavid du Colombier "stem5",
267dd7cddfSDavid du Colombier "stem6",
277dd7cddfSDavid du Colombier "stem7",
287dd7cddfSDavid du Colombier "stem8",
297dd7cddfSDavid du Colombier "stem9",
307dd7cddfSDavid du Colombier 0,
317dd7cddfSDavid du Colombier };
327dd7cddfSDavid du Colombier
337dd7cddfSDavid du Colombier void
initenv(void)347dd7cddfSDavid du Colombier initenv(void)
357dd7cddfSDavid du Colombier {
367dd7cddfSDavid du Colombier char **p;
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier for(p = myenv; *p; p++)
397dd7cddfSDavid du Colombier symlook(*p, S_INTERNAL, (void *)"");
407dd7cddfSDavid du Colombier readenv(); /* o.s. dependent */
417dd7cddfSDavid du Colombier }
427dd7cddfSDavid du Colombier
437dd7cddfSDavid du Colombier static void
envinsert(char * name,Word * value)447dd7cddfSDavid du Colombier envinsert(char *name, Word *value)
457dd7cddfSDavid du Colombier {
467dd7cddfSDavid du Colombier static int envsize;
477dd7cddfSDavid du Colombier
487dd7cddfSDavid du Colombier if (nextv >= envsize) {
497dd7cddfSDavid du Colombier envsize += ENVQUANTA;
507dd7cddfSDavid du Colombier envy = (Envy *) Realloc((char *) envy, envsize*sizeof(Envy));
517dd7cddfSDavid du Colombier }
527dd7cddfSDavid du Colombier envy[nextv].name = name;
537dd7cddfSDavid du Colombier envy[nextv++].values = value;
547dd7cddfSDavid du Colombier }
557dd7cddfSDavid du Colombier
567dd7cddfSDavid du Colombier static void
envupd(char * name,Word * value)577dd7cddfSDavid du Colombier envupd(char *name, Word *value)
587dd7cddfSDavid du Colombier {
597dd7cddfSDavid du Colombier Envy *e;
607dd7cddfSDavid du Colombier
617dd7cddfSDavid du Colombier for(e = envy; e->name; e++)
627dd7cddfSDavid du Colombier if(strcmp(name, e->name) == 0){
637dd7cddfSDavid du Colombier delword(e->values);
647dd7cddfSDavid du Colombier e->values = value;
657dd7cddfSDavid du Colombier return;
667dd7cddfSDavid du Colombier }
677dd7cddfSDavid du Colombier e->name = name;
687dd7cddfSDavid du Colombier e->values = value;
697dd7cddfSDavid du Colombier envinsert(0,0);
707dd7cddfSDavid du Colombier }
717dd7cddfSDavid du Colombier
727dd7cddfSDavid du Colombier static void
ecopy(Symtab * s)737dd7cddfSDavid du Colombier ecopy(Symtab *s)
747dd7cddfSDavid du Colombier {
757dd7cddfSDavid du Colombier char **p;
767dd7cddfSDavid du Colombier
777dd7cddfSDavid du Colombier if(symlook(s->name, S_NOEXPORT, 0))
787dd7cddfSDavid du Colombier return;
797dd7cddfSDavid du Colombier for(p = myenv; *p; p++)
807dd7cddfSDavid du Colombier if(strcmp(*p, s->name) == 0)
817dd7cddfSDavid du Colombier return;
824de34a7eSDavid du Colombier envinsert(s->name, s->u.ptr);
837dd7cddfSDavid du Colombier }
847dd7cddfSDavid du Colombier
857dd7cddfSDavid du Colombier void
execinit(void)867dd7cddfSDavid du Colombier execinit(void)
877dd7cddfSDavid du Colombier {
887dd7cddfSDavid du Colombier char **p;
897dd7cddfSDavid du Colombier
907dd7cddfSDavid du Colombier nextv = 0;
917dd7cddfSDavid du Colombier for(p = myenv; *p; p++)
927dd7cddfSDavid du Colombier envinsert(*p, stow(""));
937dd7cddfSDavid du Colombier
947dd7cddfSDavid du Colombier symtraverse(S_VAR, ecopy);
957dd7cddfSDavid du Colombier envinsert(0, 0);
967dd7cddfSDavid du Colombier }
977dd7cddfSDavid du Colombier
987dd7cddfSDavid du Colombier Envy*
buildenv(Job * j,int slot)997dd7cddfSDavid du Colombier buildenv(Job *j, int slot)
1007dd7cddfSDavid du Colombier {
1017dd7cddfSDavid du Colombier char **p, *cp, *qp;
1027dd7cddfSDavid du Colombier Word *w, *v, **l;
1037dd7cddfSDavid du Colombier int i;
1047dd7cddfSDavid du Colombier char buf[256];
1057dd7cddfSDavid du Colombier
1067dd7cddfSDavid du Colombier envupd("target", wdup(j->t));
1077dd7cddfSDavid du Colombier if(j->r->attr®EXP)
1087dd7cddfSDavid du Colombier envupd("stem",newword(""));
1097dd7cddfSDavid du Colombier else
1107dd7cddfSDavid du Colombier envupd("stem", newword(j->stem));
1117dd7cddfSDavid du Colombier envupd("prereq", wdup(j->p));
112*276e7d6dSDavid du Colombier snprint(buf, sizeof buf, "%d", getpid());
1137dd7cddfSDavid du Colombier envupd("pid", newword(buf));
114*276e7d6dSDavid du Colombier snprint(buf, sizeof buf, "%d", slot);
1157dd7cddfSDavid du Colombier envupd("nproc", newword(buf));
1167dd7cddfSDavid du Colombier envupd("newprereq", wdup(j->np));
1177dd7cddfSDavid du Colombier envupd("alltarget", wdup(j->at));
1187dd7cddfSDavid du Colombier l = &v;
1197dd7cddfSDavid du Colombier v = w = wdup(j->np);
1207dd7cddfSDavid du Colombier while(w){
1217dd7cddfSDavid du Colombier cp = strchr(w->s, '(');
1227dd7cddfSDavid du Colombier if(cp){
1237dd7cddfSDavid du Colombier qp = strchr(cp+1, ')');
1247dd7cddfSDavid du Colombier if(qp){
1257dd7cddfSDavid du Colombier *qp = 0;
1267dd7cddfSDavid du Colombier strcpy(w->s, cp+1);
1277dd7cddfSDavid du Colombier l = &w->next;
1287dd7cddfSDavid du Colombier w = w->next;
1297dd7cddfSDavid du Colombier continue;
1307dd7cddfSDavid du Colombier }
1317dd7cddfSDavid du Colombier }
1327dd7cddfSDavid du Colombier *l = w->next;
1337dd7cddfSDavid du Colombier free(w->s);
1347dd7cddfSDavid du Colombier free(w);
1357dd7cddfSDavid du Colombier w = *l;
1367dd7cddfSDavid du Colombier }
1377dd7cddfSDavid du Colombier envupd("newmember", v);
1387dd7cddfSDavid du Colombier /* update stem0 -> stem9 */
1397dd7cddfSDavid du Colombier for(p = myenv; *p; p++)
1407dd7cddfSDavid du Colombier if(strcmp(*p, "stem0") == 0)
1417dd7cddfSDavid du Colombier break;
1427dd7cddfSDavid du Colombier for(i = 0; *p; i++, p++){
1437dd7cddfSDavid du Colombier if((j->r->attr®EXP) && j->match[i])
1447dd7cddfSDavid du Colombier envupd(*p, newword(j->match[i]));
1457dd7cddfSDavid du Colombier else
1467dd7cddfSDavid du Colombier envupd(*p, newword(""));
1477dd7cddfSDavid du Colombier }
1487dd7cddfSDavid du Colombier return envy;
1497dd7cddfSDavid du Colombier }
150