123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- // Emacs style mode select -*- C++ -*-
- //-----------------------------------------------------------------------------
- //
- // $Id: wadread.c,v 1.3 1997/01/30 19:54:23 b1 Exp $
- //
- // Copyright (C) 1993-1996 by id Software, Inc.
- //
- // This source is available for distribution and/or modification
- // only under the terms of the DOOM Source Code License as
- // published by id Software. All rights reserved.
- //
- // The source is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
- // for more details.
- //
- //
- // $Log: wadread.c,v $
- // Revision 1.3 1997/01/30 19:54:23 b1
- // Final reformatting run. All the remains (ST, W, WI, Z).
- //
- // Revision 1.2 1997/01/21 19:00:10 b1
- // First formatting run:
- // using Emacs cc-mode.el indentation for C++ now.
- //
- // Revision 1.1 1997/01/19 17:22:51 b1
- // Initial check in DOOM sources as of Jan. 10th, 1997
- //
- //
- // DESCRIPTION:
- // WAD and Lump I/O, the second.
- // This time for soundserver only.
- // Welcome to Department of Redundancy Department. Again :-).
- //
- //-----------------------------------------------------------------------------
- static const char rcsid[] = "$Id: wadread.c,v 1.3 1997/01/30 19:54:23 b1 Exp $";
- #include <malloc.h>
- #include <fcntl.h>
- #include <sys/stat.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include <unistd.h>
- #include "soundsrv.h"
- #include "wadread.h"
- int* sfxlengths;
- typedef struct wadinfo_struct
- {
- char identification[4];
- int numlumps;
- int infotableofs;
- } wadinfo_t;
- typedef struct filelump_struct
- {
- int filepos;
- int size;
- char name[8];
- } filelump_t;
- typedef struct lumpinfo_struct
- {
- int handle;
- int filepos;
- int size;
- char name[8];
- } lumpinfo_t;
- lumpinfo_t* lumpinfo;
- int numlumps;
- void** lumpcache;
- #define strcmpi strcasecmp
- //
- // Something new.
- // This version of w_wad.c does handle endianess.
- //
- #ifndef __BIG_ENDIAN__
- #define LONG(x) (x)
- #define SHORT(x) (x)
- #else
- #define LONG(x) ((long)SwapLONG((unsigned long) (x)))
- #define SHORT(x) ((short)SwapSHORT((unsigned short) (x)))
- unsigned long SwapLONG(unsigned long x)
- {
- return
- (x>>24)
- | ((x>>8) & 0xff00)
- | ((x<<8) & 0xff0000)
- | (x<<24);
- }
- unsigned short SwapSHORT(unsigned short x)
- {
- return
- (x>>8) | (x<<8);
- }
- #endif
- // Way too many of those...
- static void derror(char* msg)
- {
- fprintf(stderr, "\nwadread error: %s\n", msg);
- exit(-1);
- }
- void strupr (char *s)
- {
- while (*s)
- *s++ = toupper(*s);
- }
- int filelength (int handle)
- {
- struct stat fileinfo;
-
- if (fstat (handle,&fileinfo) == -1)
- fprintf (stderr, "Error fstating\n");
- return fileinfo.st_size;
- }
- void openwad(char* wadname)
- {
- int wadfile;
- int tableoffset;
- int tablelength;
- int tablefilelength;
- int i;
- wadinfo_t header;
- filelump_t* filetable;
- // open and read the wadfile header
- wadfile = open(wadname, O_RDONLY);
- if (wadfile < 0)
- derror("Could not open wadfile");
- read(wadfile, &header, sizeof header);
- if (strncmp(header.identification, "IWAD", 4))
- derror("wadfile has weirdo header");
- numlumps = LONG(header.numlumps);
- tableoffset = LONG(header.infotableofs);
- tablelength = numlumps * sizeof(lumpinfo_t);
- tablefilelength = numlumps * sizeof(filelump_t);
- lumpinfo = (lumpinfo_t *) malloc(tablelength);
- filetable = (filelump_t *) ((char*)lumpinfo + tablelength - tablefilelength);
- // get the lumpinfo table
- lseek(wadfile, tableoffset, SEEK_SET);
- read(wadfile, filetable, tablefilelength);
- // process the table to make the endianness right and shift it down
- for (i=0 ; i<numlumps ; i++)
- {
- strncpy(lumpinfo[i].name, filetable[i].name, 8);
- lumpinfo[i].handle = wadfile;
- lumpinfo[i].filepos = LONG(filetable[i].filepos);
- lumpinfo[i].size = LONG(filetable[i].size);
- // fprintf(stderr, "lump [%.8s] exists\n", lumpinfo[i].name);
- }
- }
- void*
- loadlump
- ( char* lumpname,
- int* size )
- {
- int i;
- void* lump;
- for (i=0 ; i<numlumps ; i++)
- {
- if (!strncasecmp(lumpinfo[i].name, lumpname, 8))
- break;
- }
- if (i == numlumps)
- {
- // fprintf(stderr,
- // "Could not find lumpname [%s]\n", lumpname);
- lump = 0;
- }
- else
- {
- lump = (void *) malloc(lumpinfo[i].size);
- lseek(lumpinfo[i].handle, lumpinfo[i].filepos, SEEK_SET);
- read(lumpinfo[i].handle, lump, lumpinfo[i].size);
- *size = lumpinfo[i].size;
- }
- return lump;
- }
- void*
- getsfx
- ( char* sfxname,
- int* len )
- {
- unsigned char* sfx;
- unsigned char* paddedsfx;
- int i;
- int size;
- int paddedsize;
- char name[20];
- sprintf(name, "ds%s", sfxname);
- sfx = (unsigned char *) loadlump(name, &size);
- // pad the sound effect out to the mixing buffer size
- paddedsize = ((size-8 + (SAMPLECOUNT-1)) / SAMPLECOUNT) * SAMPLECOUNT;
- paddedsfx = (unsigned char *) realloc(sfx, paddedsize+8);
- for (i=size ; i<paddedsize+8 ; i++)
- paddedsfx[i] = 128;
- *len = paddedsize;
- return (void *) (paddedsfx + 8);
- }
|