xref: /plan9/sys/src/9/port/mkdevc (revision 4d44ba9b9ee4246ddbd96c7fcaf0918ab92ab35a)
1#!/bin/rc
2
3awk -v 'objtype='$objtype '
4BEGIN{
5		if(ARGC < 2)
6			exit
7}
8
9/^$/{
10		next;
11}
12/^#/{
13		next;
14}
15collect && /^[^ \t]/{
16		collect = 0;
17}
18collect && section ~ "dev"{
19		dev[ndev++] = $1;
20		if($1 ~ "ad")
21			devad = 1;
22		else if($1 ~ "sd")
23			devsd = 1;
24		else if($1 ~ "uart")
25			devuart = 1;
26		else if($1 ~ "vga")
27			devvga = 1;
28}
29collect && section ~ "ip"{
30		ip[nip++] = $1;
31}
32collect && section ~ "link"{
33		link[nlink++] = $1;
34}
35collect && section ~ "misc"{
36		misc[nmisc++] = $1;
37		if($1 ~ "^arch.*")
38			arch[narch++] = $1;
39		else if($1 ~ "^ad.*")
40			adifc[nadifc++] = $1;
41		else if($1 ~ "^sd.*")
42			sdifc[nsdifc++] = $1;
43		else if($1 ~ "^uart.*")
44			physuart[nphysuart++] = substr($1, 5, length($1)-4) "physuart";
45		else if($1 ~ "^vga.*"){
46			if(NF == 1)
47				vgadev[nvgadev++] = $1;
48			else for(i = 2; i <= NF; i++){
49				if($i ~ "[+]cur")
50					vgadev[nvgadev++] = $1;
51				if($i ~ "[+=]cur")
52					vgacur[nvgacur++] = $1;
53			}
54		}
55}
56
57collect && section ~ "port"{
58		port[nport++] = $0;
59}
60$0 ~ /^[^ \t]/{
61		if($0 ~ "(bootdir|dev|ip|link|misc|port)"){
62			section = $0;
63			collect = 1;
64		}
65		next;
66}
67
68END{
69		if(ARGC < 2)
70			exit "usage"
71
72		printf "#include \"u.h\"\n";
73		printf "#include \"../port/lib.h\"\n";
74		printf "#include \"mem.h\"\n";
75		printf "#include \"dat.h\"\n";
76		printf "#include \"fns.h\"\n";
77		printf "#include \"io.h\"\n";
78		printf "#include \"../port/error.h\"\n\n";
79
80		for(i = 0; i < ndev; i++)
81			printf "extern Dev %sdevtab;\n", dev[i];
82		printf "Dev* devtab[]={\n";
83		for(i = 0; i < ndev; i++)
84			printf "\t&%sdevtab,\n", dev[i];
85		printf "\tnil,\n};\n\n";
86
87
88		for(i = 0; i < nlink; i++)
89			printf "extern void %slink(void);\n", link[i];
90
91		printf "void links(void){\n";
92		print "\tbootlinks();\n";
93		for(i = 0; i < nlink; i++)
94			printf "\t%slink();\n", link[i];
95		printf "}\n\n";
96
97		if(narch || objtype ~ "386"){
98			for(i = 0; i < narch; i++)
99				printf "extern PCArch %s;\n", arch[i];
100			printf "PCArch* knownarch[] = {\n";
101			for(i = 0; i < narch; i++)
102				printf "\t&%s,\n", arch[i];
103			printf "\tnil,\n};\n\n";
104		}
105
106		if(devad){
107			printf "#include \"../port/ad.h\"\n";
108			for(i = 0; i < nadifc; i++)
109				printf "extern ADifc %sifc;\n", adifc[i];
110			printf "ADifc* adifc[] = {\n";
111		  	for(i = 0; i < nadifc; i++)
112				printf "\t&%sifc,\n", adifc[i];
113		  	printf "\tnil,\n};\n\n";
114		}
115		if(devsd){
116			printf "#include \"../port/sd.h\"\n";
117			for(i = 0; i < nsdifc; i++)
118				printf "extern SDifc %sifc;\n", sdifc[i];
119			printf "SDifc* sdifc[] = {\n";
120		  	for(i = 0; i < nsdifc; i++)
121				printf "\t&%sifc,\n", sdifc[i];
122		  	printf "\tnil,\n};\n\n";
123		}
124
125		if(devuart){
126			for(i = 0; i < nphysuart; i++)
127				printf "extern PhysUart %s;\n", physuart[i];
128			printf "PhysUart* physuart[] = {\n";
129		  	for(i = 0; i < nphysuart; i++)
130				printf "\t&%s,\n", physuart[i];
131		  	printf "\tnil,\n};\n\n";
132		}
133
134		if(devvga){
135			printf "#define	Image	IMAGE\n";
136			printf "#include <draw.h>\n";
137			printf "#include <memdraw.h>\n";
138			printf "#include <cursor.h>\n";
139			printf "#include \"screen.h\"\n";
140
141			for(i = 0; i < nvgadev; i++)
142				printf "extern VGAdev %sdev;\n", vgadev[i];
143		  	printf "VGAdev* vgadev[] = {\n";
144		  	for(i = 0; i < nvgadev; i++)
145				printf "\t&%sdev,\n", vgadev[i];
146		  	printf "\tnil,\n};\n\n";
147
148			for(i = 0; i < nvgacur; i++)
149				printf "extern VGAcur %scur;\n", vgacur[i];
150		  	printf "VGAcur* vgacur[] = {\n";
151		  	for(i = 0; i < nvgacur; i++)
152				printf "\t&%scur,\n", vgacur[i];
153		  	printf "\tnil,\n};\n\n";
154		}
155
156		if(nip){
157			printf "#include \"../ip/ip.h\"\n";
158			for(i = 0; i < nip; i++)
159				printf "extern void %sinit(Fs*);\n", ip[i];
160			printf "void (*ipprotoinit[])(Fs*) = {\n";
161			for(i = 0; i < nip; i++)
162				printf "\t%sinit,\n", ip[i];
163			printf "\tnil,\n};\n\n";
164		}
165
166		for(i = 0; i < nport; i++)
167			printf "%s\n", port[i];
168
169		printf "char* conffile = \"%s\";\n", ARGV[1];
170		printf "ulong kerndate = KERNDATE;\n";
171
172		exit
173}' $*
174