doom/sndserv/wadread.c

257 lines
5.1 KiB
C
Raw Normal View History

1997-12-23 00:00:00 +00:00
// 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);
}