- return FALSE;
-}
-
-void
-print_debug_level(size_t level)
-{
- size_t i;
-
- for (i = 0; i < level; i++) {
- fputs("| ", stderr);
- }
-}
-
-void
-BINdebug(void *data, size_t level)
-{
- struct bin_data *bd = data;
-
- print_debug_level(level);
-
- switch (bd->type) {
- case TYPE_OR:
- fputs("OR\n", stderr);
- break;
- case TYPE_AND:
- fputs("AND\n", stderr);
- break;
- case TYPE_NOT:
- fputs("NOT\n", stderr);
- break;
- default:
- advise(NULL, "binary nexus has unknown type: %d\n", bd->type);
- return;
- }
-
- if (bd->left && bd->left->debug) {
- bd->left->debug(bd->left->data, level+1);
- } else {
- print_debug_level(level+1);
- fputs("can't debug left child\n", stderr);
- }
-
- if (bd->right && bd->right->debug) {
- bd->right->debug(bd->right->data, level+1);
- } else if (bd->type != TYPE_NOT) {
- print_debug_level(level+1);
- fputs("can't debug right child\n", stderr);
- }
-}
-
-static boolean
-NOTaction(struct field *f, int msgnum, void *data)
-{
- struct bin_data *bin = data;
- return !bin->left->action(f, msgnum, bin->left->data);
-}
-
-static boolean
-BINaction(struct field *f, int msgnum, void *data)
-{
- struct bin_data *bin = data;
-
- if (bin->oldmsgnum != msgnum) {
- bin->oldmsgnum = msgnum;
- bin->match = FALSE;
- bin->leftmatch = FALSE;
- bin->rightmatch = FALSE;
- }
-
- if (bin->match) {
- return bin->match;
- }
-
- bin->leftmatch = bin->leftmatch || bin->left->action(f, msgnum, bin->left->data);
- bin->rightmatch = bin->rightmatch || bin->right->action(f, msgnum, bin->right->data);
-
- switch (bin->type) {
- case TYPE_OR:
- bin->match = bin->leftmatch || bin->rightmatch;
- break;
- case TYPE_AND:
- bin->match = bin->leftmatch && bin->rightmatch;
- break;
- default:
- adios(EX_SOFTWARE, NULL, "unknown nexus type: %d\n", bin->type);
- }
-
- return bin->match;
-}
-
-static void
-BINfree(struct nexus **n)
-{
- struct bin_data *bd;
-
- if (!(*n)) {
- return;
- }
-
- bd = (*n)->data;
-
- if (bd->left && bd->left->free) {
- bd->left->free(&bd->left);
- } else {
- advise(NULL, "BUG: can't free left child");
- }
-
- if (bd->right && bd->right->free) {
- bd->right->free(&bd->right);
- } else {
- advise(NULL, "BUG: can't free right child");
- }
-
- mh_free0(n);
-}
-
-static int
-gcompile(struct grep_data *g, const char *astr)
-{
- regex_t *preg = mh_xcalloc(1, sizeof(regex_t));
- char *buf;
- int ret;
-
- g->preg = preg;
- g->pattern = mh_xstrdup(astr);
- ret = regcomp(preg, astr, REG_ICASE | REG_NOSUB);
- if (ret != 0) {
- buf = mh_xcalloc(BUFSIZ, sizeof(char));
- regerror(ret, g->preg, buf, BUFSIZ*sizeof(char));
- fprintf(stderr, "%s\n", buf);
- return FALSE;
- }
- return TRUE;
-