]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/mk/env.c
mothra: fix alt display resizing, filter control characters in panel entries, use...
[plan9front.git] / sys / src / cmd / mk / env.c
1 #include        "mk.h"
2
3 enum {
4         ENVQUANTA=10
5 };
6
7 Envy    *envy;
8 static int nextv;
9
10 static 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
33 void
34 initenv(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
43 static void
44 envinsert(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
56 static void
57 envupd(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
72 static void
73 ecopy(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, s->u.ptr);
83 }
84
85 void
86 execinit(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
98 Envy*
99 buildenv(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         snprint(buf, sizeof buf, "%d", getpid());
113         envupd("pid", newword(buf));
114         snprint(buf, sizeof 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 }