Blame


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