Introduction
Introduction Statistics Contact Development Disclaimer Help
env.c - 9base - revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
env.c (2280B)
---
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(En…
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 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 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.