xref: /plan9-contrib/sys/src/boot/vt4/parse (revision da917039c7f233c1a27d212bf012c6afa758af39)
1*da917039SDavid du ColombierBEGIN{
2*da917039SDavid du Colombier	oargc = 0;
3*da917039SDavid du Colombier	for(argc = 1; argc < ARGC; argc++){
4*da917039SDavid du Colombier		if(ARGV[argc] !~ /^-.+/ || ARGV[argc] ~ /--/)
5*da917039SDavid du Colombier			break;
6*da917039SDavid du Colombier		if(ARGV[argc] != "-D")
7*da917039SDavid du Colombier			oargv[ARGV[argc]] = oargc++;
8*da917039SDavid du Colombier		else
9*da917039SDavid du Colombier			DEBUG = 1;
10*da917039SDavid du Colombier		ARGV[argc] = "";
11*da917039SDavid du Colombier	}
12*da917039SDavid du Colombier
13*da917039SDavid du Colombier	objtype = ENVIRON["objtype"];
14*da917039SDavid du Colombier
15*da917039SDavid du Colombier	while(getline > 0){
16*da917039SDavid du Colombier		if(/^[ \t]*$/ || /^#/)
17*da917039SDavid du Colombier			continue;
18*da917039SDavid du Colombier
19*da917039SDavid du Colombier		if(/^[^ \t]/){
20*da917039SDavid du Colombier			#section[$1] = 0;
21*da917039SDavid du Colombier			tag = $1;
22*da917039SDavid du Colombier		}
23*da917039SDavid du Colombier		if(!tag)
24*da917039SDavid du Colombier			continue;
25*da917039SDavid du Colombier		sub(/^[ \t]*/, "");
26*da917039SDavid du Colombier		line[tag, section[tag]++] = $0;
27*da917039SDavid du Colombier	}
28*da917039SDavid du Colombier
29*da917039SDavid du Colombier	o = "";
30*da917039SDavid du Colombier	if(!oargc || ("-mkdevlist" in oargv)){
31*da917039SDavid du Colombier		s = mkdevlist();
32*da917039SDavid du Colombier		if(!("-mkdevlist" in oargv) || (oargc > 1))
33*da917039SDavid du Colombier			s = "DEVS=" s;
34*da917039SDavid du Colombier		o = o s "\n";
35*da917039SDavid du Colombier	}
36*da917039SDavid du Colombier	if((!oargc || ("-mkmach" in oargv)) && (objtype in section)){
37*da917039SDavid du Colombier		s = mkmach();
38*da917039SDavid du Colombier		if(!("-mkmach" in oargv) || (oargc > 1))
39*da917039SDavid du Colombier			s = "MACH=" s;
40*da917039SDavid du Colombier		o = o s "\n";
41*da917039SDavid du Colombier	}
42*da917039SDavid du Colombier	if((!oargc || ("-mklib" in oargv)) && ("lib" in section)){
43*da917039SDavid du Colombier		s = mklib();
44*da917039SDavid du Colombier		if(!("-mklib" in oargv) || (oargc > 1))
45*da917039SDavid du Colombier			s = "LIB=" s;
46*da917039SDavid du Colombier		o = o s "\n";
47*da917039SDavid du Colombier	}
48*da917039SDavid du Colombier	if((!oargc || ("-mkport" in oargv) ) && ("port" in section)){
49*da917039SDavid du Colombier		s = mkport();
50*da917039SDavid du Colombier		if(!("-mkport" in oargv) || (oargc > 1))
51*da917039SDavid du Colombier			s = "PORT=" s;
52*da917039SDavid du Colombier		o = o s "\n";
53*da917039SDavid du Colombier	}
54*da917039SDavid du Colombier	if("dbgflg" in section){
55*da917039SDavid du Colombier		for(i = 1; i < section["dbgflg"]; i++){
56*da917039SDavid du Colombier			n = split(line["dbgflg", i], a);
57*da917039SDavid du Colombier			if(n < 2 || n > 4 || a[2] !~ /'[a-zA-Z]'/)
58*da917039SDavid du Colombier				continue;
59*da917039SDavid du Colombier			if(n > 2 && a[3] !~ /'[a-zA-Z]'/)
60*da917039SDavid du Colombier				continue;
61*da917039SDavid du Colombier			if(n == 4 && (a[4] < 1 || a[4] >= 128))
62*da917039SDavid du Colombier				continue;
63*da917039SDavid du Colombier			dbgc[a[1]] = a[2];
64*da917039SDavid du Colombier			if(n == 4)
65*da917039SDavid du Colombier				dbgflg[a[3]] = a[4];
66*da917039SDavid du Colombier			else if(n == 3)
67*da917039SDavid du Colombier				dbgflg[a[3]] = 1;
68*da917039SDavid du Colombier		}
69*da917039SDavid du Colombier	}
70*da917039SDavid du Colombier	if((!oargc || ("-mkrules" in oargv)) && ("dir" in section)){
71*da917039SDavid du Colombier		o = o mkrules(".", exists, a, c, "-I.");
72*da917039SDavid du Colombier		for(i = 1; i < section["dir"]; i++){
73*da917039SDavid du Colombier			n = split(line["dir", i], a);
74*da917039SDavid du Colombier			dir = "../" a[1];
75*da917039SDavid du Colombier			if(n == 1)
76*da917039SDavid du Colombier				a[2] = "-I.";
77*da917039SDavid du Colombier			s = a[2];
78*da917039SDavid du Colombier			o = o mkrules(dir, exists, a, c, s);
79*da917039SDavid du Colombier			l = listolate(a, "|");
80*da917039SDavid du Colombier			if(l != ""){
81*da917039SDavid du Colombier				o = o "^(" l ")\\.$O:R:	" dir "/\\1.s\n";
82*da917039SDavid du Colombier				o = o "\t$AS $AFLAGS " s " " dir "/$stem1.s\n";
83*da917039SDavid du Colombier			}
84*da917039SDavid du Colombier			l = listolate(c, "|");
85*da917039SDavid du Colombier			if(l != ""){
86*da917039SDavid du Colombier				o = o "^(" l ")\\.$O:R:	" dir "/\\1.c\n";
87*da917039SDavid du Colombier				o = o "\t$CC $CFLAGS " s " " dir "/$stem1.c\n";
88*da917039SDavid du Colombier			}
89*da917039SDavid du Colombier		}
90*da917039SDavid du Colombier	}
91*da917039SDavid du Colombier	if((!oargc || ("-mkrootrules" in oargv)) && ("rootdir" in section)){
92*da917039SDavid du Colombier		mkrootrules(name, cname, src);
93*da917039SDavid du Colombier		s = ARGV[argc] ".root.s:D:";
94*da917039SDavid du Colombier		for(i = 1; i < section["rootdir"]; i++)
95*da917039SDavid du Colombier			s = s " " src[i];
96*da917039SDavid du Colombier		s = s "\n\tmkrootall\\\n";
97*da917039SDavid du Colombier		for(i = 1; i < section["rootdir"]; i++)
98*da917039SDavid du Colombier			s = s "\t\t" name[i] " " cname[i] " " src[i] "\\\n";
99*da917039SDavid du Colombier		s = s "\t>$target\n";
100*da917039SDavid du Colombier		if(section["rootdir"] > 1)
101*da917039SDavid du Colombier			o = o s;
102*da917039SDavid du Colombier	}
103*da917039SDavid du Colombier	if((!oargc || ("-mkrrrules" in oargv)) && ("rr" in section)){
104*da917039SDavid du Colombier		n = split(line["rr", 0], a);
105*da917039SDavid du Colombier		if(n == 1)
106*da917039SDavid du Colombier			a[2] = ARGV[argc] ".proto";
107*da917039SDavid du Colombier		s = "$CONF.rr:\tmkrr $CONF " a[2] "\n";
108*da917039SDavid du Colombier		s = s "\tmkrr $CONF " a[2] "\n";
109*da917039SDavid du Colombier		for(i = 1; i < section["rr"]; i++)
110*da917039SDavid du Colombier			s = s "$CONF.rr:\t" line["rr", i] "\n";
111*da917039SDavid du Colombier		o = o s;
112*da917039SDavid du Colombier	}
113*da917039SDavid du Colombier	if("-mkdevc" in oargv)
114*da917039SDavid du Colombier		o = o mkdevc();
115*da917039SDavid du Colombier	if("-mkerrstr" in oargv)
116*da917039SDavid du Colombier		o = o mkerrstr();
117*da917039SDavid du Colombier	if("-mksystab" in oargv)
118*da917039SDavid du Colombier		o = o mksystab();
119*da917039SDavid du Colombier	if("-mkbootconf" in oargv)
120*da917039SDavid du Colombier		o = o mkbootconf();
121*da917039SDavid du Colombier
122*da917039SDavid du Colombier	#
123*da917039SDavid du Colombier	# to do:
124*da917039SDavid du Colombier	#	bootmkfile
125*da917039SDavid du Colombier	#	mkrootall (can it be done at all?)
126*da917039SDavid du Colombier	#
127*da917039SDavid du Colombier	printf o;
128*da917039SDavid du Colombier
129*da917039SDavid du Colombier	exit 0;
130*da917039SDavid du Colombier}
131*da917039SDavid du Colombier
132*da917039SDavid du Colombierfunction mkbootconf(				a, n, s, t, u, c, d, p, r){
133*da917039SDavid du Colombier	s = "#include <u.h>\n";
134*da917039SDavid du Colombier	s = s "#include <libc.h>\n\n";
135*da917039SDavid du Colombier	s = s "#include \"../boot/boot.h\"\n\n";
136*da917039SDavid du Colombier	s = s "Method method[] = {\n";
137*da917039SDavid du Colombier
138*da917039SDavid du Colombier	c = "0";
139*da917039SDavid du Colombier	d = "#S/sdC0/";
140*da917039SDavid du Colombier	p = "boot";
141*da917039SDavid du Colombier	r = "/root";
142*da917039SDavid du Colombier
143*da917039SDavid du Colombier	for(i = 0; i < section["boot"]; i++){		# NOTE: start at 0
144*da917039SDavid du Colombier		n = split(line["boot", i], a);
145*da917039SDavid du Colombier		if(a[1] == "boot"){
146*da917039SDavid du Colombier			if(a[2] == "cpu"){
147*da917039SDavid du Colombier				c = "1";
148*da917039SDavid du Colombier				if(n == 4 && a[3] == "boot")
149*da917039SDavid du Colombier					d = a[4];
150*da917039SDavid du Colombier			}
151*da917039SDavid du Colombier			else if(a[2] == "rootdir" && n == 3)
152*da917039SDavid du Colombier				r = a[3];
153*da917039SDavid du Colombier			else if(a[2] ~ /^(bboot|dosboot|romboot)$/){
154*da917039SDavid du Colombier				c = "1";
155*da917039SDavid du Colombier				p = a[2];
156*da917039SDavid du Colombier			}
157*da917039SDavid du Colombier			else if(a[2] == "boot" && n == 3)
158*da917039SDavid du Colombier				d = a[3];
159*da917039SDavid du Colombier			continue;
160*da917039SDavid du Colombier		}
161*da917039SDavid du Colombier		s = s "\t{ \"" a[1] "\", config" a[1] ", connect" a[1] ", ";
162*da917039SDavid du Colombier		t = "nil";
163*da917039SDavid du Colombier		if(n > 1){
164*da917039SDavid du Colombier			u = line["boot", i];
165*da917039SDavid du Colombier			if(sub(/^[_A-Za-z][_A-Za-z0-9]*[ \t]*/, "", u)){
166*da917039SDavid du Colombier				if(match(u, /^".*"$/))
167*da917039SDavid du Colombier					u = substr(u, RSTART+1, RLENGTH-2);
168*da917039SDavid du Colombier				t = "\"" u "\"";
169*da917039SDavid du Colombier			}
170*da917039SDavid du Colombier		}
171*da917039SDavid du Colombier		s = s t ", },\n";
172*da917039SDavid du Colombier	}
173*da917039SDavid du Colombier	s = s "\t{ nil },\n};\n\n";
174*da917039SDavid du Colombier	s = s "int cpuflag = " c ";\n";
175*da917039SDavid du Colombier	s = s "char* rootdir = \"" r "\";\n";
176*da917039SDavid du Colombier	s = s "char* bootdisk = \"" d "\";\n";
177*da917039SDavid du Colombier	s = s "extern void " p "(int, char**);\n\n";
178*da917039SDavid du Colombier	s = s "void\nmain(int argc, char **argv)\n";
179*da917039SDavid du Colombier	s = s "{\n\t" p "(argc, argv);\n}\n"
180*da917039SDavid du Colombier
181*da917039SDavid du Colombier	t = "int (*cfs)(int) = 0;\n";
182*da917039SDavid du Colombier	for(i = 1; i < section["rootdir"]; i++){
183*da917039SDavid du Colombier		if($1 !~ /\/bin\/cfs$/)
184*da917039SDavid du Colombier			continue;
185*da917039SDavid du Colombier		t = "int (*cfs)(int) = cache;\n";
186*da917039SDavid du Colombier		break;
187*da917039SDavid du Colombier	}
188*da917039SDavid du Colombier	s = s t;
189*da917039SDavid du Colombier
190*da917039SDavid du Colombier	return s;
191*da917039SDavid du Colombier}
192*da917039SDavid du Colombier
193*da917039SDavid du Colombierfunction mksystab(					a, i, f, n, s, t){
194*da917039SDavid du Colombier	s = "#include \"/sys/src/libc/9syscall/sys.h\"\n\n";
195*da917039SDavid du Colombier	s = s "typedef void Syscall(Ar0*, va_list);\n\n";
196*da917039SDavid du Colombier
197*da917039SDavid du Colombier	t = "";
198*da917039SDavid du Colombier	while(getline < "/sys/src/libc/9syscall/sys.h"){
199*da917039SDavid du Colombier		if($1 != "#define" || NF != 3)
200*da917039SDavid du Colombier			continue;
201*da917039SDavid du Colombier
202*da917039SDavid du Colombier		f = "sys" tolower($2);
203*da917039SDavid du Colombier		if($2 == "SYSR1")
204*da917039SDavid du Colombier			f = "sysr1";
205*da917039SDavid du Colombier		if($2 == "RENDEZVOUS")
206*da917039SDavid du Colombier			n = "Rendez";
207*da917039SDavid du Colombier		else if($2 == "BRK_")
208*da917039SDavid du Colombier			n = "Brk";
209*da917039SDavid du Colombier		else
210*da917039SDavid du Colombier			n = substr($2, 1, 1) tolower(substr($2, 2));
211*da917039SDavid du Colombier
212*da917039SDavid du Colombier		s = s "Syscall " f ";\n";
213*da917039SDavid du Colombier		t = t "\t[" $2 "]\t";
214*da917039SDavid du Colombier		if(length($2) < 6)
215*da917039SDavid du Colombier			t = t "\t";
216*da917039SDavid du Colombier		t = t "{ \"" n "\", " f ", ";
217*da917039SDavid du Colombier		#
218*da917039SDavid du Colombier		# if($1 ~ "(FVERSION|FSTAT|STAT)")
219*da917039SDavid du Colombier		#	t = t "{ .u = 0 } },\n";
220*da917039SDavid du Colombier		# else
221*da917039SDavid du Colombier		#
222*da917039SDavid du Colombier		if($1 ~ "(BIND|MOUNT|FWSTAT|WSTAT)")
223*da917039SDavid du Colombier			t = t "{ .l = 0 } },\n";
224*da917039SDavid du Colombier		else if($1 ~ "(EXEC|RENDEZVOUS|SEGBRK|SEGATTACH)")
225*da917039SDavid du Colombier			t = t "{ .v = (void*)-1 } },\n";
226*da917039SDavid du Colombier		else
227*da917039SDavid du Colombier			t = t "{ .i = -1 } },\n";
228*da917039SDavid du Colombier	}
229*da917039SDavid du Colombier	if("syscall" in section){
230*da917039SDavid du Colombier		for(i = 1; i < section["syscall"]; i++){
231*da917039SDavid du Colombier			if(split(line["syscall", i], a) != 8)
232*da917039SDavid du Colombier				continue;
233*da917039SDavid du Colombier			if(line["syscall", i] !~ /#define.*{ \.[ilpuv] = .* }$/)
234*da917039SDavid du Colombier				continue;
235*da917039SDavid du Colombier
236*da917039SDavid du Colombier			f = "sys" tolower(a[2]);
237*da917039SDavid du Colombier			n = substr(a[2], 1, 1) tolower(substr(a[2], 2));
238*da917039SDavid du Colombier
239*da917039SDavid du Colombier			s = s "\nSyscall " f ";\n";
240*da917039SDavid du Colombier			t = t a[1] " " a[2] "\t" a[3] "\n\t[" a[2] "]\t";
241*da917039SDavid du Colombier			if(length(a[2]) < 6)
242*da917039SDavid du Colombier				t = t "\t";
243*da917039SDavid du Colombier			split(line["syscall", i], a, "{");
244*da917039SDavid du Colombier			t = t "{ \"" n "\", " f ", {" a[2] " },\n";
245*da917039SDavid du Colombier		}
246*da917039SDavid du Colombier	}
247*da917039SDavid du Colombier	s = s "struct {\n\tchar*\tn;\n\tSyscall*f;\n\tAr0\tr;\n}";
248*da917039SDavid du Colombier	s = s " systab[] = {\n" t "};\n\nint nsyscall = nelem(systab);\n";
249*da917039SDavid du Colombier
250*da917039SDavid du Colombier	return s;
251*da917039SDavid du Colombier}
252*da917039SDavid du Colombier
253*da917039SDavid du Colombierfunction mkerrstr(					a, s){
254*da917039SDavid du Colombier	FS="[ \t;]+";
255*da917039SDavid du Colombier	while(getline < "error.h"){
256*da917039SDavid du Colombier		split($0, a, /\/\* | \*\//);
257*da917039SDavid du Colombier		s = s $2 " " $3 " = \"" a[2] "\";\n";
258*da917039SDavid du Colombier	}
259*da917039SDavid du Colombier	FS=" ";
260*da917039SDavid du Colombier
261*da917039SDavid du Colombier	return s;
262*da917039SDavid du Colombier}
263*da917039SDavid du Colombier
264*da917039SDavid du Colombierfunction mkdevc(		a, d, i, m, n, s, t, u, name, cname){
265*da917039SDavid du Colombier	s = "#include \"u.h\"\n";
266*da917039SDavid du Colombier	s = s "#include \"lib.h\"\n";
267*da917039SDavid du Colombier	s = s "#include \"mem.h\"\n";
268*da917039SDavid du Colombier	s = s "#include \"dat.h\"\n";
269*da917039SDavid du Colombier	s = s "#include \"fns.h\"\n";
270*da917039SDavid du Colombier	s = s "#include \"error.h\"\n\n";
271*da917039SDavid du Colombier	s = s "#include \"io.h\"\n\n";
272*da917039SDavid du Colombier
273*da917039SDavid du Colombier	t = "";
274*da917039SDavid du Colombier	for(i = 1; i < section["dev"]; i++){
275*da917039SDavid du Colombier		split(line["dev", i], a);
276*da917039SDavid du Colombier		s = s "extern Dev " a[1] "devtab;\n";
277*da917039SDavid du Colombier		t = t "\t&" a[1] "devtab,\n";
278*da917039SDavid du Colombier		d[a[1]]++;
279*da917039SDavid du Colombier	}
280*da917039SDavid du Colombier	s = s "Dev* devtab[] = {\n" t "\tnil,\n};\n\n";
281*da917039SDavid du Colombier
282*da917039SDavid du Colombier	mkrootrules(name, cname, m);
283*da917039SDavid du Colombier	t = "";
284*da917039SDavid du Colombier	for(i = 1; i < section["rootdir"]; i++){
285*da917039SDavid du Colombier		s = s "extern uchar " cname[i] "code[];\n";
286*da917039SDavid du Colombier		s = s "extern usize " cname[i] "len;\n";
287*da917039SDavid du Colombier		t = t "\taddbootfile(\"" name[i] "\", " cname[i] "code, " cname[i] "len);\n";
288*da917039SDavid du Colombier	}
289*da917039SDavid du Colombier	for(i = 1; i < section["link"]; i++){
290*da917039SDavid du Colombier		split(line["link", i], a);
291*da917039SDavid du Colombier		s = s "extern void " a[1] "link(void);\n";
292*da917039SDavid du Colombier		t = t "\t" a[1] "link();\n";
293*da917039SDavid du Colombier	}
294*da917039SDavid du Colombier	s = s "void\nlinks(void)\n{\n" t "}\n\n";
295*da917039SDavid du Colombier
296*da917039SDavid du Colombier	if("ip" in d && "ip" in section){
297*da917039SDavid du Colombier		t = "";
298*da917039SDavid du Colombier		s = s "#include \"../ip/ip.h\"\n";
299*da917039SDavid du Colombier		for(i = 1; i < section["ip"]; i++){
300*da917039SDavid du Colombier			split(line["ip", i], a);
301*da917039SDavid du Colombier			s = s "extern void " a[1] "init(Fs*);\n";
302*da917039SDavid du Colombier			t = t "\t" a[1] "init,\n";
303*da917039SDavid du Colombier		}
304*da917039SDavid du Colombier		s = s "void (*ipprotoinit[])(Fs*) = {\n" t "\tnil,\n};\n\n";
305*da917039SDavid du Colombier	}
306*da917039SDavid du Colombier
307*da917039SDavid du Colombier	if("sd" in d && "sd" in section){
308*da917039SDavid du Colombier		t = "";
309*da917039SDavid du Colombier		s = s "#include \"sd.h\"\n";
310*da917039SDavid du Colombier		for(i = 1; i < section["sd"]; i++){
311*da917039SDavid du Colombier			split(line["sd", i], a);
312*da917039SDavid du Colombier			s = s "extern SDifc " a[1] "ifc;\n";
313*da917039SDavid du Colombier			t = t  "\t&" a[1] "ifc,\n";
314*da917039SDavid du Colombier		}
315*da917039SDavid du Colombier		s = s "SDifc* sdifc[] = {\n" t "\tnil,\n};\n\n";
316*da917039SDavid du Colombier	}
317*da917039SDavid du Colombier
318*da917039SDavid du Colombier	if("uart" in d && "uart" in section){
319*da917039SDavid du Colombier		t = "";
320*da917039SDavid du Colombier		for(i = 1; i < section["uart"]; i++){
321*da917039SDavid du Colombier			split(line["uart", i], a);
322*da917039SDavid du Colombier			a[1] = substr(a[1], 5, length(a[1])-4) "physuart";
323*da917039SDavid du Colombier			s = s "extern PhysUart " a[1] ";\n";
324*da917039SDavid du Colombier			t = t  "\t&" a[1] ",\n";
325*da917039SDavid du Colombier		}
326*da917039SDavid du Colombier		s = s "PhysUart* physuart[] = {\n" t "\tnil,\n};\n\n";
327*da917039SDavid du Colombier	}
328*da917039SDavid du Colombier
329*da917039SDavid du Colombier	t = "";
330*da917039SDavid du Colombier	n = 0;
331*da917039SDavid du Colombier	if("physseg" in section){
332*da917039SDavid du Colombier		for(i = 1; i < section["physseg"]; i++){
333*da917039SDavid du Colombier			u = line["physseg", i];
334*da917039SDavid du Colombier			if(u ~ /^\.[_A-Za-z][_A-Za-z0-9]*/)
335*da917039SDavid du Colombier				t = t "\t";
336*da917039SDavid du Colombier			t = t "\t" u "\n";
337*da917039SDavid du Colombier			if(sub(/.*\.pgalloc.*=[^_A-Za-z]*/, "", u)){
338*da917039SDavid du Colombier				if(match(u, /^[_A-Za-z][_A-Za-z0-9]*/)){
339*da917039SDavid du Colombier					u = substr(u, RSTART, RLENGTH);
340*da917039SDavid du Colombier					s = s "extern Page *(*" u ")(Segment*, uintptr);\n";
341*da917039SDavid du Colombier				}
342*da917039SDavid du Colombier			}
343*da917039SDavid du Colombier			else if(sub(/.*\.pgfree.*=[^_A-Za-z]*/, "", u)){
344*da917039SDavid du Colombier				if(match(u, /^[_A-Za-z][_A-Za-z0-9]*/)){
345*da917039SDavid du Colombier					u = substr(u, RSTART, RLENGTH);
346*da917039SDavid du Colombier					s = s "extern void (*" u ")(Page*);\n";
347*da917039SDavid du Colombier				}
348*da917039SDavid du Colombier			}
349*da917039SDavid du Colombier			if(match(u, /}/))
350*da917039SDavid du Colombier				n++;
351*da917039SDavid du Colombier		}
352*da917039SDavid du Colombier	}
353*da917039SDavid du Colombier	s = s "Physseg physseg[" n+8 "] = {\n";
354*da917039SDavid du Colombier	s = s "\t{\t.attr\t= SG_SHARED,\n";
355*da917039SDavid du Colombier	s = s "\t\t.name\t= \"shared\",\n";
356*da917039SDavid du Colombier	s = s "\t\t.size\t= SEGMAXSIZE,\n\t},\n";
357*da917039SDavid du Colombier	s = s "\t{\t.attr\t= SG_BSS,\n";
358*da917039SDavid du Colombier	s = s "\t\t.name\t= \"memory\",\n";
359*da917039SDavid du Colombier	s = s "\t\t.size\t= SEGMAXSIZE,\n\t},\n";
360*da917039SDavid du Colombier	s = s t "};\nint nphysseg = " n+8 ";\n\n";
361*da917039SDavid du Colombier
362*da917039SDavid du Colombier	s = s "char dbgflg[256]";
363*da917039SDavid du Colombier	t = "";
364*da917039SDavid du Colombier	for(u in dbgflg)
365*da917039SDavid du Colombier		t = t "\t[" u "]\t" dbgflg[u] ",\n";
366*da917039SDavid du Colombier	if(t != "")
367*da917039SDavid du Colombier		s = s " = {\n" t "}";
368*da917039SDavid du Colombier	s = s ";\n\n";
369*da917039SDavid du Colombier
370*da917039SDavid du Colombier	for(i in m)
371*da917039SDavid du Colombier		delete m[i];
372*da917039SDavid du Colombier
373*da917039SDavid du Colombier	for(i = 1; i < section["misc"]; i++){
374*da917039SDavid du Colombier		split(line["misc", i], a);
375*da917039SDavid du Colombier		m[a[1]] = line["misc", i];
376*da917039SDavid du Colombier	}
377*da917039SDavid du Colombier	if("cache" in m){
378*da917039SDavid du Colombier		s = s "extern void cinit(void);\n";
379*da917039SDavid du Colombier		s = s "extern void copen(Chan*);\n";
380*da917039SDavid du Colombier		s = s "extern int cread(Chan*, uchar*, int, vlong);\n";
381*da917039SDavid du Colombier		s = s "extern void cupdate(Chan*, uchar*, int, vlong);\n";
382*da917039SDavid du Colombier		s = s "extern void cwrite(Chan*, uchar*, int, vlong);\n\n";
383*da917039SDavid du Colombier		s = s "void (*mfcinit)(void) = cinit;\n";
384*da917039SDavid du Colombier		s = s "void (*mfcopen)(Chan*) = copen;\n";
385*da917039SDavid du Colombier		s = s "int (*mfcread)(Chan*, uchar*, int, vlong) = cread;\n";
386*da917039SDavid du Colombier		s = s "void (*mfcupdate)(Chan*, uchar*, int, vlong) = cupdate;\n";
387*da917039SDavid du Colombier		s = s "void (*mfcwrite)(Chan*, uchar*, int, vlong) = cwrite;\n\n";
388*da917039SDavid du Colombier	}
389*da917039SDavid du Colombier	else{
390*da917039SDavid du Colombier		s = s "void (*mfcinit)(void) = nil;\n";
391*da917039SDavid du Colombier		s = s "void (*mfcopen)(Chan*) = nil;\n";
392*da917039SDavid du Colombier		s = s "int (*mfcread)(Chan*, uchar*, int, vlong) = nil;\n";
393*da917039SDavid du Colombier		s = s "void (*mfcupdate)(Chan*, uchar*, int, vlong) = nil;\n";
394*da917039SDavid du Colombier		s = s "void (*mfcwrite)(Chan*, uchar*, int, vlong) = nil;\n\n";
395*da917039SDavid du Colombier	}
396*da917039SDavid du Colombier	if(!("rdb" in misc)){
397*da917039SDavid du Colombier		s = s "void\n";
398*da917039SDavid du Colombier		s = s "rdb(void)\n";
399*da917039SDavid du Colombier		s = s "{\n";
400*da917039SDavid du Colombier		s = s "\tsplhi();\n";
401*da917039SDavid du Colombier		s = s "\tiprint(\"rdb...not installed\\n\");\n";
402*da917039SDavid du Colombier		s = s "\tfor(;;);\n";
403*da917039SDavid du Colombier		s = s "}\n\n";
404*da917039SDavid du Colombier	}
405*da917039SDavid du Colombier
406*da917039SDavid du Colombier	if("conf" in section){
407*da917039SDavid du Colombier		for(i = 1; i < section["conf"]; i++)
408*da917039SDavid du Colombier			s = s line["conf", i] "\n";
409*da917039SDavid du Colombier		s = s "\n";
410*da917039SDavid du Colombier	}
411*da917039SDavid du Colombier	t = ".";
412*da917039SDavid du Colombier	while("pwd" | getline > 0){
413*da917039SDavid du Colombier		if($0 ~ /^\//)
414*da917039SDavid du Colombier			t = $0;
415*da917039SDavid du Colombier	}
416*da917039SDavid du Colombier	s = s "char* conffile = \"" t "/" ARGV[argc] "\";\n";
417*da917039SDavid du Colombier	s = s "ulong kerndate = KERNDATE;\n";
418*da917039SDavid du Colombier
419*da917039SDavid du Colombier	return s;
420*da917039SDavid du Colombier}
421*da917039SDavid du Colombier
422*da917039SDavid du Colombierfunction mkrootrules(name, cname, src,			a, i, n){
423*da917039SDavid du Colombier	for(i = 1; i < section["rootdir"]; i++){
424*da917039SDavid du Colombier		n = split(line["rootdir", i], a);
425*da917039SDavid du Colombier		if(n >= 2)
426*da917039SDavid du Colombier			name[i] = a[2];
427*da917039SDavid du Colombier		else
428*da917039SDavid du Colombier			name[i] = a[1];
429*da917039SDavid du Colombier		sub(/.*\//, "", name[i]);
430*da917039SDavid du Colombier		cname[i] = a[1];
431*da917039SDavid du Colombier		gsub(/[^a-zA-Z0-9_]/, "_", cname[i]);
432*da917039SDavid du Colombier		src[i] = a[1];
433*da917039SDavid du Colombier	}
434*da917039SDavid du Colombier}
435*da917039SDavid du Colombier
436*da917039SDavid du Colombierfunction mkrules(dir, exists, ameta, cmeta, flags,		f, i, s, t){
437*da917039SDavid du Colombier	for(i in ameta)
438*da917039SDavid du Colombier		delete ameta[i];
439*da917039SDavid du Colombier	for(i in cmeta)
440*da917039SDavid du Colombier		delete cmeta[i];
441*da917039SDavid du Colombier
442*da917039SDavid du Colombier	s = "";
443*da917039SDavid du Colombier	while("cd " dir "; /bin/ls *.[cs]" | getline > 0){
444*da917039SDavid du Colombier		if($0 !~ /^[A-Za-z0-9]*\.[cs]$/)
445*da917039SDavid du Colombier			continue;
446*da917039SDavid du Colombier		f = $0;
447*da917039SDavid du Colombier		if(!sub(/\.[cs]$/, ""))
448*da917039SDavid du Colombier			continue;
449*da917039SDavid du Colombier		if($0 in exists)
450*da917039SDavid du Colombier			continue;
451*da917039SDavid du Colombier		exists[$0] = dir;
452*da917039SDavid du Colombier		if(f ~ /\.c$/){
453*da917039SDavid du Colombier			if(!($0 in dbgc)){
454*da917039SDavid du Colombier				cmeta[$0]++;
455*da917039SDavid du Colombier				continue;
456*da917039SDavid du Colombier			}
457*da917039SDavid du Colombier			t = "$CC $CFLAGS " flags;
458*da917039SDavid du Colombier		}
459*da917039SDavid du Colombier		else{
460*da917039SDavid du Colombier			if(!($0 in dbgc)){
461*da917039SDavid du Colombier				ameta[$0]++;
462*da917039SDavid du Colombier				continue;
463*da917039SDavid du Colombier			}
464*da917039SDavid du Colombier			t = "$AS $AFLAGS " flags;
465*da917039SDavid du Colombier		}
466*da917039SDavid du Colombier		s = s $0 ".$O:\t" dir "/" f "\n";
467*da917039SDavid du Colombier		s = s "\t" t " -D'_DBGC_='" dbgc[$0] "'' " dir "/" f "\n";
468*da917039SDavid du Colombier	}
469*da917039SDavid du Colombier	return s;
470*da917039SDavid du Colombier}
471*da917039SDavid du Colombier
472*da917039SDavid du Colombierfunction mkport(					array){
473*da917039SDavid du Colombier	arrayify(array, "port", "", ".$O", 1);
474*da917039SDavid du Colombier
475*da917039SDavid du Colombier	return listolate(array, " ");
476*da917039SDavid du Colombier}
477*da917039SDavid du Colombier
478*da917039SDavid du Colombierfunction mklib(						array){
479*da917039SDavid du Colombier	arrayify(array, "lib", "/$objtype/lib/", ".a", 1);
480*da917039SDavid du Colombier
481*da917039SDavid du Colombier	return listolate(array," ");
482*da917039SDavid du Colombier}
483*da917039SDavid du Colombier
484*da917039SDavid du Colombierfunction mkmach(					a, i, s){
485*da917039SDavid du Colombier	s = "";
486*da917039SDavid du Colombier	for(i = 1; i < section[objtype]; i++){
487*da917039SDavid du Colombier		if(!split(line[objtype, i], a))
488*da917039SDavid du Colombier			continue;
489*da917039SDavid du Colombier		if(s == "")
490*da917039SDavid du Colombier			s = a[1] ".$O";
491*da917039SDavid du Colombier		else
492*da917039SDavid du Colombier			s = s " " a[1] ".$O";
493*da917039SDavid du Colombier	}
494*da917039SDavid du Colombier
495*da917039SDavid du Colombier	return s;
496*da917039SDavid du Colombier}
497*da917039SDavid du Colombier
498*da917039SDavid du Colombierfunction mkdevlist(					a, array, i, j, n, s){
499*da917039SDavid du Colombier	for(s in section){
500*da917039SDavid du Colombier		if(line[s, 0] !~ /[ \t]\+dev[^_A-Za-z0-9]*/)
501*da917039SDavid du Colombier			continue;
502*da917039SDavid du Colombier		if(s == "dev")
503*da917039SDavid du Colombier			arrayify(array, s, "dev", ".$O", 1);
504*da917039SDavid du Colombier		else if(s == objtype)
505*da917039SDavid du Colombier			arrayify(array, s, "", ".$O", 0);
506*da917039SDavid du Colombier		else
507*da917039SDavid du Colombier			arrayify(array, s, "", ".$O", 1);
508*da917039SDavid du Colombier	}
509*da917039SDavid du Colombier
510*da917039SDavid du Colombier	return listolate(array, " ");
511*da917039SDavid du Colombier}
512*da917039SDavid du Colombier
513*da917039SDavid du Colombierfunction listolate(array, sep,				a, s){
514*da917039SDavid du Colombier	s = "";
515*da917039SDavid du Colombier	for(a in array){
516*da917039SDavid du Colombier		if(s == "")
517*da917039SDavid du Colombier			s = a;
518*da917039SDavid du Colombier		else
519*da917039SDavid du Colombier			s = a sep s;
520*da917039SDavid du Colombier	}
521*da917039SDavid du Colombier
522*da917039SDavid du Colombier	return s;
523*da917039SDavid du Colombier}
524*da917039SDavid du Colombier
525*da917039SDavid du Colombierfunction arrayify(array, tag, prefix, suffix, one,	a, i, j, n){
526*da917039SDavid du Colombier	for(i = 1; i < section[tag]; i++){
527*da917039SDavid du Colombier		n = split(line[tag, i], a);
528*da917039SDavid du Colombier		if(one)
529*da917039SDavid du Colombier			array[prefix a[1] suffix]++;
530*da917039SDavid du Colombier		for(j = 2; j <= n; j++){
531*da917039SDavid du Colombier			if(a[$j] ~ /[+=-].*/)
532*da917039SDavid du Colombier				continue;
533*da917039SDavid du Colombier			array[a[j] suffix]++;
534*da917039SDavid du Colombier		}
535*da917039SDavid du Colombier	}
536*da917039SDavid du Colombier}
537