xref: /inferno-os/os/port/mkroot (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth$AWK '
2*74a4d8c2SCharles.ForsythBEGIN{
3*74a4d8c2SCharles.Forsyth		if (ARGC < 2)
4*74a4d8c2SCharles.Forsyth			exit "usage";
5*74a4d8c2SCharles.Forsyth
6*74a4d8c2SCharles.Forsyth		conf = ARGV[1];
7*74a4d8c2SCharles.Forsyth		infernoroot = ENVIRON["ROOT"];
8*74a4d8c2SCharles.Forsyth		init = ENVIRON["INIT"];
9*74a4d8c2SCharles.Forsyth		data2s = ENVIRON["DATA2S"];
10*74a4d8c2SCharles.Forsyth		nroot = 0;
11*74a4d8c2SCharles.Forsyth}
12*74a4d8c2SCharles.Forsyth/^$/{
13*74a4d8c2SCharles.Forsyth		next;
14*74a4d8c2SCharles.Forsyth}
15*74a4d8c2SCharles.Forsyth/^#/{
16*74a4d8c2SCharles.Forsyth		next;
17*74a4d8c2SCharles.Forsyth}
18*74a4d8c2SCharles.Forsythcollect && /^[^	\t]/{
19*74a4d8c2SCharles.Forsyth		collect = 0;
20*74a4d8c2SCharles.Forsyth}
21*74a4d8c2SCharles.Forsythcollect && section ~ "root"{
22*74a4d8c2SCharles.Forsyth		dst[nroot] = $1;
23*74a4d8c2SCharles.Forsyth		if (NF > 1)
24*74a4d8c2SCharles.Forsyth			src[nroot] = infernoroot $2;
25*74a4d8c2SCharles.Forsyth		else if (dst[nroot] == "/osinit.dis")
26*74a4d8c2SCharles.Forsyth			src[nroot] = infernoroot "/os/init/" init ".dis";
27*74a4d8c2SCharles.Forsyth		else
28*74a4d8c2SCharles.Forsyth			src[nroot] = infernoroot $1;
29*74a4d8c2SCharles.Forsyth		for(i=0; i<nroot; i++)
30*74a4d8c2SCharles.Forsyth			if(dst[i] == dst[nroot])
31*74a4d8c2SCharles.Forsyth				break;
32*74a4d8c2SCharles.Forsyth		if(i == nroot)
33*74a4d8c2SCharles.Forsyth			nroot++;
34*74a4d8c2SCharles.Forsyth}
35*74a4d8c2SCharles.Forsyth$0 ~ /^[^ \t]/{
36*74a4d8c2SCharles.Forsyth		if($0 ~ "(code|dev|ether|ip|lib|link|mod|misc|port|root|vga)"){
37*74a4d8c2SCharles.Forsyth			section = $0;
38*74a4d8c2SCharles.Forsyth			collect = 1;
39*74a4d8c2SCharles.Forsyth		}
40*74a4d8c2SCharles.Forsyth		next;
41*74a4d8c2SCharles.Forsyth}
42*74a4d8c2SCharles.ForsythEND{
43*74a4d8c2SCharles.Forsyth		rootdata = conf ".root.s";
44*74a4d8c2SCharles.Forsyth		system("rm -f " rootdata);
45*74a4d8c2SCharles.Forsyth		print("/* Generated by /os/port/mkroot */") >rootdata;
46*74a4d8c2SCharles.Forsyth		close(rootdata);
47*74a4d8c2SCharles.Forsyth		isdir[0] = 1;
48*74a4d8c2SCharles.Forsyth		dotdot[0] = 0;
49*74a4d8c2SCharles.Forsyth		qid = 1;
50*74a4d8c2SCharles.Forsyth		for (i = 0; i < nroot; i++) {
51*74a4d8c2SCharles.Forsyth			ncomp = split(dst[i], comp, "/");
52*74a4d8c2SCharles.Forsyth			if (comp[1] != "" || ncomp < 2)
53*74a4d8c2SCharles.Forsyth				continue;
54*74a4d8c2SCharles.Forsyth			q = 0;
55*74a4d8c2SCharles.Forsyth			for (j = 2; j <= ncomp; j++) {
56*74a4d8c2SCharles.Forsyth				key = q "/" comp[j];
57*74a4d8c2SCharles.Forsyth				if (walk[key] == 0) {
58*74a4d8c2SCharles.Forsyth					walk[key] = qid;
59*74a4d8c2SCharles.Forsyth					dotdot[qid] = q;
60*74a4d8c2SCharles.Forsyth					q = qid++;
61*74a4d8c2SCharles.Forsyth					name[q] = comp[j];
62*74a4d8c2SCharles.Forsyth					if (j < ncomp)
63*74a4d8c2SCharles.Forsyth						isdir[q] = 1;
64*74a4d8c2SCharles.Forsyth				}
65*74a4d8c2SCharles.Forsyth				else
66*74a4d8c2SCharles.Forsyth					q = walk[key];
67*74a4d8c2SCharles.Forsyth			}
68*74a4d8c2SCharles.Forsyth			if (system("test -d " src[i]) == 0)
69*74a4d8c2SCharles.Forsyth				isdir[q] = 1;
70*74a4d8c2SCharles.Forsyth			else {
71*74a4d8c2SCharles.Forsyth				if (system(data2s " root" q " <" src[i] " >>" rootdata) != 0)
72*74a4d8c2SCharles.Forsyth					exit 1;
73*74a4d8c2SCharles.Forsyth				print("extern unsigned char root" q "code[];");
74*74a4d8c2SCharles.Forsyth				print("extern int root" q "len;");
75*74a4d8c2SCharles.Forsyth			}
76*74a4d8c2SCharles.Forsyth		}
77*74a4d8c2SCharles.Forsyth
78*74a4d8c2SCharles.Forsyth		x = 1;
79*74a4d8c2SCharles.Forsyth		sort[0] = 0;
80*74a4d8c2SCharles.Forsyth		unsort[0] = 0;
81*74a4d8c2SCharles.Forsyth		for (q = 0; q < qid; q++) {
82*74a4d8c2SCharles.Forsyth			if (isdir[q]) {
83*74a4d8c2SCharles.Forsyth				nchild[q] = 0;
84*74a4d8c2SCharles.Forsyth				for (q2 = 1; q2 < qid; q2++) {
85*74a4d8c2SCharles.Forsyth					if (dotdot[q2] == q) {
86*74a4d8c2SCharles.Forsyth						if (nchild[q]++ == 0)
87*74a4d8c2SCharles.Forsyth							child0[q] = x;
88*74a4d8c2SCharles.Forsyth						sort[q2] = x++;
89*74a4d8c2SCharles.Forsyth						unsort[sort[q2]] = q2;
90*74a4d8c2SCharles.Forsyth					}
91*74a4d8c2SCharles.Forsyth				}
92*74a4d8c2SCharles.Forsyth			}
93*74a4d8c2SCharles.Forsyth		}
94*74a4d8c2SCharles.Forsyth
95*74a4d8c2SCharles.Forsyth		print("int rootmaxq = " qid ";");
96*74a4d8c2SCharles.Forsyth
97*74a4d8c2SCharles.Forsyth		print("Dirtab roottab[" qid "] = {");
98*74a4d8c2SCharles.Forsyth		for (oq = 0; oq < qid; oq++) {
99*74a4d8c2SCharles.Forsyth			q = unsort[oq];
100*74a4d8c2SCharles.Forsyth			if (!isdir[q])
101*74a4d8c2SCharles.Forsyth				print("\t\"" name[q] "\",\t{" oq ", 0, QTFILE},\t", "0,\t0444,");
102*74a4d8c2SCharles.Forsyth			else
103*74a4d8c2SCharles.Forsyth				print("\t\"" name[q] "\",\t{" oq ", 0, QTDIR},\t", "0,\t0555,");
104*74a4d8c2SCharles.Forsyth		}
105*74a4d8c2SCharles.Forsyth		print("};");
106*74a4d8c2SCharles.Forsyth
107*74a4d8c2SCharles.Forsyth		print("Rootdata rootdata[" qid "] = {");
108*74a4d8c2SCharles.Forsyth		for (oq = 0; oq < qid; oq++) {
109*74a4d8c2SCharles.Forsyth			q = unsort[oq];
110*74a4d8c2SCharles.Forsyth			if (!isdir[q])
111*74a4d8c2SCharles.Forsyth				print("\t" sort[dotdot[q]] ",\t", "root" q "code,\t", "0,\t", "&root" q "len,");
112*74a4d8c2SCharles.Forsyth			else if (nchild[q])
113*74a4d8c2SCharles.Forsyth				print("\t" sort[dotdot[q]] ",\t", "&roottab[" child0[q] "],\t", nchild[q] ",\tnil,");
114*74a4d8c2SCharles.Forsyth			else
115*74a4d8c2SCharles.Forsyth				print("\t" sort[dotdot[q]] ",\t", "nil,\t", "0,\t", "nil,");
116*74a4d8c2SCharles.Forsyth		}
117*74a4d8c2SCharles.Forsyth		print("};");
118*74a4d8c2SCharles.Forsyth}
119*74a4d8c2SCharles.Forsyth' $1 >$1.root.h
120