blob: c040db58f103a8b60246d1086c2c98dbeed5a17a [file] [log] [blame]
rsc76193d72003-09-30 17:47:42 +00001#include "mk.h"
2
3enum {
4 ENVQUANTA=10
5};
6
7Envy *envy;
8static int nextv;
9
10static char *myenv[] =
11{
12 "target",
13 "stem",
14 "prereq",
15 "pid",
16 "nproc",
17 "newprereq",
18 "alltarget",
19 "newmember",
20 "stem0", /* must be in order from here */
21 "stem1",
22 "stem2",
23 "stem3",
24 "stem4",
25 "stem5",
26 "stem6",
27 "stem7",
28 "stem8",
29 "stem9",
30 0,
31};
32
33void
34initenv(void)
35{
36 char **p;
37
38 for(p = myenv; *p; p++)
39 symlook(*p, S_INTERNAL, (void *)"");
40 readenv(); /* o.s. dependent */
41}
42
43static void
44envinsert(char *name, Word *value)
45{
46 static int envsize;
47
48 if (nextv >= envsize) {
49 envsize += ENVQUANTA;
50 envy = (Envy *) Realloc((char *) envy, envsize*sizeof(Envy));
51 }
52 envy[nextv].name = name;
53 envy[nextv++].values = value;
54}
55
56static void
57envupd(char *name, Word *value)
58{
59 Envy *e;
60
61 for(e = envy; e->name; e++)
62 if(strcmp(name, e->name) == 0){
63 delword(e->values);
64 e->values = value;
65 return;
66 }
67 e->name = name;
68 e->values = value;
69 envinsert(0,0);
70}
71
72static void
73ecopy(Symtab *s)
74{
75 char **p;
76
77 if(symlook(s->name, S_NOEXPORT, 0))
78 return;
79 for(p = myenv; *p; p++)
80 if(strcmp(*p, s->name) == 0)
81 return;
82 envinsert(s->name, (Word *) s->value);
83}
84
85void
86execinit(void)
87{
88 char **p;
89
90 nextv = 0;
91 for(p = myenv; *p; p++)
92 envinsert(*p, stow(""));
93
94 symtraverse(S_VAR, ecopy);
95 envinsert(0, 0);
96}
97
98Envy*
99buildenv(Job *j, int slot)
100{
101 char **p, *cp, *qp;
102 Word *w, *v, **l;
103 int i;
104 char buf[256];
105
106 envupd("target", wdup(j->t));
107 if(j->r->attr&REGEXP)
108 envupd("stem",newword(""));
109 else
110 envupd("stem", newword(j->stem));
111 envupd("prereq", wdup(j->p));
112 sprint(buf, "%d", getpid());
113 envupd("pid", newword(buf));
114 sprint(buf, "%d", slot);
115 envupd("nproc", newword(buf));
116 envupd("newprereq", wdup(j->np));
117 envupd("alltarget", wdup(j->at));
118 l = &v;
119 v = w = wdup(j->np);
120 while(w){
121 cp = strchr(w->s, '(');
122 if(cp){
123 qp = strchr(cp+1, ')');
124 if(qp){
125 *qp = 0;
126 strcpy(w->s, cp+1);
127 l = &w->next;
128 w = w->next;
129 continue;
130 }
131 }
132 *l = w->next;
133 free(w->s);
134 free(w);
135 w = *l;
136 }
137 envupd("newmember", v);
138 /* update stem0 -> stem9 */
139 for(p = myenv; *p; p++)
140 if(strcmp(*p, "stem0") == 0)
141 break;
142 for(i = 0; *p; i++, p++){
143 if((j->r->attr&REGEXP) && j->match[i])
144 envupd(*p, newword(j->match[i]));
145 else
146 envupd(*p, newword(""));
147 }
148 return envy;
149}