hideset.c 1.9 KB

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