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