1 #include <u.h> 2 #include <libc.h> 3 #include <stdio.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 } 58 hs1 = (Hideset)domalloc(len*sizeof(Hideset)); 59 memmove(hs1, nhs, len*sizeof(Hideset)); 60 hidesets[nhidesets] = hs1; 61 return nhidesets++; 62 } 63 64 int 65 inserths(Hideset dhs, Hideset shs, Nlist *np) 66 { 67 Hideset odhs = dhs; 68 69 while (*shs && *shs < np) 70 *dhs++ = *shs++; 71 if (*shs != np) 72 *dhs++ = np; 73 do { 74 *dhs++ = *shs; 75 } while (*shs++); 76 return dhs - odhs; 77 } 78 79 /* 80 * Hideset union 81 */ 82 int 83 unionhideset(int hs1, int hs2) 84 { 85 Hideset hp; 86 87 for (hp = hidesets[hs2]; *hp; hp++) 88 hs1 = newhideset(hs1, *hp); 89 return hs1; 90 } 91 92 void 93 iniths(void) 94 { 95 hidesets = (Hideset *)domalloc(maxhidesets*sizeof(Hideset *)); 96 hidesets[0] = (Hideset)domalloc(sizeof(Hideset)); 97 *hidesets[0] = NULL; 98 nhidesets++; 99 } 100 101 void 102 prhideset(int hs) 103 { 104 Hideset np; 105 106 for (np = hidesets[hs]; *np; np++) { 107 fprintf(stderr, (char*)(*np)->name, (*np)->len); 108 fprintf(stderr, " ", 1); 109 } 110 } 111