xref: /plan9/sys/src/cmd/mk/env.c (revision 276e7d6d7cdb63857b1620e0d4a2158cfb236504)
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&REGEXP)
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&REGEXP) && 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