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