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