/* * FIXME: a unique key could be built up as part of the parse, to make the * comparison quick. Alternatively we could use cons-hashing, and then * this would simply be a pointer comparison. */ static int _nodes_equal(struct rx_node *l, struct rx_node *r) { if (l->type != r->type) return 0; switch (l->type) { case CAT: case OR: return _nodes_equal(l->left, r->left) && _nodes_equal(l->right, r->right); case STAR: case PLUS: case QUEST: return _nodes_equal(l->left, r->left); case CHARSET: /* * Never change anything containing TARGET_TRANS * used by matcher as boundary marker between concatenated * expressions. */ return (!dm_bit(l->charset, TARGET_TRANS) && dm_bitset_equal(l->charset, r->charset)); } /* NOTREACHED */ return_0; }
static uint64_t find_next_zero_bit(dm_bitset_t bs, unsigned start) { for (; dm_bit(bs, start); start++) if (start >= *bs) return (uint64_t)-1; return start; }
int dm_is_dm_major(uint32_t major) { if (!_create_dm_bitset()) return 0; if (_dm_multiple_major_support) return dm_bit(_dm_bitset, major) ? 1 : 0; else return (major == _dm_device_major) ? 1 : 0; }
static void _regex_print(struct rx_node *rx, int depth, unsigned show_nodes) { int i, numchars; if (rx->left) { if (rx->left->type != CHARSET && (show_nodes || (!((rx->type == CAT || rx->type == OR) && rx->left->type == CAT)))) printf("("); _regex_print(rx->left, depth + 1, show_nodes); if (rx->left->type != CHARSET && (show_nodes || (!((rx->type == CAT || rx->type == OR) && rx->left->type == CAT)))) printf(")"); } /* display info about the node */ switch (rx->type) { case CAT: break; case OR: printf("|"); break; case STAR: printf("*"); break; case PLUS: printf("+"); break; case QUEST: printf("?"); break; case CHARSET: numchars = 0; for (i = 0; i < 256; i++) if (dm_bit(rx->charset, i) && (isprint(i) || i == HAT_CHAR || i == DOLLAR_CHAR)) numchars++; if (numchars == 97) { printf("."); break; } if (numchars > 1) printf("["); for (i = 0; i < 256; i++) if (dm_bit(rx->charset, i)) { if isprint(i) printf("%c", (char) i); else if (i == HAT_CHAR) printf("^"); else if (i == DOLLAR_CHAR) printf("$"); } if (numchars > 1) printf("]"); break; default: fprintf(stderr, "Unknown type"); }
static int log_test_bit(dm_bitset_t bs, int bit) { return dm_bit(bs, bit) ? 1 : 0; }