static void CcSyntax_FindAS(CcSyntax_t * self, CcNode_t * p) { CcNode_t * a, * q; CcBitArray_t s0, s1; CcSymbolTable_t * symtab = &self->globals->symtab; while (p != NULL) { if (p->base.type == node_opt || p->base.type == node_iter) { CcSyntax_FindAS(self, p->sub); a = CcSyntax_LeadingAny(self, p->sub); if (a != NULL) { CcSyntax_First(self, &s0, p->next); CcBitArray_Subtract(((CcNodeANY_t *)a)->set, &s0); CcBitArray_Destruct(&s0); } } else if (p->base.type == node_alt) { CcBitArray(&s1, symtab->terminals.Count); q = p; while (q != NULL) { CcSyntax_FindAS(self, q->sub); a = CcSyntax_LeadingAny(self, q->sub); if (a != NULL) { CcSyntax_First(self, &s0, q->down); CcBitArray_Or(&s0, &s1); CcBitArray_Subtract(((CcNodeANY_t *)a)->set, &s0); CcBitArray_Destruct(&s0); } else { CcSyntax_First(self, &s0, q->sub); CcBitArray_Or(&s1, &s0); CcBitArray_Destruct(&s0); } q = q->down; } CcBitArray_Destruct(&s1); } if (p->up) break; p = p->next; } }
static void ATest(FILE * fp, CcBitArray_t * ba0, CcBitArray_t * ba1) { CcBitArray_t ba2; int idx, cnt, numbits = CcBitArray_getCount(ba0); CcBitArray_Dump(ba0, fp, "BitArray 0: ", "\n"); CcBitArray_Dump(ba1, fp, "BitArray 1: ", "\n"); cnt = 0; for (idx = 0; idx < numbits; ++idx) if (CcBitArray_Get(ba0, idx) && CcBitArray_Get(ba1, idx)) cnt = 1; COCO_ASSERT((CcBitArray_Intersect(ba0, ba1) == cnt)); COCO_ASSERT((CcBitArray_Clone(&ba2, ba0))); COCO_ASSERT((CcBitArray_Equal(ba0, &ba2))); cnt = 0; for (idx = 0; idx < numbits; ++idx) { COCO_ASSERT(CcBitArray_Get(ba0, idx) == CcBitArray_Get(&ba2, idx)); if (CcBitArray_Get(ba0, idx)) ++cnt; } COCO_ASSERT((CcBitArray_Elements(ba0) == cnt)); COCO_ASSERT((CcBitArray_Or(&ba2, ba1) == 0)); CcBitArray_Dump(&ba2, fp, "Or: ", "\n"); for (idx = 0; idx < numbits; ++idx) COCO_ASSERT((CcBitArray_Get(ba0, idx) || CcBitArray_Get(ba1, idx)) == CcBitArray_Get(&ba2, idx)); CcBitArray_Destruct(&ba2); COCO_ASSERT((CcBitArray_Clone(&ba2, ba0))); COCO_ASSERT((CcBitArray_And(&ba2, ba1) == 0)); CcBitArray_Dump(&ba2, fp, "And: ", "\n"); for (idx = 0; idx < numbits; ++idx) COCO_ASSERT((CcBitArray_Get(ba0, idx) && CcBitArray_Get(ba1, idx)) == CcBitArray_Get(&ba2, idx)); CcBitArray_Destruct(&ba2); COCO_ASSERT((CcBitArray_Clone(&ba2, ba0))); CcBitArray_Subtract(&ba2, ba1); CcBitArray_Dump(&ba2, fp, "Subtract: ", "\n"); for (idx = 0; idx < numbits; ++idx) COCO_ASSERT((CcBitArray_Get(ba0, idx) && !CcBitArray_Get(ba1, idx)) == CcBitArray_Get(&ba2, idx)); COCO_ASSERT(!CcBitArray_Intersect(ba1, &ba2)); CcBitArray_Destruct(&ba2); fprintf(fp, "\n"); }
void TestBitArray(FILE * fp) { int idx, numbits; CcBitArray_t ba0, ba1, ba2; for (numbits = 0; numbits < 32; ++numbits) { COCO_ASSERT((CcBitArray(&ba0, numbits))); COCO_ASSERT((CcBitArray(&ba1, numbits))); ATest(fp, &ba0, &ba1); CcBitArray_Destruct(&ba0); CcBitArray_Destruct(&ba1); COCO_ASSERT((CcBitArray(&ba0, numbits))); CcBitArray_SetAll(&ba0, 1); COCO_ASSERT((CcBitArray(&ba1, numbits))); ATest(fp, &ba0, &ba1); CcBitArray_Destruct(&ba0); CcBitArray_Destruct(&ba1); COCO_ASSERT((CcBitArray(&ba0, numbits))); COCO_ASSERT((CcBitArray(&ba1, numbits))); CcBitArray_SetAll(&ba1, 1); ATest(fp, &ba0, &ba1); CcBitArray_Destruct(&ba0); CcBitArray_Destruct(&ba1); COCO_ASSERT((CcBitArray(&ba0, numbits))); CcBitArray_SetAll(&ba0, 1); COCO_ASSERT((CcBitArray(&ba1, numbits))); CcBitArray_SetAll(&ba1, 1); ATest(fp, &ba0, &ba1); CcBitArray_Destruct(&ba0); CcBitArray_Destruct(&ba1); for (idx = 0; idx < 128; ++idx) { COCO_ASSERT((CcBitArray(&ba0, numbits))); CcBitArray_RandomSet(&ba0); COCO_ASSERT((CcBitArray(&ba1, numbits))); CcBitArray_RandomSet(&ba1); ATest(fp, &ba0, &ba1); COCO_ASSERT((CcBitArray_Clone(&ba2, &ba0))); CcBitArray_Subtract(&ba2, &ba1); ATest(fp, &ba0, &ba2); ATest(fp, &ba2, &ba0); ATest(fp, &ba1, &ba2); ATest(fp, &ba2, &ba1); CcBitArray_Destruct(&ba0); CcBitArray_Destruct(&ba1); CcBitArray_Destruct(&ba2); } } }