Add the inferno mkroot script
authorRonald G. Minnich <rminnich@google.com>
Fri, 31 Jan 2014 16:18:39 +0000 (08:18 -0800)
committerRonald G. Minnich <rminnich@google.com>
Fri, 31 Jan 2014 16:18:39 +0000 (08:18 -0800)
I used this to build the code currently in kern/drivers/dev/root.c

It's handy for reference. It's also no longer right for the structs
in there.

Signed-off-by: Ronald G. Minnich <rminnich@google.com>
scripts/mkroot [new file with mode: 0644]

diff --git a/scripts/mkroot b/scripts/mkroot
new file mode 100644 (file)
index 0000000..754c0cb
--- /dev/null
@@ -0,0 +1,121 @@
+awk '
+BEGIN{
+               if (ARGC < 2)
+                       exit "usage";
+
+               conf = ARGV[1];
+               infernoroot = ENVIRON["ROOT"];
+               init = ENVIRON["INIT"];
+               data2c = ENVIRON["DATA2C"];
+               if(data2c == "")
+                       data2c = "data2c"
+               nroot = 0;
+}
+/^$/{
+               next;
+}
+/^#/{
+               next;
+}
+collect && /^[^        \t]/{
+               collect = 0;
+}
+collect && section ~ "root"{
+               dst[nroot] = $1;
+               if (NF > 1)
+                       src[nroot] = infernoroot $2;
+               else if (dst[nroot] == "/osinit.dis")
+                       src[nroot] = infernoroot "/dis/" init ".dis";
+               else
+                       src[nroot] = infernoroot $1;
+               for(i=0; i<nroot; i++)
+                       if(dst[i] == dst[nroot])
+                               break;
+               if(i == nroot)
+                       nroot++;
+}
+$0 ~ /^[^ \t]/{
+               if($0 ~ "(code|dev|ether|ip|lib|link|mod|misc|port|root|vga)"){
+                       section = $0;
+                       collect = 1;
+               }
+               next;
+}
+END{
+               rootdata = conf ".root.c";
+               system("rm -f " rootdata);
+               print("/* Generated by mkroot */") >rootdata;
+               close(rootdata);
+               isdir[0] = 1;
+               dotdot[0] = 0;
+               qid = 1;
+               for (i = 0; i < nroot; i++) {
+                       ncomp = split(dst[i], comp, "/");
+                       if (comp[1] != "" || ncomp < 2)
+                               continue;
+                       q = 0;
+                       for (j = 2; j <= ncomp; j++) {
+                               key = q "/" comp[j];
+                               if (walk[key] == 0) {
+                                       walk[key] = qid;
+                                       dotdot[qid] = q;
+                                       q = qid++;
+                                       name[q] = comp[j];
+                                       if (j < ncomp)
+                                               isdir[q] = 1;
+                               }
+                               else
+                                       q = walk[key];
+                       }
+                       if (system("test -d " src[i]) == 0)
+                               isdir[q] = 1;
+                       else {
+                               if (system(data2c " root" q " <" src[i] " >>" rootdata) != 0)
+                                       exit 1;
+                               print("extern unsigned char root" q "code[];");
+                               print("extern int root" q "len;");
+                       }
+               }
+
+               x = 1;
+               sort[0] = 0;
+               unsort[0] = 0;
+               for (q = 0; q < qid; q++) {
+                       if (isdir[q]) {
+                               nchild[q] = 0;
+                               for (q2 = 1; q2 < qid; q2++) {
+                                       if (dotdot[q2] == q) {
+                                               if (nchild[q]++ == 0)
+                                                       child0[q] = x;
+                                               sort[q2] = x++;
+                                               unsort[sort[q2]] = q2;
+                                       }
+                               }
+                       }
+               }
+
+               print("int rootmaxq = " qid ";");
+
+               print("Dirtab roottab[" qid "] = {");
+               for (oq = 0; oq < qid; oq++) {
+                       q = unsort[oq];
+                       if (!isdir[q])
+                               print("\t\"" name[q] "\",\t{" oq ", 0, QTFILE},\t", "0,\t0444,");
+                       else
+                               print("\t\"" name[q] "\",\t{" oq ", 0, QTDIR},\t", "0,\t0555,");
+               }
+               print("};");
+
+               print("Rootdata rootdata[" qid "] = {");
+               for (oq = 0; oq < qid; oq++) {
+                       q = unsort[oq];
+                       if (!isdir[q])
+                               print("\t" sort[dotdot[q]] ",\t", "root" q "code,\t", "0,\t", "&root" q "len,");
+                       else if (nchild[q])
+                               print("\t" sort[dotdot[q]] ",\t", "&roottab[" child0[q] "],\t", nchild[q] ",\tnil,");
+                       else
+                               print("\t" sort[dotdot[q]] ",\t", "nil,\t", "0,\t", "nil,");
+               }
+               print("};");
+}
+' $1 >$1.root.h