| 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 |