1$AWK -v 'objtype='$OBJTYPE ' 2BEGIN{ 3 if(ARGC < 2) 4 exit 5} 6 7/^$/{ 8 next; 9} 10/^#/{ 11 next; 12} 13collect && /^[^ \t]/{ 14 collect = 0; 15} 16collect && section ~ "dev"{ 17 dev[ndev++] = $1; 18 if($1 ~ "vga") 19 devvga = 1; 20} 21collect && section ~ "ip"{ 22 ip[nip++] = $1; 23} 24collect && (section ~ "ether" || section ~ "link") { 25 link[nlink++] = $1; 26} 27collect && section ~ "mod"{ 28 mod[nmod++] = $1; 29} 30collect && section ~ "vga"{ 31 option = 0; 32 for(i = 2; i < NF; i++){ 33 if($i ~ "[+]hwgc"){ 34 hwgc[nhwgc++] = $1; 35 option = 1; 36 } else if($i ~ "[+=]hwgc"){ 37 hwgc[nhwgc++] = $1; 38 if(option == 0) 39 option = 2; 40 } 41 } 42 if(option < 2) 43 vga[nvga++] = $1; 44} 45collect && section ~ "misc"{ 46 misc[nmisc++] = $1; 47 if($1 ~ "^arch.*") 48 arch[narch++] = $1; 49 else if($1 ~ "^sd.*") 50 sdifc[nsdifc++] = $1; 51 else if($1 ~ "^uart.*") 52 physuart[nphysuart++] = substr($1, 5, length($1)-4) "physuart"; 53 else if($1 ~ "^vga.*"){ 54 if(NF == 1) 55 vgadev[nvgadev++] = $1; 56 else for(i = 2; i <= NF; i++){ 57 if($i ~ "[+]cur") 58 vgadev[nvgadev++] = $1; 59 if($i ~ "[+=]cur") 60 vgacur[nvgacur++] = $1; 61 } 62 } 63 else if($1 ~ ".*\.root"){ 64 x = substr($1, 1, index($1, ".")-1); 65 if(x ~ "(dossrv|kfs)") 66 x = "fs"; 67 fs[nfs++] = x; 68 } 69} 70collect && section ~ "port"{ 71 port[nport++] = $0; 72} 73collect && section ~ "code"{ 74 code[ncode++] = $0; 75} 76$0 ~ /^[^ \t]/{ 77 if($0 ~ "(code|dev|ether|ip|lib|link|mod|misc|port|root|vga)"){ 78 section = $0; 79 collect = 1; 80 } 81 next; 82} 83 84END{ 85 if(ARGC < 2) 86 exit "usage" 87 88 printf "#include \"u.h\"\n" 89 printf "#include \"../port/lib.h\"\n" 90 printf "#include \"mem.h\"\n" 91 printf "#include \"dat.h\"\n" 92 printf "#include \"fns.h\"\n" 93 printf "#include \"io.h\"\n" 94 if(nphysuart) 95 printf "#include \"../port/uart.h\"\n" 96 printf "#include \"../port/error.h\"\n" 97 printf "#include \"interp.h\"\n\n" 98 printf "#include \"%s.root.h\"\n\n", ARGV[1]; 99 100 printf "ulong ndevs = %d;\n", ndev+8 101 for(i = 0; i < ndev; i++) 102 printf "extern Dev %sdevtab;\n", dev[i]; 103 printf "Dev* devtab[%d]={\n", ndev+8 104 for(i = 0; i < ndev; i++) 105 printf "\t&%sdevtab,\n", dev[i]; 106 printf "\tnil,\n};\n\n"; 107 108 109 for(i = 0; i < nfs; i++){ 110 printf "extern uchar %scode[];\n", fs[i]; 111 printf "extern ulong %slen;\n", fs[i]; 112 } 113 for(i = 0; i < nlink; i++) 114 printf "extern void %slink(void);\n", link[i]; 115 116 printf "void links(void){\n"; 117 for(i = 0; i < nfs; i++) 118 printf "\taddrootfile(\"%s\", %scode, %slen);\n", fs[i], fs[i], fs[i]; 119 for(i = 0; i < nlink; i++) 120 printf "\t%slink();\n", link[i]; 121 printf "}\n\n"; 122 123 for(i = 0; i < nmod; i++) 124 printf "extern void %smodinit(void);\n", mod[i]; 125 printf "void modinit(void){\n"; 126 for(i = 0; i < nmod; i++) 127 printf("\t%smodinit();\n",mod[i]); 128 printf("}\n\n"); 129 130 if(narch || objtype ~ "386"){ 131 for(i = 0; i < narch; i++) 132 printf "extern PCArch %s;\n", arch[i]; 133 printf "PCArch* knownarch[] = {\n"; 134 for(i = 0; i < narch; i++) 135 printf "\t&%s,\n", arch[i]; 136 printf "\tnil,\n};\n\n"; 137 } 138 139 if(nsdifc){ 140 printf "#include \"../port/sd.h\"\n"; 141 for(i = 0; i < nsdifc; i++) 142 printf "extern SDifc %sifc;\n", sdifc[i]; 143 printf "SDifc* sdifc[] = {\n"; 144 for(i = 0; i < nsdifc; i++) 145 printf "\t&%sifc,\n", sdifc[i]; 146 printf "\tnil,\n};\n\n"; 147 } 148 149 if(nphysuart){ 150 for(i = 0; i < nphysuart; i++) 151 printf "extern PhysUart %s;\n", physuart[i]; 152 printf "PhysUart* physuart[] = {\n"; 153 for(i = 0; i < nphysuart; i++) 154 printf "\t&%s,\n", physuart[i]; 155 printf "\tnil,\n};\n\n"; 156 } 157 158 if(devvga || nvga || nvgadev){ 159 printf "#include <draw.h>\n" 160 printf "#include <memdraw.h>\n" 161 162 if(nvga){ 163 printf "#include \"vga.h\"\n" 164 for(i = 0; i < nvga; i++) 165 printf "extern Vgac %s;\n", vga[i]; 166 printf "Vgac* knownvga[] = {\n"; 167 for(i = 0; i < nvga; i++) 168 printf "\t&%s,\n", vga[i]; 169 printf "\tnil,\n};\n\n"; 170 171 if(nhwgc){ 172 for(i = 0; i < nhwgc; i++) 173 printf "extern Hwgc %shwgc;\n", hwgc[i]; 174 printf "Hwgc* knownhwgc[] = {\n"; 175 for(i = 0; i < nhwgc; i++) 176 printf "\t&%shwgc,\n", hwgc[i]; 177 printf "\tnil,\n};\n\n"; 178 } 179 } 180 181 if(nvgadev){ 182 printf "#include \"screen.h\"\n"; 183 for(i = 0; i < nvgadev; i++) 184 printf "extern VGAdev %sdev;\n", vgadev[i]; 185 printf "VGAdev* vgadev[] = {\n"; 186 for(i = 0; i < nvgadev; i++) 187 printf "\t&%sdev,\n", vgadev[i]; 188 printf "\tnil,\n};\n\n"; 189 190 for(i = 0; i < nvgacur; i++) 191 printf "extern VGAcur %scur;\n", vgacur[i]; 192 printf "VGAcur* vgacur[] = {\n"; 193 for(i = 0; i < nvgacur; i++) 194 printf "\t&%scur,\n", vgacur[i]; 195 printf "\tnil,\n};\n\n"; 196 } 197 } 198 199 if(nip){ 200 printf "#include \"../ip/ip.h\"\n"; 201 for(i = 0; i < nip; i++) 202 printf "extern void %sinit(Fs*);\n", ip[i]; 203 printf "void (*ipprotoinit[])(Fs*) = {\n"; 204 for(i = 0; i < nip; i++) 205 printf "\t%sinit,\n", ip[i]; 206 printf "\tnil,\n};\n\n"; 207 } 208 209 for(i = 0; i < ncode; i++) 210 printf "%s\n", code[i]; 211 212 printf "char* conffile = \"%s\";\n", ARGV[1]; 213 printf "ulong kerndate = KERNDATE;\n"; 214 215 exit 216}' $* 217