stuff/mksoundwad.c

1085 lines
12 KiB
C

#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
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<numsounds; i++ )
{
strncpy(slmp.name,snames[i],8);
if ( xwrite(wfil,(unsigned char *)&slmp,sizeof(lump_t)) )
{
free(snd);
close(wfil);
return 1;
}
}
free(snd);
close(wfil);
return 0;
}