Annotation of doom/w_wad.c, revision 1.1.1.1

1.1       root        1: /* W_wad.c */
                      2: 
                      3: #include "doomdef.h"
                      4: /* include "r_local.h" */
                      5: 
                      6: 
                      7: /*=============== */
                      8: /*   TYPES */
                      9: /*=============== */
                     10: 
                     11: 
                     12: typedef struct
                     13: {
                     14:        char            identification[4];              /* should be IWAD */
                     15:        int                     numlumps;
                     16:        int                     infotableofs;
                     17: } wadinfo_t;
                     18: 
                     19: 
                     20: byte           *wadfileptr;
                     21: 
                     22: /*============= */
                     23: /* GLOBALS */
                     24: /*============= */
                     25: 
                     26: lumpinfo_t     *lumpinfo;                      /* points directly to rom image */
                     27: int                    numlumps;
                     28: void           *lumpcache[MAXLUMPS];
                     29: 
                     30: 
                     31: void strupr (char *s)
                     32: {
                     33:        char    c;
                     34:        
                     35:     while ( (c = *s) != 0)
                     36:        {
                     37:                if (c >= 'a' && c <= 'z')
                     38:                        c -= 'a'-'A';
                     39:                *s++ = c;
                     40:        }
                     41: }
                     42: 
                     43: 
                     44: 
                     45: #define WINDOW_SIZE    4096
                     46: #define LOOKAHEAD_SIZE 16
                     47: 
                     48: #define LENSHIFT 4             /* this must be log2(LOOKAHEAD_SIZE) */
                     49: 
                     50: unsigned char *decomp_input;
                     51: unsigned char *decomp_output;
                     52: extern int decomp_start;
                     53: 
                     54: void decode(unsigned char *input, unsigned char *output)
                     55: {
                     56: #ifdef JAGUAR
                     57:        decomp_input = input;
                     58:        decomp_output = output;
                     59:        
                     60:        gpufinished = zero;
                     61:        gpucodestart = (int)&decomp_start;
                     62:        while (!I_RefreshCompleted () )
                     63:        ;
                     64: #else
                     65:   int getidbyte = 0;
                     66:   int len;
                     67:   int pos;
                     68:   int i;
                     69:   unsigned char *source;
                     70:   int idbyte = 0;
                     71: 
                     72:   while (1)
                     73:   {
                     74: 
                     75:     /* get a new idbyte if necessary */
                     76:     if (!getidbyte) idbyte = *input++;
                     77:     getidbyte = (getidbyte + 1) & 7;
                     78: 
                     79:     if (idbyte&1)
                     80:     {
                     81:       /* decompress */
                     82:       pos = *input++ << LENSHIFT;
                     83:       pos = pos | (*input >> LENSHIFT);
                     84:       source = output - pos - 1;
                     85:       len = (*input++ & 0xf)+1;
                     86:       if (len==1) break;
                     87:       for (i=0 ; i<len ; i++)
                     88:         *output++ = *source++;
                     89:     } else {
                     90:       *output++ = *input++;
                     91:     }
                     92: 
                     93:     idbyte = idbyte >> 1;
                     94: 
                     95:   }
                     96: #endif
                     97: }
                     98: 
                     99: /*
                    100: ============================================================================
                    101: 
                    102:                                                LUMP BASED ROUTINES
                    103: 
                    104: ============================================================================
                    105: */
                    106: 
                    107: /*
                    108: ====================
                    109: =
                    110: = W_Init
                    111: =
                    112: ====================
                    113: */
                    114: 
                    115: void W_Init (void)
                    116: {
                    117:        int                             infotableofs;
                    118:        
                    119:        wadfileptr = I_WadBase ();
                    120: 
                    121:        if (D_strncasecmp(((wadinfo_t*)wadfileptr)->identification,"IWAD",4))
                    122:                I_Error ("Wad file doesn't have IWAD id\n");
                    123:        
                    124:        numlumps = BIGLONG(((wadinfo_t*)wadfileptr)->numlumps);
                    125: 
                    126:        infotableofs = BIGLONG(((wadinfo_t*)wadfileptr)->infotableofs);
                    127:        lumpinfo = (lumpinfo_t *) (wadfileptr + infotableofs);
                    128: }
                    129: 
                    130: 
                    131: /*
                    132: ====================
                    133: =
                    134: = W_CheckNumForName
                    135: =
                    136: = Returns -1 if name not found
                    137: =
                    138: ====================
                    139: */
                    140: 
                    141: int    W_CheckNumForName (char *name)
                    142: {
                    143:        char    name8[12];
                    144:        int             v1,v2;
                    145:        lumpinfo_t      *lump_p;
                    146: 
                    147: /* make the name into two integers for easy compares */
                    148:        D_memset (name8,0,sizeof(name8));
                    149:        D_strncpy (name8,name,8);
                    150:        name8[8] = 0;                   /* in case the name was a full 8 chars */
                    151:        strupr (name8);                 /* case insensitive */
                    152: 
                    153:        v1 = *(int *)name8;
                    154:        v2 = *(int *)&name8[4];
                    155: 
                    156: 
                    157: /* scan backwards so patch lump files take precedence */
                    158: 
                    159:        lump_p = lumpinfo + numlumps;
                    160: 
                    161:        /* used for stripping out the hi bit of the first character of the */
                    162:        /* name of the lump */
                    163: 
                    164: #ifdef i386
                    165: #define HIBIT (1<<7)
                    166: #else
                    167: #define HIBIT (1<<31)
                    168: #endif
                    169: 
                    170:        while (lump_p-- != lumpinfo)
                    171:                if (*(int *)&lump_p->name[4] == v2
                    172:                &&  (*(int *)lump_p->name & ~HIBIT) == v1)
                    173:                        return lump_p - lumpinfo;
                    174: 
                    175: 
                    176:        return -1;
                    177: }
                    178: 
                    179: 
                    180: /*
                    181: ====================
                    182: =
                    183: = W_GetNumForName
                    184: =
                    185: = Calls W_CheckNumForName, but bombs out if not found
                    186: =
                    187: ====================
                    188: */
                    189: 
                    190: int    W_GetNumForName (char *name)
                    191: {
                    192:        int     i;
                    193: 
                    194:        i = W_CheckNumForName (name);
                    195:        if (i != -1)
                    196:                return i;
                    197: 
                    198:        I_Error ("W_GetNumForName: %s not found!",name);
                    199:        return -1;
                    200: }
                    201: 
                    202: 
                    203: /*
                    204: ====================
                    205: =
                    206: = W_LumpLength
                    207: =
                    208: = Returns the buffer size needed to load the given lump
                    209: =
                    210: ====================
                    211: */
                    212: 
                    213: int W_LumpLength (int lump)
                    214: {
                    215:        if (lump >= numlumps)
                    216:                I_Error ("W_LumpLength: %i >= numlumps",lump);
                    217:        return BIGLONG(lumpinfo[lump].size);
                    218: }
                    219: 
                    220: 
                    221: /*
                    222: ====================
                    223: =
                    224: = W_ReadLump
                    225: =
                    226: = Loads the lump into the given buffer, which must be >= W_LumpLength()
                    227: =
                    228: ====================
                    229: */
                    230: 
                    231: void W_ReadLump (int lump, void *dest)
                    232: {
                    233:        lumpinfo_t      *l;
                    234:        
                    235:        if (lump >= numlumps)
                    236:                I_Error ("W_ReadLump: %i >= numlumps",lump);
                    237:        l = lumpinfo+lump;
                    238:        if (l->name[0] & 0x80) /* compressed */
                    239:        {
                    240:                 decode((unsigned char *) (wadfileptr + BIGLONG(l->filepos)),
                    241:                (unsigned char *) dest);
                    242:        }
                    243:        else
                    244:          D_memcpy (dest, wadfileptr + BIGLONG(l->filepos), BIGLONG(l->size));
                    245: }
                    246: 
                    247: 
                    248: 
                    249: /*
                    250: ====================
                    251: =
                    252: = W_CacheLumpNum
                    253: =
                    254: ====================
                    255: */
                    256: 
                    257: void   *W_CacheLumpNum (int lump, int tag)
                    258: {
                    259:        if ((unsigned)lump >= numlumps)
                    260:                I_Error ("W_CacheLumpNum: %i >= numlumps",lump);
                    261:                
                    262:        if (!lumpcache[lump])
                    263:        {       /* read the lump in */
                    264: /*printf ("cache miss on lump %i\n",lump); */
                    265:                Z_Malloc (W_LumpLength (lump), tag, &lumpcache[lump]);
                    266:                W_ReadLump (lump, lumpcache[lump]);
                    267:        }
                    268:        else
                    269:                Z_ChangeTag (lumpcache[lump],tag);
                    270: /*else printf ("cache hit on lump %i\n",lump); */
                    271:        
                    272:        return lumpcache[lump];
                    273: }
                    274: 
                    275: 
                    276: /*
                    277: ====================
                    278: =
                    279: = W_CacheLumpName
                    280: =
                    281: ====================
                    282: */
                    283: 
                    284: void   *W_CacheLumpName (char *name, int tag)
                    285: {
                    286:        return W_CacheLumpNum (W_GetNumForName(name), tag);
                    287: }
                    288: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.