Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

hideset.c (2011B)


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include "cpp.h"
      5 
      6 /*
      7  * A hideset is a null-terminated array of Nlist pointers.
      8  * They are referred to by indices in the hidesets array.
      9  * Hideset 0 is empty.
     10  */
     11 
     12 #define	HSSIZ	32
     13 typedef	Nlist	**Hideset;
     14 Hideset	*hidesets;
     15 int	nhidesets = 0;
     16 int	maxhidesets = 3;
     17 int	inserths(Hideset, Hideset, Nlist *);
     18 
     19 /*
     20  * Test for membership in a hideset
     21  */
     22 int
     23 checkhideset(int hs, Nlist *np)
     24 {
     25 	Hideset hsp;
     26 
     27 	if (hs>=nhidesets)
     28 		abort();
     29 	for (hsp = hidesets[hs]; *hsp; hsp++) {
     30 		if (*hsp == np)
     31 			return 1;
     32 	}
     33 	return 0;
     34 }
     35 
     36 /*
     37  * Return the (possibly new) hideset obtained by adding np to hs.
     38  */
     39 int
     40 newhideset(int hs, Nlist *np)
     41 {
     42 	int i, len;
     43 	Nlist *nhs[HSSIZ+3];
     44 	Hideset hs1, hs2;
     45 
     46 	len = inserths(nhs, hidesets[hs], np);
     47 	for (i=0; i<nhidesets; i++) {
     48 		for (hs1=nhs, hs2=hidesets[i]; *hs1==*hs2; hs1++, hs2++)
     49 			if (*hs1 == NULL)
     50 				return i;
     51 	}
     52 	if (len>=HSSIZ)
     53 		return hs;
     54 	if (nhidesets >= maxhidesets) {
     55 		maxhidesets = 3*maxhidesets/2+1;
     56 		hidesets = (Hideset *)realloc(hidesets, (sizeof (Hideset *))*maxhidesets);
     57 		if (hidesets == NULL)
     58 			error(FATAL, "Out of memory from realloc");
     59 	}
     60 	hs1 = (Hideset)domalloc(len*sizeof(Hideset));
     61 	memmove(hs1, nhs, len*sizeof(Hideset));
     62 	hidesets[nhidesets] = hs1;
     63 	return nhidesets++;
     64 }
     65 
     66 int
     67 inserths(Hideset dhs, Hideset shs, Nlist *np)
     68 {
     69 	Hideset odhs = dhs;
     70 
     71 	while (*shs && *shs < np)
     72 		*dhs++ = *shs++;
     73 	if (*shs != np)
     74 		*dhs++ = np;
     75 	do {
     76 		*dhs++ = *shs;
     77 	} while (*shs++);
     78 	return dhs - odhs;
     79 }
     80 
     81 /*
     82  * Hideset union
     83  */
     84 int
     85 unionhideset(int hs1, int hs2)
     86 {
     87 	Hideset hp;
     88 
     89 	for (hp = hidesets[hs2]; *hp; hp++)
     90 		hs1 = newhideset(hs1, *hp);
     91 	return hs1;
     92 }
     93 
     94 void
     95 iniths(void)
     96 {
     97 	hidesets = (Hideset *)domalloc(maxhidesets*sizeof(Hideset *));
     98 	hidesets[0] = (Hideset)domalloc(sizeof(Hideset));
     99 	*hidesets[0] = NULL;
    100 	nhidesets++;
    101 }
    102 
    103 void
    104 prhideset(int hs)
    105 {
    106 	Hideset np;
    107 
    108 	for (np = hidesets[hs]; *np; np++) {
    109 		fprintf(stderr, (char*)(*np)->name, (*np)->len);
    110 		fprintf(stderr, " ");
    111 	}
    112 }