xref: /plan9-contrib/sys/src/9k/mk/parse (revision 45e6af3b6d7025ef7184352bb3f6852edd8de07e)
19ef1f84bSDavid du ColombierBEGIN{
29ef1f84bSDavid du Colombier	oargc = 0;
39ef1f84bSDavid du Colombier	for(argc = 1; argc < ARGC; argc++){
49ef1f84bSDavid du Colombier		if(ARGV[argc] !~ /^-.+/ || ARGV[argc] ~ /--/)
59ef1f84bSDavid du Colombier			break;
69ef1f84bSDavid du Colombier		if(ARGV[argc] != "-D")
79ef1f84bSDavid du Colombier			oargv[ARGV[argc]] = oargc++;
89ef1f84bSDavid du Colombier		else
99ef1f84bSDavid du Colombier			DEBUG = 1;
109ef1f84bSDavid du Colombier		ARGV[argc] = "";
119ef1f84bSDavid du Colombier	}
129ef1f84bSDavid du Colombier
139ef1f84bSDavid du Colombier	objtype = ENVIRON["objtype"];
149ef1f84bSDavid du Colombier
159ef1f84bSDavid du Colombier	while(getline > 0){
169ef1f84bSDavid du Colombier		if(/^[ \t]*$/ || /^#/)
179ef1f84bSDavid du Colombier			continue;
189ef1f84bSDavid du Colombier
199ef1f84bSDavid du Colombier		if(/^[^ \t]/){
209ef1f84bSDavid du Colombier			#section[$1] = 0;
219ef1f84bSDavid du Colombier			tag = $1;
229ef1f84bSDavid du Colombier		}
239ef1f84bSDavid du Colombier		if(!tag)
249ef1f84bSDavid du Colombier			continue;
259ef1f84bSDavid du Colombier		sub(/^[ \t]*/, "");
269ef1f84bSDavid du Colombier		line[tag, section[tag]++] = $0;
279ef1f84bSDavid du Colombier	}
289ef1f84bSDavid du Colombier
299ef1f84bSDavid du Colombier	o = "";
309ef1f84bSDavid du Colombier	if(!oargc || ("-mkdevlist" in oargv)){
319ef1f84bSDavid du Colombier		s = mkdevlist();
329ef1f84bSDavid du Colombier		if(!("-mkdevlist" in oargv) || (oargc > 1))
339ef1f84bSDavid du Colombier			s = "DEVS=" s;
349ef1f84bSDavid du Colombier		o = o s "\n";
359ef1f84bSDavid du Colombier	}
369ef1f84bSDavid du Colombier	if((!oargc || ("-mkmach" in oargv)) && (objtype in section)){
379ef1f84bSDavid du Colombier		s = mkmach();
389ef1f84bSDavid du Colombier		if(!("-mkmach" in oargv) || (oargc > 1))
399ef1f84bSDavid du Colombier			s = "MACH=" s;
409ef1f84bSDavid du Colombier		o = o s "\n";
419ef1f84bSDavid du Colombier	}
429ef1f84bSDavid du Colombier	if((!oargc || ("-mklib" in oargv)) && ("lib" in section)){
439ef1f84bSDavid du Colombier		s = mklib();
449ef1f84bSDavid du Colombier		if(!("-mklib" in oargv) || (oargc > 1))
459ef1f84bSDavid du Colombier			s = "LIB=" s;
469ef1f84bSDavid du Colombier		o = o s "\n";
479ef1f84bSDavid du Colombier	}
489ef1f84bSDavid du Colombier	if((!oargc || ("-mkport" in oargv)) && ("port" in section)){
499ef1f84bSDavid du Colombier		s = mkport();
509ef1f84bSDavid du Colombier		if(!("-mkport" in oargv) || (oargc > 1))
519ef1f84bSDavid du Colombier			s = "PORT=" s;
529ef1f84bSDavid du Colombier		o = o s "\n";
539ef1f84bSDavid du Colombier	}
549ef1f84bSDavid du Colombier	if((!oargc || ("-mklinux" in oargv)) && ("linux" in section)){
559ef1f84bSDavid du Colombier		s = mklinux();
569ef1f84bSDavid du Colombier		if(!("-mklinux" in oargv) || (oargc > 1))
579ef1f84bSDavid du Colombier			s = "LINUX=" s;
589ef1f84bSDavid du Colombier		o = o s "\n";
599ef1f84bSDavid du Colombier	}
609ef1f84bSDavid du Colombier	if("dbgflg" in section){
619ef1f84bSDavid du Colombier		for(i = 1; i < section["dbgflg"]; i++){
629ef1f84bSDavid du Colombier			n = split(line["dbgflg", i], a);
639ef1f84bSDavid du Colombier			if(n < 2 || n > 4 || a[2] !~ /'[a-zA-Z]'/)
649ef1f84bSDavid du Colombier				continue;
659ef1f84bSDavid du Colombier			if(n > 2 && a[3] !~ /'[a-zA-Z]'/)
669ef1f84bSDavid du Colombier				continue;
679ef1f84bSDavid du Colombier			if(n == 4 && (a[4] < 1 || a[4] >= 128))
689ef1f84bSDavid du Colombier				continue;
699ef1f84bSDavid du Colombier			dbgc[a[1]] = a[2];
709ef1f84bSDavid du Colombier			if(n == 4)
719ef1f84bSDavid du Colombier				dbgflg[a[3]] = a[4];
729ef1f84bSDavid du Colombier			else if(n == 3)
739ef1f84bSDavid du Colombier				dbgflg[a[3]] = 1;
749ef1f84bSDavid du Colombier		}
759ef1f84bSDavid du Colombier	}
769ef1f84bSDavid du Colombier	if((!oargc || ("-mkrules" in oargv)) && ("dir" in section)){
779ef1f84bSDavid du Colombier		o = o mkrules(".", exists, a, c, "-I.");
789ef1f84bSDavid du Colombier		for(i = 1; i < section["dir"]; i++){
799ef1f84bSDavid du Colombier			n = split(line["dir", i], a);
809ef1f84bSDavid du Colombier			dir = "../" a[1];
819ef1f84bSDavid du Colombier			if(n == 1)
829ef1f84bSDavid du Colombier				a[2] = "-I.";
839ef1f84bSDavid du Colombier			s = a[2];
849ef1f84bSDavid du Colombier			o = o mkrules(dir, exists, a, c, s);
859ef1f84bSDavid du Colombier			l = listolate(a, "|");
869ef1f84bSDavid du Colombier			if(l != ""){
879ef1f84bSDavid du Colombier				o = o "^(" l ")\\.$O:R:	" dir "/\\1.s\n";
889ef1f84bSDavid du Colombier				o = o "\t$AS $AFLAGS " s " " dir "/$stem1.s\n";
899ef1f84bSDavid du Colombier			}
909ef1f84bSDavid du Colombier			l = listolate(c, "|");
919ef1f84bSDavid du Colombier			if(l != ""){
929ef1f84bSDavid du Colombier				o = o "^(" l ")\\.$O:R:	" dir "/\\1.c\n";
939ef1f84bSDavid du Colombier				o = o "\t$CC $CFLAGS " s " " dir "/$stem1.c\n";
949ef1f84bSDavid du Colombier			}
959ef1f84bSDavid du Colombier		}
969ef1f84bSDavid du Colombier	}
979ef1f84bSDavid du Colombier	if((!oargc || ("-mkrootrules" in oargv)) && ("rootdir" in section)){
989ef1f84bSDavid du Colombier		mkrootrules(name, cname, src);
999ef1f84bSDavid du Colombier		s = ARGV[argc] ".root.s:D:";
1009ef1f84bSDavid du Colombier		for(i = 1; i < section["rootdir"]; i++)
1019ef1f84bSDavid du Colombier			s = s " " src[i];
1029ef1f84bSDavid du Colombier		s = s "\n\t../mk/mkrootall\\\n";
1039ef1f84bSDavid du Colombier		for(i = 1; i < section["rootdir"]; i++)
1049ef1f84bSDavid du Colombier			s = s "\t\t" name[i] " " cname[i] " " src[i] "\\\n";
1059ef1f84bSDavid du Colombier		s = s "\t>$target\n";
1069ef1f84bSDavid du Colombier		if(section["rootdir"] > 1)
1079ef1f84bSDavid du Colombier			o = o s;
1089ef1f84bSDavid du Colombier	}
1099ef1f84bSDavid du Colombier	if((!oargc || ("-mkrrrules" in oargv)) && ("rr" in section)){
1109ef1f84bSDavid du Colombier		n = split(line["rr", 0], a);
1119ef1f84bSDavid du Colombier		if(n == 1)
1129ef1f84bSDavid du Colombier			a[2] = ARGV[argc] ".proto";
1139ef1f84bSDavid du Colombier		s = "$CONF.rr:\t../mk/mkrr $CONF " a[2] "\n";
1149ef1f84bSDavid du Colombier		s = s "\t../mk/mkrr $CONF " a[2] "\n";
1159ef1f84bSDavid du Colombier		for(i = 1; i < section["rr"]; i++)
1169ef1f84bSDavid du Colombier			s = s "$CONF.rr:\t" line["rr", i] "\n";
1179ef1f84bSDavid du Colombier		o = o s;
1189ef1f84bSDavid du Colombier	}
1199ef1f84bSDavid du Colombier	if("-mkdevc" in oargv)
1209ef1f84bSDavid du Colombier		o = o mkdevc();
1219ef1f84bSDavid du Colombier	if("-mkerrstr" in oargv)
1229ef1f84bSDavid du Colombier		o = o mkerrstr();
1239ef1f84bSDavid du Colombier	if("-mksystab" in oargv)
1249ef1f84bSDavid du Colombier		o = o mksystab();
1259ef1f84bSDavid du Colombier	if("-mkbootconf" in oargv)
1269ef1f84bSDavid du Colombier		o = o mkbootconf();
1279ef1f84bSDavid du Colombier
1289ef1f84bSDavid du Colombier	#
1299ef1f84bSDavid du Colombier	# to do:
1309ef1f84bSDavid du Colombier	#	bootmkfile
1319ef1f84bSDavid du Colombier	#	mkrootall (can it be done at all?)
1329ef1f84bSDavid du Colombier	#
1339ef1f84bSDavid du Colombier	printf o;
1349ef1f84bSDavid du Colombier
1359ef1f84bSDavid du Colombier	exit 0;
1369ef1f84bSDavid du Colombier}
1379ef1f84bSDavid du Colombier
1389ef1f84bSDavid du Colombierfunction mkbootconf(				a, n, s, t, u, c, d, p, r){
1399ef1f84bSDavid du Colombier	s = "#include <u.h>\n";
1409ef1f84bSDavid du Colombier	s = s "#include <libc.h>\n\n";
1419ef1f84bSDavid du Colombier	s = s "#include \"../boot/boot.h\"\n\n";
1429ef1f84bSDavid du Colombier	s = s "Method method[] = {\n";
1439ef1f84bSDavid du Colombier
1449ef1f84bSDavid du Colombier	c = "0";
1459ef1f84bSDavid du Colombier	d = "#S/sdC0/";
1469ef1f84bSDavid du Colombier	p = "boot";
1479ef1f84bSDavid du Colombier	r = "/root";
1489ef1f84bSDavid du Colombier
1499ef1f84bSDavid du Colombier	for(i = 0; i < section["boot"]; i++){		# NOTE: start at 0
1509ef1f84bSDavid du Colombier		n = split(line["boot", i], a);
1519ef1f84bSDavid du Colombier		if(a[1] == "boot"){
1529ef1f84bSDavid du Colombier			if(a[2] == "cpu"){
1539ef1f84bSDavid du Colombier				c = "1";
1549ef1f84bSDavid du Colombier				if(n == 4 && a[3] == "boot")
1559ef1f84bSDavid du Colombier					d = a[4];
1569ef1f84bSDavid du Colombier			}
1579ef1f84bSDavid du Colombier			else if(a[2] == "rootdir" && n == 3)
1589ef1f84bSDavid du Colombier				r = a[3];
1599ef1f84bSDavid du Colombier			else if(a[2] ~ /^(bboot|dosboot|romboot)$/){
1609ef1f84bSDavid du Colombier				c = "1";
1619ef1f84bSDavid du Colombier				p = a[2];
1629ef1f84bSDavid du Colombier			}
1639ef1f84bSDavid du Colombier			else if(a[2] == "boot" && n == 3)
1649ef1f84bSDavid du Colombier				d = a[3];
1659ef1f84bSDavid du Colombier			continue;
1669ef1f84bSDavid du Colombier		}
1679ef1f84bSDavid du Colombier		s = s "\t{ \"" a[1] "\", config" a[1] ", connect" a[1] ", ";
1689ef1f84bSDavid du Colombier		t = "nil";
1699ef1f84bSDavid du Colombier		if(n > 1){
1709ef1f84bSDavid du Colombier			u = line["boot", i];
1719ef1f84bSDavid du Colombier			if(sub(/^[_A-Za-z][_A-Za-z0-9]*[ \t]*/, "", u)){
1729ef1f84bSDavid du Colombier				if(match(u, /^".*"$/))
1739ef1f84bSDavid du Colombier					u = substr(u, RSTART+1, RLENGTH-2);
1749ef1f84bSDavid du Colombier				t = "\"" u "\"";
1759ef1f84bSDavid du Colombier			}
1769ef1f84bSDavid du Colombier		}
1779ef1f84bSDavid du Colombier		s = s t ", },\n";
1789ef1f84bSDavid du Colombier	}
1799ef1f84bSDavid du Colombier	s = s "\t{ nil },\n};\n\n";
1809ef1f84bSDavid du Colombier	s = s "int cpuflag = " c ";\n";
1819ef1f84bSDavid du Colombier	s = s "char* rootdir = \"" r "\";\n";
1829ef1f84bSDavid du Colombier	s = s "char* bootdisk = \"" d "\";\n";
1839ef1f84bSDavid du Colombier	s = s "extern void " p "(int, char**);\n\n";
1849ef1f84bSDavid du Colombier	s = s "void\nmain(int argc, char **argv)\n";
1859ef1f84bSDavid du Colombier	s = s "{\n\t" p "(argc, argv);\n}\n"
1869ef1f84bSDavid du Colombier
1879ef1f84bSDavid du Colombier	t = "int (*cfs)(int) = 0;\n";
1889ef1f84bSDavid du Colombier	for(i = 1; i < section["rootdir"]; i++){
1899ef1f84bSDavid du Colombier		if($1 !~ /\/bin\/cfs$/)
1909ef1f84bSDavid du Colombier			continue;
1919ef1f84bSDavid du Colombier		t = "int (*cfs)(int) = cache;\n";
1929ef1f84bSDavid du Colombier		break;
1939ef1f84bSDavid du Colombier	}
1949ef1f84bSDavid du Colombier	s = s t;
1959ef1f84bSDavid du Colombier
1969ef1f84bSDavid du Colombier	return s;
1979ef1f84bSDavid du Colombier}
1989ef1f84bSDavid du Colombier
1999ef1f84bSDavid du Colombierfunction mksystab(					a, i, f, n, s, t){
2009ef1f84bSDavid du Colombier	s = "#include \"u.h\"\n";
2019ef1f84bSDavid du Colombier	s = s "#include \"../port/lib.h\"\n";
2029ef1f84bSDavid du Colombier	s = s "#include \"mem.h\"\n";
2039ef1f84bSDavid du Colombier	s = s "#include \"dat.h\"\n";
2049ef1f84bSDavid du Colombier	s = s "#include \"fns.h\"\n\n";
2059ef1f84bSDavid du Colombier	s = s "#include \"/sys/src/libc/9syscall/sys.h\"\n\n";
2069ef1f84bSDavid du Colombier
2079ef1f84bSDavid du Colombier	t = "";
2089ef1f84bSDavid du Colombier	while(getline < "/sys/src/libc/9syscall/sys.h"){
2099ef1f84bSDavid du Colombier		if($1 != "#define" || NF != 3)
2109ef1f84bSDavid du Colombier			continue;
2119ef1f84bSDavid du Colombier
2129ef1f84bSDavid du Colombier		f = "sys" tolower($2);
2139ef1f84bSDavid du Colombier		if($2 == "SYSR1")
2149ef1f84bSDavid du Colombier			f = "sysr1";
2159ef1f84bSDavid du Colombier		if($2 == "RENDEZVOUS")
2169ef1f84bSDavid du Colombier			n = "Rendez";
2179ef1f84bSDavid du Colombier		else if($2 == "BRK_")
2189ef1f84bSDavid du Colombier			n = "Brk";
2199ef1f84bSDavid du Colombier		else
2209ef1f84bSDavid du Colombier			n = substr($2, 1, 1) tolower(substr($2, 2));
2219ef1f84bSDavid du Colombier
2229ef1f84bSDavid du Colombier		s = s "extern void " f "(Ar0*, va_list);\n";
2239ef1f84bSDavid du Colombier		t = t "\t[" $2 "]\t";
2249ef1f84bSDavid du Colombier		if(length($2) < 6)
2259ef1f84bSDavid du Colombier			t = t "\t";
2269ef1f84bSDavid du Colombier		t = t "{ \"" n "\", " f ", ";
2279ef1f84bSDavid du Colombier		#
2289ef1f84bSDavid du Colombier		# The following should really be defined properly in the
2299ef1f84bSDavid du Colombier		# manual and code, but changing Plan 9 now is too awkward.
2309ef1f84bSDavid du Colombier		# It will matter more when sizeof(long) != sizeof(int).
2319ef1f84bSDavid du Colombier		#
2329ef1f84bSDavid du Colombier		# if($2 ~ "^(FVERSION|STAT|FSTAT|WSTAT|FWSTAT|AWAIT)$")
2339ef1f84bSDavid du Colombier		#	t = t "{ .u = 0 } },\n";
2349ef1f84bSDavid du Colombier		#
2359ef1f84bSDavid du Colombier		# if($2 ~ "^(BIND|_MOUNT|MOUNT)$")
2369ef1f84bSDavid du Colombier		#	t = t "{ .l = -1 } },\n";
2379ef1f84bSDavid du Colombier		#
2389ef1f84bSDavid du Colombier		# The "^(...)$" are to ensure only exact matches are made.
2399ef1f84bSDavid du Colombier		#
2409ef1f84bSDavid du Colombier		if($2 ~ "^(EXEC|SEGBRK|SEGATTACH|RENDEZVOUS)$")
2419ef1f84bSDavid du Colombier			t = t "{ .v = (void*)-1 } },\n";
2429ef1f84bSDavid du Colombier		else if($2 ~ "^(ALARM|_READ|_WRITE|PREAD|PWRITE)$")
2439ef1f84bSDavid du Colombier			t = t "{ .l = -1 } },\n";
2445891e653SDavid du Colombier		else if($2 ~ "(NSEC)")
2455891e653SDavid du Colombier			t = t "{ .vl = -1LL } },\n";
2469ef1f84bSDavid du Colombier		else
2479ef1f84bSDavid du Colombier			t = t "{ .i = -1 } },\n";
2489ef1f84bSDavid du Colombier	}
2499ef1f84bSDavid du Colombier	if("syscall" in section){
2509ef1f84bSDavid du Colombier		for(i = 1; i < section["syscall"]; i++){
2519ef1f84bSDavid du Colombier			if(split(line["syscall", i], a) != 8)
2529ef1f84bSDavid du Colombier				continue;
2539ef1f84bSDavid du Colombier			if(line["syscall", i] !~ /#define.*{ \.[ilpuv] = .* }$/)
2549ef1f84bSDavid du Colombier				continue;
2559ef1f84bSDavid du Colombier
2569ef1f84bSDavid du Colombier			f = "sys" tolower(a[2]);
2579ef1f84bSDavid du Colombier			n = substr(a[2], 1, 1) tolower(substr(a[2], 2));
2589ef1f84bSDavid du Colombier
2599ef1f84bSDavid du Colombier			s = s "\nSyscall " f ";\n";
2609ef1f84bSDavid du Colombier			t = t a[1] " " a[2] "\t" a[3] "\n\t[" a[2] "]\t";
2619ef1f84bSDavid du Colombier			if(length(a[2]) < 6)
2629ef1f84bSDavid du Colombier				t = t "\t";
2639ef1f84bSDavid du Colombier			split(line["syscall", i], a, "{");
2649ef1f84bSDavid du Colombier			t = t "{ \"" n "\", " f ", {" a[2] " },\n";
2659ef1f84bSDavid du Colombier		}
2669ef1f84bSDavid du Colombier	}
2679ef1f84bSDavid du Colombier	s = s "struct {\n\tchar*\tn;\n\tvoid (*f)(Ar0*, va_list);\n\tAr0\tr;\n}";
2689ef1f84bSDavid du Colombier	s = s " systab[] = {\n" t "};\n\nint nsyscall = nelem(systab);\n";
2699ef1f84bSDavid du Colombier
2709ef1f84bSDavid du Colombier	return s;
2719ef1f84bSDavid du Colombier}
2729ef1f84bSDavid du Colombier
2739ef1f84bSDavid du Colombierfunction mkerrstr(					a, s){
2749ef1f84bSDavid du Colombier	FS="[ \t;]+";
2759ef1f84bSDavid du Colombier	while(getline < "../port/error.h"){
2769ef1f84bSDavid du Colombier		split($0, a, /\/\* | \*\//);
2779ef1f84bSDavid du Colombier		s = s $2 " " $3 " = \"" a[2] "\";\n";
2789ef1f84bSDavid du Colombier	}
2799ef1f84bSDavid du Colombier	FS=" ";
2809ef1f84bSDavid du Colombier
2819ef1f84bSDavid du Colombier	return s;
2829ef1f84bSDavid du Colombier}
2839ef1f84bSDavid du Colombier
2849ef1f84bSDavid du Colombierfunction mkdevc(		a, d, i, m, n, s, t, u, name, cname){
2859ef1f84bSDavid du Colombier	s = "#include \"u.h\"\n";
2869ef1f84bSDavid du Colombier	s = s "#include \"../port/lib.h\"\n";
2879ef1f84bSDavid du Colombier	s = s "#include \"mem.h\"\n";
2889ef1f84bSDavid du Colombier	s = s "#include \"dat.h\"\n";
2899ef1f84bSDavid du Colombier	s = s "#include \"fns.h\"\n";
2909ef1f84bSDavid du Colombier	s = s "#include \"../port/error.h\"\n\n";
2919ef1f84bSDavid du Colombier	s = s "#include \"io.h\"\n\n";
2929ef1f84bSDavid du Colombier
2939ef1f84bSDavid du Colombier	t = "";
2949ef1f84bSDavid du Colombier	for(i = 1; i < section["dev"]; i++){
2959ef1f84bSDavid du Colombier		split(line["dev", i], a);
2969ef1f84bSDavid du Colombier		s = s "extern Dev " a[1] "devtab;\n";
2979ef1f84bSDavid du Colombier		t = t "\t&" a[1] "devtab,\n";
2989ef1f84bSDavid du Colombier		d[a[1]]++;
2999ef1f84bSDavid du Colombier	}
3009ef1f84bSDavid du Colombier	s = s "Dev* devtab[] = {\n" t "\tnil,\n};\n\n";
3019ef1f84bSDavid du Colombier
3029ef1f84bSDavid du Colombier	if(!("acpi" in d))
3039ef1f84bSDavid du Colombier		s = s "int\nacpiinit(void)\n{\n\treturn -1;\n}\n\n";
3049ef1f84bSDavid du Colombier
3059ef1f84bSDavid du Colombier	mkrootrules(name, cname, m);
3069ef1f84bSDavid du Colombier	t = "";
3079ef1f84bSDavid du Colombier	for(i = 1; i < section["rootdir"]; i++){
3089ef1f84bSDavid du Colombier		s = s "extern uchar " cname[i] "code[];\n";
3099ef1f84bSDavid du Colombier		s = s "extern usize " cname[i] "len;\n";
3109ef1f84bSDavid du Colombier		t = t "\taddbootfile(\"" name[i] "\", " cname[i] "code, " cname[i] "len);\n";
3119ef1f84bSDavid du Colombier	}
3129ef1f84bSDavid du Colombier	for(i = 1; i < section["link"]; i++){
3139ef1f84bSDavid du Colombier		split(line["link", i], a);
3149ef1f84bSDavid du Colombier		s = s "extern void " a[1] "link(void);\n";
3159ef1f84bSDavid du Colombier		t = t "\t" a[1] "link();\n";
3169ef1f84bSDavid du Colombier	}
3179ef1f84bSDavid du Colombier	s = s "void\nlinks(void)\n{\n" t "}\n\n";
3189ef1f84bSDavid du Colombier
3199ef1f84bSDavid du Colombier	if("ip" in d && "ip" in section){
3209ef1f84bSDavid du Colombier		t = "";
3219ef1f84bSDavid du Colombier		s = s "#include \"../ip/ip.h\"\n";
3229ef1f84bSDavid du Colombier		for(i = 1; i < section["ip"]; i++){
3239ef1f84bSDavid du Colombier			split(line["ip", i], a);
3249ef1f84bSDavid du Colombier			s = s "extern void " a[1] "init(Fs*);\n";
3259ef1f84bSDavid du Colombier			t = t "\t" a[1] "init,\n";
3269ef1f84bSDavid du Colombier		}
3279ef1f84bSDavid du Colombier		s = s "void (*ipprotoinit[])(Fs*) = {\n" t "\tnil,\n};\n\n";
3289ef1f84bSDavid du Colombier	}
3299ef1f84bSDavid du Colombier
3309ef1f84bSDavid du Colombier	if("sd" in d && "sd" in section){
3319ef1f84bSDavid du Colombier		t = "";
3329ef1f84bSDavid du Colombier		s = s "#include \"../port/sd.h\"\n";
3339ef1f84bSDavid du Colombier		for(i = 1; i < section["sd"]; i++){
3349ef1f84bSDavid du Colombier			split(line["sd", i], a);
3359ef1f84bSDavid du Colombier			s = s "extern SDifc " a[1] "ifc;\n";
3369ef1f84bSDavid du Colombier			t = t  "\t&" a[1] "ifc,\n";
3379ef1f84bSDavid du Colombier		}
3389ef1f84bSDavid du Colombier		s = s "SDifc* sdifc[] = {\n" t "\tnil,\n};\n\n";
3399ef1f84bSDavid du Colombier	}
3409ef1f84bSDavid du Colombier
3419ef1f84bSDavid du Colombier	if("uart" in d && "uart" in section){
3429ef1f84bSDavid du Colombier		t = "";
3439ef1f84bSDavid du Colombier		for(i = 1; i < section["uart"]; i++){
3449ef1f84bSDavid du Colombier			split(line["uart", i], a);
3459ef1f84bSDavid du Colombier			a[1] = substr(a[1], 5, length(a[1])-4) "physuart";
3469ef1f84bSDavid du Colombier			s = s "extern PhysUart " a[1] ";\n";
3479ef1f84bSDavid du Colombier			t = t  "\t&" a[1] ",\n";
3489ef1f84bSDavid du Colombier		}
3499ef1f84bSDavid du Colombier		s = s "PhysUart* physuart[] = {\n" t "\tnil,\n};\n\n";
3509ef1f84bSDavid du Colombier	}
3519ef1f84bSDavid du Colombier
352*45e6af3bSDavid du Colombier	if("vga" in d && "vga" in section){
353*45e6af3bSDavid du Colombier		s = s "#define	Image	IMAGE\n"
354*45e6af3bSDavid du Colombier		s = s "#include <draw.h>\n"
355*45e6af3bSDavid du Colombier		s = s "#include <memdraw.h>\n"
356*45e6af3bSDavid du Colombier		s = s "#include <cursor.h>\n"
357*45e6af3bSDavid du Colombier		s = s "#include \"screen.h\"\n"
358*45e6af3bSDavid du Colombier
359*45e6af3bSDavid du Colombier		t = "";
360*45e6af3bSDavid du Colombier		for(i = 1; i < section["vga"]; i++){
361*45e6af3bSDavid du Colombier			split(line["vga", i], a);
362*45e6af3bSDavid du Colombier			s = s "extern VGAdev " a[1]"dev;\n";
363*45e6af3bSDavid du Colombier			t = t  "\t&" a[1] "dev,\n";
364*45e6af3bSDavid du Colombier		}
365*45e6af3bSDavid du Colombier		s = s "VGAdev *vgadev[] = {\n" t "\tnil,\n};\n\n"
366*45e6af3bSDavid du Colombier
367*45e6af3bSDavid du Colombier		t = "	&swcursor, \n"
368*45e6af3bSDavid du Colombier		s = s "extern VGAcur swcursor;\n";
369*45e6af3bSDavid du Colombier		s = s "VGAcur *vgacur[] = {\n" t "\tnil,\n};\n\n"
370*45e6af3bSDavid du Colombier
371*45e6af3bSDavid du Colombier	}
372*45e6af3bSDavid du Colombier
3739ef1f84bSDavid du Colombier	t = "";
3749ef1f84bSDavid du Colombier	n = 0;
3759ef1f84bSDavid du Colombier	if("physseg" in section){
3769ef1f84bSDavid du Colombier		for(i = 1; i < section["physseg"]; i++){
3779ef1f84bSDavid du Colombier			u = line["physseg", i];
3789ef1f84bSDavid du Colombier			if(u ~ /^\.[_A-Za-z][_A-Za-z0-9]*/)
3799ef1f84bSDavid du Colombier				t = t "\t";
3809ef1f84bSDavid du Colombier			t = t "\t" u "\n";
3819ef1f84bSDavid du Colombier			if(sub(/.*\.pgalloc.*=[^_A-Za-z]*/, "", u)){
3829ef1f84bSDavid du Colombier				if(match(u, /^[_A-Za-z][_A-Za-z0-9]*/)){
3839ef1f84bSDavid du Colombier					u = substr(u, RSTART, RLENGTH);
3849ef1f84bSDavid du Colombier					s = s "extern Page *(*" u ")(Segment*, uintptr);\n";
3859ef1f84bSDavid du Colombier				}
3869ef1f84bSDavid du Colombier			}
3879ef1f84bSDavid du Colombier			else if(sub(/.*\.pgfree.*=[^_A-Za-z]*/, "", u)){
3889ef1f84bSDavid du Colombier				if(match(u, /^[_A-Za-z][_A-Za-z0-9]*/)){
3899ef1f84bSDavid du Colombier					u = substr(u, RSTART, RLENGTH);
3909ef1f84bSDavid du Colombier					s = s "extern void (*" u ")(Page*);\n";
3919ef1f84bSDavid du Colombier				}
3929ef1f84bSDavid du Colombier			}
3939ef1f84bSDavid du Colombier			if(match(u, /}/))
3949ef1f84bSDavid du Colombier				n++;
3959ef1f84bSDavid du Colombier		}
3969ef1f84bSDavid du Colombier	}
3979ef1f84bSDavid du Colombier	s = s "Physseg physseg[" n+8 "] = {\n";
3989ef1f84bSDavid du Colombier	s = s "\t{\t.attr\t= SG_SHARED,\n";
3999ef1f84bSDavid du Colombier	s = s "\t\t.name\t= \"shared\",\n";
4009ef1f84bSDavid du Colombier	s = s "\t\t.size\t= SEGMAXSIZE,\n\t},\n";
4019ef1f84bSDavid du Colombier	s = s "\t{\t.attr\t= SG_BSS,\n";
4029ef1f84bSDavid du Colombier	s = s "\t\t.name\t= \"memory\",\n";
4039ef1f84bSDavid du Colombier	s = s "\t\t.size\t= SEGMAXSIZE,\n\t},\n";
4049ef1f84bSDavid du Colombier	s = s t "};\nint nphysseg = " n+8 ";\n\n";
4059ef1f84bSDavid du Colombier
4069ef1f84bSDavid du Colombier	s = s "char dbgflg[256]";
4079ef1f84bSDavid du Colombier	t = "";
4089ef1f84bSDavid du Colombier	for(u in dbgflg)
4099ef1f84bSDavid du Colombier		t = t "\t[" u "]\t" dbgflg[u] ",\n";
4109ef1f84bSDavid du Colombier	if(t != "")
4119ef1f84bSDavid du Colombier		s = s " = {\n" t "}";
4129ef1f84bSDavid du Colombier	s = s ";\n\n";
4139ef1f84bSDavid du Colombier
4149ef1f84bSDavid du Colombier	for(i in m)
4159ef1f84bSDavid du Colombier		delete m[i];
4169ef1f84bSDavid du Colombier
4179ef1f84bSDavid du Colombier	for(i = 1; i < section["misc"]; i++){
4189ef1f84bSDavid du Colombier		split(line["misc", i], a);
4199ef1f84bSDavid du Colombier		m[a[1]] = line["misc", i];
4209ef1f84bSDavid du Colombier	}
4219ef1f84bSDavid du Colombier	if(!("rdb" in m)){
4229ef1f84bSDavid du Colombier		s = s "void\n";
4239ef1f84bSDavid du Colombier		s = s "rdb(void)\n";
4249ef1f84bSDavid du Colombier		s = s "{\n";
4259ef1f84bSDavid du Colombier		s = s "\tsplhi();\n";
4269ef1f84bSDavid du Colombier		s = s "\tiprint(\"rdb...not installed\\n\");\n";
4279ef1f84bSDavid du Colombier		s = s "\tfor(;;);\n";
4289ef1f84bSDavid du Colombier		s = s "}\n\n";
4299ef1f84bSDavid du Colombier	}
4309ef1f84bSDavid du Colombier	if(objtype == "power"){
4319ef1f84bSDavid du Colombier		for(i = 1; i < section[objtype]; i++){
4329ef1f84bSDavid du Colombier			split(line[objtype, i], a);
4339ef1f84bSDavid du Colombier			m[a[1]] = line[objtype, i];
4349ef1f84bSDavid du Colombier		}
4359ef1f84bSDavid du Colombier		if(!("cnksyscall" in m)){
4369ef1f84bSDavid du Colombier			s = s "void\n";
4379ef1f84bSDavid du Colombier			s = s "cnksyscall(Ureg*)\n";
4389ef1f84bSDavid du Colombier			s = s "{\n";
4399ef1f84bSDavid du Colombier			s = s "\tpanic(\"cnkemu...not installed\\n\");\n";
4409ef1f84bSDavid du Colombier			s = s "\tfor(;;);\n";
4419ef1f84bSDavid du Colombier			s = s "}\n\n";
4429ef1f84bSDavid du Colombier			s = s "void*\n";
4439ef1f84bSDavid du Colombier			s = s "cnksysexecregs(uintptr, ulong, ulong)\n";
4449ef1f84bSDavid du Colombier			s = s "{\n";
4459ef1f84bSDavid du Colombier			s = s "\tpanic(\"cnkemu...not installed\\n\");\n";
4469ef1f84bSDavid du Colombier			s = s "\tfor(;;);\n";
4479ef1f84bSDavid du Colombier			s = s "}\n\n";
4489ef1f84bSDavid du Colombier		}
4499ef1f84bSDavid du Colombier	}
4509ef1f84bSDavid du Colombier	if("conf" in section){
4519ef1f84bSDavid du Colombier		for(i = 1; i < section["conf"]; i++)
4529ef1f84bSDavid du Colombier			s = s line["conf", i] "\n";
4539ef1f84bSDavid du Colombier		s = s "\n";
4549ef1f84bSDavid du Colombier	}
4559ef1f84bSDavid du Colombier	t = ".";
4569ef1f84bSDavid du Colombier	while("pwd" | getline > 0){
4579ef1f84bSDavid du Colombier		if($0 ~ /^\//)
4589ef1f84bSDavid du Colombier			t = $0;
4599ef1f84bSDavid du Colombier	}
4609ef1f84bSDavid du Colombier	s = s "char* conffile = \"" t "/" ARGV[argc] "\";\n";
4619ef1f84bSDavid du Colombier	s = s "ulong kerndate = KERNDATE;\n";
4629ef1f84bSDavid du Colombier
4639ef1f84bSDavid du Colombier	return s;
4649ef1f84bSDavid du Colombier}
4659ef1f84bSDavid du Colombier
4669ef1f84bSDavid du Colombierfunction mkrootrules(name, cname, src,			a, i, n){
4679ef1f84bSDavid du Colombier	for(i = 1; i < section["rootdir"]; i++){
4689ef1f84bSDavid du Colombier		n = split(line["rootdir", i], a);
4699ef1f84bSDavid du Colombier		if(n >= 2)
4709ef1f84bSDavid du Colombier			name[i] = a[2];
4719ef1f84bSDavid du Colombier		else
4729ef1f84bSDavid du Colombier			name[i] = a[1];
4739ef1f84bSDavid du Colombier		sub(/.*\//, "", name[i]);
4749ef1f84bSDavid du Colombier		cname[i] = a[1];
4759ef1f84bSDavid du Colombier		gsub(/[^a-zA-Z0-9_]/, "_", cname[i]);
4769ef1f84bSDavid du Colombier		src[i] = a[1];
4779ef1f84bSDavid du Colombier	}
4789ef1f84bSDavid du Colombier}
4799ef1f84bSDavid du Colombier
4809ef1f84bSDavid du Colombierfunction mkrules(dir, exists, ameta, cmeta, flags,		f, i, s, t){
4819ef1f84bSDavid du Colombier	for(i in ameta)
4829ef1f84bSDavid du Colombier		delete ameta[i];
4839ef1f84bSDavid du Colombier	for(i in cmeta)
4849ef1f84bSDavid du Colombier		delete cmeta[i];
4859ef1f84bSDavid du Colombier
4869ef1f84bSDavid du Colombier	s = "";
4879ef1f84bSDavid du Colombier	while("cd " dir "; /bin/ls *.[cs]" | getline > 0){
4889ef1f84bSDavid du Colombier		if($0 !~ /^[A-Za-z0-9]*\.[cs]$/)
4899ef1f84bSDavid du Colombier			continue;
4909ef1f84bSDavid du Colombier		f = $0;
4919ef1f84bSDavid du Colombier		if(!sub(/\.[cs]$/, ""))
4929ef1f84bSDavid du Colombier			continue;
4939ef1f84bSDavid du Colombier		if($0 in exists)
4949ef1f84bSDavid du Colombier			continue;
4959ef1f84bSDavid du Colombier		exists[$0] = dir;
4969ef1f84bSDavid du Colombier		if(f ~ /\.c$/){
4979ef1f84bSDavid du Colombier			if(!($0 in dbgc)){
49857ff190cSDavid du Colombier				cmeta[cmeta["k"]++] = $0
4999ef1f84bSDavid du Colombier				continue;
5009ef1f84bSDavid du Colombier			}
5019ef1f84bSDavid du Colombier			t = "$CC $CFLAGS " flags;
5029ef1f84bSDavid du Colombier		}
5039ef1f84bSDavid du Colombier		else{
5049ef1f84bSDavid du Colombier			if(!($0 in dbgc)){
50557ff190cSDavid du Colombier				ameta[ameta["k"]++] = $0
5069ef1f84bSDavid du Colombier				continue;
5079ef1f84bSDavid du Colombier			}
5089ef1f84bSDavid du Colombier			t = "$AS $AFLAGS " flags;
5099ef1f84bSDavid du Colombier		}
5109ef1f84bSDavid du Colombier		s = s $0 ".$O:\t" dir "/" f "\n";
5119ef1f84bSDavid du Colombier		s = s "\t" t " -D'_DBGC_='" dbgc[$0] "'' " dir "/" f "\n";
5129ef1f84bSDavid du Colombier	}
5139ef1f84bSDavid du Colombier	return s;
5149ef1f84bSDavid du Colombier}
5159ef1f84bSDavid du Colombier
5169ef1f84bSDavid du Colombierfunction mklinux(					array){
5179ef1f84bSDavid du Colombier	arrayify(array, "linux", "", ".$O", 1);
5189ef1f84bSDavid du Colombier
5199ef1f84bSDavid du Colombier	return listolate(array, " ");
5209ef1f84bSDavid du Colombier}
5219ef1f84bSDavid du Colombier
5229ef1f84bSDavid du Colombierfunction mkport(					array){
5239ef1f84bSDavid du Colombier	arrayify(array, "port", "", ".$O", 1);
5249ef1f84bSDavid du Colombier
5259ef1f84bSDavid du Colombier	return listolate(array, " ");
5269ef1f84bSDavid du Colombier}
5279ef1f84bSDavid du Colombier
5289ef1f84bSDavid du Colombierfunction mklib(						array){
5299ef1f84bSDavid du Colombier	arrayify(array, "lib", "/$objtype/lib/", ".a", 1);
5309ef1f84bSDavid du Colombier
5319ef1f84bSDavid du Colombier	return listolate(array," ");
5329ef1f84bSDavid du Colombier}
5339ef1f84bSDavid du Colombier
5349ef1f84bSDavid du Colombierfunction mkmach(					a, i, s){
5359ef1f84bSDavid du Colombier	s = "";
5369ef1f84bSDavid du Colombier	for(i = 1; i < section[objtype]; i++){
5379ef1f84bSDavid du Colombier		if(!split(line[objtype, i], a))
5389ef1f84bSDavid du Colombier			continue;
5399ef1f84bSDavid du Colombier		if(s == "")
5409ef1f84bSDavid du Colombier			s = a[1] ".$O";
5419ef1f84bSDavid du Colombier		else
5429ef1f84bSDavid du Colombier			s = s " " a[1] ".$O";
5439ef1f84bSDavid du Colombier	}
5449ef1f84bSDavid du Colombier
5459ef1f84bSDavid du Colombier	return s;
5469ef1f84bSDavid du Colombier}
5479ef1f84bSDavid du Colombier
5489ef1f84bSDavid du Colombierfunction mkdevlist(					a, array, i, j, n, s){
5499ef1f84bSDavid du Colombier	for(s in section){
5509ef1f84bSDavid du Colombier		if(line[s, 0] !~ /[ \t]\+dev[^_A-Za-z0-9]*/)
5519ef1f84bSDavid du Colombier			continue;
5529ef1f84bSDavid du Colombier		if(s == "dev")
5539ef1f84bSDavid du Colombier			arrayify(array, s, "dev", ".$O", 1);
5549ef1f84bSDavid du Colombier		else if(s == objtype)
5559ef1f84bSDavid du Colombier			arrayify(array, s, "", ".$O", 0);
5569ef1f84bSDavid du Colombier		else
5579ef1f84bSDavid du Colombier			arrayify(array, s, "", ".$O", 1);
5589ef1f84bSDavid du Colombier	}
5599ef1f84bSDavid du Colombier
5609ef1f84bSDavid du Colombier	return listolate(array, " ");
5619ef1f84bSDavid du Colombier}
5629ef1f84bSDavid du Colombier
56357ff190cSDavid du Colombierfunction listolate(array, sep,				i, n, a, s){
56457ff190cSDavid du Colombier	n = array["k"]
56557ff190cSDavid du Colombier	if(n == 0)
56657ff190cSDavid du Colombier		return ""
56757ff190cSDavid du Colombier	s = array[0]
56857ff190cSDavid du Colombier	for(i = 1; i < n; i++)
56957ff190cSDavid du Colombier		s = s sep array[i]
5709ef1f84bSDavid du Colombier	return s;
5719ef1f84bSDavid du Colombier}
5729ef1f84bSDavid du Colombier
57357ff190cSDavid du Colombierfunction unique(array, n, s,					i){
57457ff190cSDavid du Colombier	for(i = 0; i < n; i++)
57557ff190cSDavid du Colombier		if(array[i] == s)
57657ff190cSDavid du Colombier			return 0
57757ff190cSDavid du Colombier	return 1
57857ff190cSDavid du Colombier}
57957ff190cSDavid du Colombier
58057ff190cSDavid du Colombierfunction arrayify(array, tag, prefix, suffix, one,	a, i, j, k, n){
58157ff190cSDavid du Colombier	k = 0;
58257ff190cSDavid du Colombier	if(array["k"] > k)
58357ff190cSDavid du Colombier		k = array["k"]
5849ef1f84bSDavid du Colombier	for(i = 1; i < section[tag]; i++){
5859ef1f84bSDavid du Colombier		n = split(line[tag, i], a);
5869ef1f84bSDavid du Colombier		if(one)
58757ff190cSDavid du Colombier			array[k++] = prefix a[1] suffix
5889ef1f84bSDavid du Colombier		for(j = 2; j <= n; j++){
5899ef1f84bSDavid du Colombier			if(a[$j] ~ /[+=-].*/)
5909ef1f84bSDavid du Colombier				continue;
59157ff190cSDavid du Colombier			if(unique(array, k, a[j] suffix))
59257ff190cSDavid du Colombier				array[k++] = a[j] suffix
5939ef1f84bSDavid du Colombier		}
5949ef1f84bSDavid du Colombier	}
59557ff190cSDavid du Colombier	array["k"] = k
5969ef1f84bSDavid du Colombier}
597