#include #include #include #include #include #include #include typedef struct { uint32_t pos, size; char name[8]; } lump_t; typedef struct { char id[4]; uint32_t nlumps, dirpos; } wad_t; const char snames[][8] = { // DOOM "DSBAREXP", "DSBDCLS", "DSBDOPN", "DSBFG", "DSBGACT", "DSBGDTH1", "DSBGDTH2", "DSBGSIT1", "DSBGSIT2", "DSBOSCUB", "DSBOSDTH", "DSBOSPIT", "DSBOSPN", "DSBOSSIT", "DSBRSDTH", "DSBRSSIT", "DSBSPACT", "DSBSPDTH", "DSBSPSIT", "DSBSPWLK", "DSCACDTH", "DSCACSIT", "DSCLAW", "DSCYBDTH", "DSCYBSIT", "DSDBCLS", "DSDBLOAD", "DSDBOPN", "DSDMACT", "DSDMPAIN", "DSDORCLS", "DSDOROPN", "DSDSHTGN", "DSFIRSHT", "DSFIRXPL", "DSFLAME", "DSFLAMST", "DSGETPOW", "DSHOOF", "DSITEMUP", "DSITMBK", "DSKEENDT", "DSKEENPN", "DSKNTDTH", "DSKNTSIT", "DSMANATK", "DSMANDTH", "DSMANSIT", "DSMETAL", "DSMNPAIN", "DSNOWAY", "DSOOF", "DSPDIEHI", "DSPEDTH", "DSPEPAIN", "DSPESIT", "DSPISTOL", "DSPLASMA", "DSPLDETH", "DSPLPAIN", "DSPODTH1", "DSPODTH2", "DSPODTH3", "DSPOPAIN", "DSPOSACT", "DSPOSIT1", "DSPOSIT2", "DSPOSIT3", "DSPSTART", "DSPSTOP", "DSPUNCH", "DSRADIO", "DSRLAUNC", "DSRXPLOD", "DSSAWFUL", "DSSAWHIT", "DSSAWIDL", "DSSAWUP", "DSSGCOCK", "DSSGTATK", "DSSGTDTH", "DSSGTSIT", "DSSHOTGN", "DSSKEACT", "DSSKEATK", "DSSKEDTH", "DSSKEPCH", "DSSKESIT", "DSSKESWG", "DSSKLATK", "DSSKLDTH", "DSSLOP", "DSSPIDTH", "DSSPISIT", "DSSSDTH", "DSSSSIT", "DSSTNMOV", "DSSWTCHN", "DSSWTCHX", "DSTELEPT", "DSTINK", "DSVILACT", "DSVILATK", "DSVILDTH", "DSVILSIT", "DSVIPAIN", "DSWPNUP", // HERETIC "AMB10", "AMB11", "AMB1", "AMB2", "AMB3", "AMB4", "AMB5", "AMB6", "AMB7", "AMB8", "AMB9", "ARTIUP", "ARTIUSE", "BLSHIT", "BLSSHT", "BOUNCE", "BOWSHT", "BSTACT", "BSTATK", "BSTDTH", "BSTPAI", "BSTSIT", "BURN", "CHAT", "CHICACT", "CHICATK", "CHICDTH", "CHICPAI", "CHICPK1", "CHICPK2", "CHICPK3", "CLKACT", "CLKATK", "CLKDTH", "CLKPAI", "CLKSIT", "DORCLS", "DORMOV", "DOROPN", "GFRAG", "GIBDTH", "GLDHIT", "GLOOP", "GNTACT", "GNTFUL", "GNTHIT", "GNTPOW", "GNTUSE", "HEDACT", "HEDAT1", "HEDAT2", "HEDAT3", "HEDDTH", "HEDPAI", "HEDSIT", "HRNHIT", "HRNPOW", "HRNSHT", "IMPAT1", "IMPAT2", "IMPDTH", "IMPPAI", "IMPSIT", "ITEMUP", "KEYUP", "KGTAT2", "KGTATK", "KGTDTH", "KGTPAI", "KGTSIT", "LOBHIT", "LOBPOW", "LOBSHT", "MINACT", "MINAT1", "MINAT2", "MINAT3", "MINDTH", "MINPAI", "MINSIT", "MUMAT1", "MUMAT2", "MUMDTH", "MUMHED", "MUMPAI", "MUMSIT", "NEWPOD", "PHOHIT", "PHOPOW", "PHOSHT", "PLRCDTH", "PLRDTH", "PLROOF", "PLRPAI", "PLRWDTH", "PODEXP", "PSTART", "PSTOP", "RAMPHIT", "RAMRAIN", "RESPAWN", "RIPSLOP", "SBTACT", "SBTDTH", "SBTPAI", "SNKACT", "SNKATK", "SNKDTH", "SNKPAI", "SNKSIT", "SORACT", "SORATK", "SORDBON", "SORDEXP", "SORDSPH", "SORPAI", "SORRISE", "SORSIT", "SORZAP", "STFCRK", "STFHIT", "STFPOW", "STNMOV", "SWITCH", "TELEPT", "WATERFL", "WIND", "WIZACT", "WIZATK", "WIZDTH", "WIZPAI", "WIZSIT", "WPNUP", // HEXEN "ACID5", "ARMOREXP", "ART1", "ARTACT1", "AXE5", "BALLS1", "BATS", "BELLRNG", "BIRD", "BISHAPP", "BISHDTH1", "BITE4", "BLANK", "BLASTR", "BLDDRP1", "BLOOD1", "BLUR6", "BOARD1", "BOUNCE2", "BROOK1", "BSHHIT2", "BSHPN1", "BUBBLE", "CENT1", "CENT2", "CENTHIT2", "CHAINS", "CHAT3", "CHNSWCH8", "CLHMM", "CLXDTH1", "CLXDTH2", "CLXDTH3", "CNTDTH1", "CNTSHLD4", "CONE3", "CORK", "CRKETS1", "CRKETS", "DEFAULT", "DEMATK2", "DORSTP1B", "DORSTP3", "DORSTP4", "DRAGDIE2", "DRAGPN2", "DRAGSIT1", "DRCRK5A", "DRLTCH3A", "DROP2", "DRSTP2", "DRSTP7", "ETHIT1", "ETHPORT1", "FACE1", "FALL1", "FALLHIT", "FEET4", "FGTCDTH", "FGTDDTH", "FGTFALL", "FGTGRUNT", "FGTHMM", "FGTPAIN", "FGTXDTH1", "FGTXDTH2", "FGTXDTH3", "FIRED2", "FIRED3", "FIRED5", "FIREDHIT", "FLECH4", "FLY3", "FROGS", "FROSTY1", "FROSTY2", "GAME1", "GLASS5", "GLBHISS1", "GLBHIT4", "GLOOP1", "GNTACT1", "GNTMIS1", "GNTPOW", "GONG", "GRTNGS1", "GRUNT1", "HAMBLO8A", "HAMFIR1", "HAMFLY1", "HAMMIS2", "HAMWAL1", "HMHIT1A", "HOLY3", "ICEBRK1A", "ICEDTH1", "ICEMV2", "IMPACT3", "IMPFIRE2", "INSECTS1", "KATYDID", "KEYS2A", "KORACT", "KORATK", "KORCOM", "KORDTH1", "KORPN1", "KORSIT", "LAVA2", "LITE2", "LOCKED", "MAGE4", "MAGEBALL", "MAYBE1", "MGCDTH", "MGDTH", "MGFALL", "MGGRUNT", "MGHMM", "MGPAIN", "MGXDTH1", "MGXDTH2", "MGXDTH3", "MINACT1", "MINACT2", "MINDTH4", "MINPAIN4", "MINSIT1", "MTLMV3", "MTLSTRT1", "MUCK5", "MUMPUN5", "OWL", "PICUP5", "PIECE1", "PIGDTH2", "PIGPAIN2", "PIGRUNT1", "PLRBURN", "PLRCDTH", "PLRDTH", "PLRPAIN3", "POIS2", "POP", "POTBRK1", "PUFF1", "PUNCH8", "PUNCHMIS", "PUP4", "PUZSLV1", "PUZSLV", "QUAKE2", "RAITH1B", "RAITH3", "RAITH4A", "RAITH5A", "RATHDTH2", "READY1", "RESPAWN", "ROCKS", "SAMPLE11", "SBTDTH3", "SBTSIT5", "SERPPN1", "SHARDS1B", "SHLURP", "SORBLEXP", "SORBOSS1", "SORBOSS2", "SORBOSS3", "SORDIE2", "SPAWN3", "SPELL1", "SPIKE2", "SPIKE3", "SPIRT5", "SPIRT7", "SPIRTS1", "SPIT6", "SQUEAL1", "SRFC1", "SRFC3", "SRPDTH1", "STB1D", "STEEL1", "STEEL2", "STEP", "STMDR1", "STNMV4", "STRETCH3", "STRIKE1", "STRIKE3", "STRONG1", "SWORD2", "SWTCH6", "SWTCHRP1", "SWTCHV4", "SYAB2D", "TAUR1", "TAUR2", "TAUR4", "THNDR1", "TICK", "TICTOC", "TORCH2", "TPORT1", "TREEBRK", "TREEBURN", "VAMP5", "WAND4", "WEPELE2", "WIND3", "WING1", "WOOSH3", "WRSHIP1", "WTRCRT7", "WTRHIT", "WTRSWIP", // STRIFE "ADG01", "AG301", "AGG01", "BBX01", "BBX02", "BGG01", "BGG02", "BGG03", "CTT01", "CTT02", "DER01", "DER02", "DER03", "DGG01", "DGG02", "DGG03", "DGTBL", "DOW01", "DRTBL", "DSAGRAC1", "DSAGRAC2", "DSAGRAC3", "DSAGRAC4", "DSAGRDPN", "DSAGRDTH", "DSAGRSEE", "DSAIRLCK", "DSALARM", "DSALNACT", "DSALNDTH", "DSALNPN", "DSALNSEE", "DSAMALN1", "DSAMALN2", "DSAMALN3", "DSAMALN4", "DSAMALN5", "DSAMALN6", "DSAMBBAR", "DSAMBPPL", "DSBAREXP", "DSBDCLS", "DSBDOPN", "DSBGLASS", "DSBURNME", "DSCHAIN", "DSCHANT", "DSDIFOOL", "DSDRCHNC", "DSDRCHNO", "DSDRLMTC", "DSDRLMTO", "DSDRLWUD", "DSDRSMTC", "DSDRSMTO", "DSDRSTON", "DSDRSWUD", "DSDSRPTR", "DSEXPLOD", "DSFIRXPL", "DSFLBURN", "DSFLIDL", "DSINQACT", "DSINQDTH", "DSINQJMP", "DSINQSEE", "DSITEMUP", "DSITMBK", "DSKEYCRD", "DSLGFIRE", "DSLORPN", "DSLORSEE", "DSMASK", "DSMEATHT", "DSMISLHT", "DSMNALDT", "DSMNALSE", "DSMTALHT", "DSNOWAY", "DSOOF", "DSPCRUSH", "DSPESPNA", "DSPESPNB", "DSPESPNC", "DSPESPND", "DSPGRACT", "DSPGRDAT", "DSPGRDPN", "DSPGRDTH", "DSPGRSEE", "DSPHOOT", "DSPLASMA", "DSPLDETH", "DSPLPAIN", "DSPLXDTH", "DSPRGPN", "DSPROGAC", "DSPROTFL", "DSPROTON", "DSPSDTHA", "DSPSDTHB", "DSPSDTHC", "DSPSTART", "DSPSTOP", "DSPULCHN", "DSRADIO", "DSRATACT", "DSRB2ACT", "DSRB2DTH", "DSRB2PN", "DSRB2SEE", "DSREACTR", "DSREAVAT", "DSREAVPN", "DSREBACT", "DSREBDTH", "DSREVACT", "DSREVBLD", "DSREVDTH", "DSREVSEE", "DSRFLITE", "DSRIFLE", "DSRLAUNC", "DSSGLHIT", "DSSIGIL", "DSSIGLUP", "DSSLOP", "DSSMFIRE", "DSSNTACT", "DSSNTDTH", "DSSNTSEE", "DSSPDATK", "DSSPDWLK", "DSSPIDTH", "DSSPISIT", "DSSTATIC", "DSSTNMOV", "DSSWBOLT", "DSSWISH", "DSSWKNOB", "DSSWSCAN", "DSSWSTON", "DSSWTCHN", "DSTELEPT", "DSTEND", "DSVALVE", "DSWBRLDT", "DSWDRIP", "DSWFALL", "DSWPNUP", "DSWRIVER", "DSWSPLSH", "DSXBOW", "DSYEAH", "DWTBL", "DWW01", "F1TBLA", "F2TBLA", "F3TBLA", "FOR01A", "FOR02A", "FOR03A", "FOR04A", "FOTBLA", "FP101A", "FP102A", "FP201A", "FP301A", "GEO01", "GEO02", "GEO03", "GETBL", "GOTBL", "GOV01", "GOV02", "GOV03", "GOV04", "GOV05", "GOV06", "GOV07", "GOV08", "GOV09", "GOV10", "GOV11", "GOV6A1", "HA001", "HA002", "HA003", "HA004", "HA005", "HA006", "HA007", "HATBL", "JDW01", "JDW02", "JWTBL", "KET01", "KET02", "KET03", "KETBL", "KEV01", "KEV02", "KNTBL", "LOM03", "LOM04", "LOM05", "LOM06", "MAC01", "MAC02", "MAC03", "MAC04", "MAC05", "MAC06", "MAC07", "MAC08", "MAC09", "MAC10A1", "MAC10B1", "MAC10", "MAC11", "MAC12", "MAC13", "MAC14", "MAC15", "MAC16", "MAC17", "MAC18", "MAC19", "MAC20", "MAC666", "MACRWD", "MAE01", "MAE02", "MAE03", "MAE04", "MAE05", "MAE06", "MAG01", "MAG02", "MAG03", "MAG04", "MCTBL", "MLTBL", "MOTBL", "ORC01", "ORC02", "ORC03", "ORC04", "ORC05", "ORC06", "ORC07", "ORE01", "ORE02", "ORTBL", "PDG01", "PDG02", "PDG03", "PPP01A", "PPP02A", "PPP03A", "PPP04", "PPP05", "PPP06A", "PPP07A", "PPP08", "PRO1", "PRO2", "PRO3", "PRO4", "PRO5", "PRO6", "PRO7", "PRTBL", "QFMRM1", "QFMRM2", "QFMRM3", "QFMRM4", "QFMRM5", "QFMRM6", "QFMRM7", "QFMRM8", "QUI01", "QUI02", "QUI03", "QUI04", "QUI05", "QUI06", "QUTBL", "REBRM1", "REBRM2", "REBRM3", "REBRM4", "REBRM5", "REBRM6", "REBRM7", "REBRM8", "REBRM9", "RET01", "RET02", "RET03", "RET04", "RET05", "RET06", "RET07", "RET08", "RET09", "RET10", "RET11", "RET12", "RETBL", "RGG01", "RGTBL", "RIC01", "RIC02", "RIE01", "RPP01", "RRTBL", "SAM01A", "SAM02A", "SAM03A", "SAM04A", "SAM05A", "SATBL", "SS501B", "SS502B", "SS503B", "SS601A", "SS602A", "SS603A", "SUR4A1", "TBTBL", "TCB01", "TCB02", "TCB03", "TCC01", "TCH01", "TCH02", "TCH03", "TCT01", "TETBL", "TTTBL", "VOC100", "VOC101", "VOC102", "VOC103", "VOC104", "VOC105", "VOC106", "VOC10", "VOC11", "VOC120", "VOC121", "VOC122", "VOC128", "VOC129", "VOC12", "VOC130", "VOC13", "VOC14", "VOC15", "VOC16", "VOC17", "VOC18", "VOC19", "VOC1", "VOC200", "VOC201", "VOC202", "VOC203", "VOC204", "VOC205", "VOC206", "VOC207", "VOC208", "VOC209", "VOC20", "VOC210", "VOC211", "VOC212", "VOC213", "VOC214", "VOC215", "VOC216", "VOC217", "VOC218", "VOC219", "VOC21", "VOC220", "VOC221", "VOC222", "VOC223", "VOC224", "VOC225", "VOC226", "VOC227", "VOC228", "VOC229", "VOC22", "VOC230", "VOC231", "VOC232", "VOC233", "VOC234", "VOC235", "VOC236", "VOC237", "VOC23", "VOC24", "VOC25", "VOC26", "VOC27", "VOC28", "VOC29", "VOC2", "VOC30", "VOC31", "VOC32", "VOC33", "VOC34", "VOC35", "VOC36", "VOC37", "VOC38", "VOC39", "VOC3", "VOC40", "VOC41", "VOC42", "VOC43", "VOC44", "VOC45", "VOC46", "VOC47", "VOC48", "VOC49", "VOC4", "VOC50", "VOC51", "VOC52", "VOC53", "VOC54", "VOC55", "VOC56", "VOC57", "VOC58", "VOC59", "VOC5", "VOC60", "VOC61", "VOC62", "VOC63", "VOC64", "VOC65", "VOC66", "VOC67", "VOC68", "VOC69", "VOC6", "VOC70", "VOC71", "VOC72", "VOC73", "VOC74", "VOC75", "VOC76", "VOC77", "VOC78", "VOC79", "VOC7", "VOC80", "VOC81", "VOC82", "VOC83", "VOC84", "VOC85", "VOC86", "VOC87", "VOC88", "VOC89", "VOC8", "VOC90", "VOC91", "VOC92", "VOC93", "VOC94", "VOC95", "VOC96", "VOC97", "VOC98", "VOC99", "VOC9", "WDM01", "WDM02", "WER01", "WER02", "WER03", "WER05", "WER06", "WER07", "WER08", "WER09", "WNTBL", "WOR01", "WOR02", "WOR03", "WRTBL", // ZDOOM "DSDGACT", "DSDGATK", "DSDGDTH", "DSDGPAIN", "DSDGSIT", "DSQUAKE", "DSSECRET", "ICEBRK1A", "ICEDTH1", "RAILGF1", "SPARK1", "SPARK2", "SPARK3", 0 }; int xwrite( int fd, unsigned char *from, size_t bytes ) { int wd, wt = 0; while ( wt < bytes ) { wd = write(fd,from+wt,bytes-wt); if ( (wd == -1) && (errno != EAGAIN) && (errno != EINTR) ) return 1; wt += (wd>0)?wd:0; } return 0; } int xread( int fd, unsigned char *to, size_t bytes ) { int rd, rt = 0; while ( rt < bytes ) { rd = read(fd,to+rt,bytes-rt); if ( (rd == -1) && (errno != EAGAIN) && (errno != EINTR) ) return 1; rt += (rd>0)?rd:0; } return 0; } int main( int argc, char **argv ) { if ( argc < 2 ) return 1; int sfil, wfil; struct stat s; if ( stat(argv[1],&s) ) return 1; sfil = open(argv[1],O_RDONLY); if ( !sfil ) return 1; unsigned char *snd = malloc(s.st_size); if ( xread(sfil,snd,s.st_size) ) { close(sfil); free(snd); return 1; } close(sfil); wfil = open("sound.wad",O_WRONLY|O_CREAT|O_TRUNC,0655); if ( !wfil ) { free(snd); return 1; } int numsounds; for ( numsounds=0; *snames[numsounds]!=0; numsounds++ ); wad_t whead = {"PWAD",numsounds,sizeof(wad_t)+s.st_size}; lump_t slmp = {sizeof(wad_t),s.st_size,0}; if ( xwrite(wfil,(unsigned char *)&whead,sizeof(wad_t)) ) { free(snd); close(wfil); return 1; } if ( xwrite(wfil,snd,s.st_size) ) { free(snd); close(wfil); return 1; } for ( int i=0; i