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