1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-03-10 16:58:47 +03:00

[REGEX] remove the state_queue structure.

Instead we just have a 'next' field in the dfa_state.
This commit is contained in:
Joe Thornber 2010-07-21 12:02:51 +00:00
parent aab1bfd693
commit ed72f7e13a

View File

@ -19,14 +19,10 @@
#include "assert.h" #include "assert.h"
struct dfa_state { struct dfa_state {
struct dfa_state *next;
int final; int final;
struct dfa_state *lookup[256];
};
struct state_queue {
struct dfa_state *s;
dm_bitset_t bits; dm_bitset_t bits;
struct state_queue *next; struct dfa_state *lookup[256];
}; };
struct dm_regex { /* Instance variables for the lexer */ struct dm_regex { /* Instance variables for the lexer */
@ -44,7 +40,7 @@ struct dm_regex { /* Instance variables for the lexer */
dm_bitset_t dfa_copy; dm_bitset_t dfa_copy;
struct ttree *tt; struct ttree *tt;
dm_bitset_t bs; dm_bitset_t bs;
struct state_queue *h, *t; struct dfa_state *h, *t;
}; };
static int _count_nodes(struct rx_node *rx) static int _count_nodes(struct rx_node *rx)
@ -206,29 +202,20 @@ static struct dfa_state *_create_dfa_state(struct dm_pool *mem)
return dm_pool_zalloc(mem, sizeof(struct dfa_state)); return dm_pool_zalloc(mem, sizeof(struct dfa_state));
} }
static struct state_queue *_create_state_queue(struct dm_pool *mem, static struct dfa_state *_create_state_queue(struct dm_pool *mem,
struct dfa_state *dfa, struct dfa_state *dfa,
dm_bitset_t bits) dm_bitset_t bits)
{ {
struct state_queue *r = dm_pool_alloc(mem, sizeof(*r)); dfa->bits = dm_bitset_create(mem, bits[0]); /* first element is the size */
dm_bit_copy(dfa->bits, bits);
if (!r) { dfa->next = 0;
stack; return dfa;
return NULL;
}
r->s = dfa;
r->bits = dm_bitset_create(mem, bits[0]); /* first element is the size */
dm_bit_copy(r->bits, bits);
r->next = 0;
return r;
} }
static void _calc_state(struct dm_regex *m, struct state_queue *h, int a) static void _calc_state(struct dm_regex *m, struct dfa_state *dfa, int a)
{ {
int set_bits = 0, i; int set_bits = 0, i;
struct dfa_state *dfa = h->s; dm_bitset_t dfa_bits = dfa->bits;
dm_bitset_t dfa_bits = h->bits;
dm_bit_and(m->dfa_copy, m->charmap[a], dfa_bits); dm_bit_and(m->dfa_copy, m->charmap[a], dfa_bits);
/* iterate through all the states in firstpos */ /* iterate through all the states in firstpos */
@ -241,7 +228,7 @@ static void _calc_state(struct dm_regex *m, struct state_queue *h, int a)
} }
if (set_bits) { /* FIXME: this is always true */ if (set_bits) { /* FIXME: this is always true */
struct state_queue *tmp; struct dfa_state *tmp;
struct dfa_state *ldfa = ttree_lookup(m->tt, m->bs + 1); struct dfa_state *ldfa = ttree_lookup(m->tt, m->bs + 1);
if (!ldfa) { if (!ldfa) {
/* push */ /* push */
@ -300,7 +287,7 @@ static int _calc_states(struct dm_regex *m, struct rx_node *rx)
m->dfa_copy = dm_bitset_create(m->scratch, m->num_charsets); m->dfa_copy = dm_bitset_create(m->scratch, m->num_charsets);
/* keep processing until there's nothing in the queue */ /* keep processing until there's nothing in the queue */
struct state_queue *s; struct dfa_state *s;
while ((s = m->h)) { while ((s = m->h)) {
/* pop state off front of the queue */ /* pop state off front of the queue */
m->h = m->h->next; m->h = m->h->next;