/* ccl_set_union - create a new ccl as the set union of the two given ccls. */ int ccl_set_union (int a, int b) { int d, i; /* create new class */ d = cclinit(); /* Add all of a */ for (i = 0; i < ccllen[a]; ++i) ccladd (d, ccltbl[cclmap[a] + i]); /* Add all of b */ for (i = 0; i < ccllen[b]; ++i) ccladd (d, ccltbl[cclmap[b] + i]); /* debug */ if (0){ fprintf(stderr, "ccl_set_union (%d + %d = %d", a, b, d); fprintf(stderr, "\n "); dump_cclp (stderr, a); fprintf(stderr, "\n "); dump_cclp (stderr, b); fprintf(stderr, "\n "); dump_cclp (stderr, d); fprintf(stderr, "\n)\n"); } return d; }
/* ccl_set_diff - create a new ccl as the set difference of the two given ccls. */ int ccl_set_diff (int a, int b) { int d, ch; /* create new class */ d = cclinit(); /* In order to handle negation, we spin through all possible chars, * addding each char in a that is not in b. * (This could be O(n^2), but n is small and bounded.) */ for ( ch = 0; ch < csize; ++ch ) if (ccl_contains (a, ch) && !ccl_contains(b, ch)) ccladd (d, ch); /* debug */ if (0){ fprintf(stderr, "ccl_set_diff ("); fprintf(stderr, "\n "); dump_cclp (stderr, a); fprintf(stderr, "\n "); dump_cclp (stderr, b); fprintf(stderr, "\n "); dump_cclp (stderr, d); fprintf(stderr, "\n)\n"); } return d; }
static void makeany() { static int madeany = false; if ( ! madeany ) { /* create the '.' character class */ checkedges(__LINE__, __FILE__); cclinit( &anyccl ); ccladd( &anyccl, '\n' ); checkedges(__LINE__, __FILE__); cclnegate( &anyccl ); checkedges(__LINE__, __FILE__); madeany = true; } }