mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
d1b28647ed
and builds a *very* efficient engine that will tell you which regex a string matches with only a single pass through the string. To be used in the config file when specifying devices. o Anchor's aren't supported yet (^ and $) but that won't take long. o Also when we get some realistic config files we may want to consider adding an extra level of indirection to the dfa state in order to compress the table. It all depends on how large typical tables get.
80 lines
1.3 KiB
C
80 lines
1.3 KiB
C
/*
|
|
* Copyright (C) 2001 Sistina Software (UK) Limited.
|
|
*
|
|
* This file is released under the GPL.
|
|
*/
|
|
|
|
#include "bitset.h"
|
|
#include "dbg_malloc.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
/* FIXME: calculate this. */
|
|
#define INT_SHIFT 5
|
|
|
|
bitset_t bitset_create(struct pool *mem, unsigned num_bits)
|
|
{
|
|
int n = (num_bits / BITS_PER_INT) + 2;
|
|
int size = sizeof(int) * n;
|
|
unsigned *bs = pool_zalloc(mem, size);
|
|
|
|
if (!bs)
|
|
return NULL;
|
|
|
|
*bs = num_bits;
|
|
return bs;
|
|
}
|
|
|
|
void bitset_destroy(bitset_t bs)
|
|
{
|
|
dbg_free(bs);
|
|
}
|
|
|
|
void bit_union(bitset_t out, bitset_t in1, bitset_t in2)
|
|
{
|
|
int i;
|
|
for(i = (in1[0] / BITS_PER_INT) + 1; i; i--)
|
|
out[i] = in1[i] | in2[i];
|
|
}
|
|
|
|
/*
|
|
* FIXME: slow
|
|
*/
|
|
static inline int _test_word(uint32_t test, int bit)
|
|
{
|
|
while (bit < BITS_PER_INT) {
|
|
if (test & (0x1 << bit))
|
|
return bit;
|
|
bit++;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int bit_get_next(bitset_t bs, int last_bit)
|
|
{
|
|
int bit, word;
|
|
uint32_t test;
|
|
|
|
last_bit++; /* otherwise we'll return the same bit again */
|
|
|
|
while(last_bit < bs[0]) {
|
|
word = last_bit >> INT_SHIFT;
|
|
test = bs[word + 1];
|
|
bit = last_bit & (BITS_PER_INT - 1);
|
|
|
|
if ((bit = _test_word(test, bit)) >= 0)
|
|
return (word * BITS_PER_INT) + bit;
|
|
|
|
last_bit = last_bit - (last_bit & (BITS_PER_INT - 1)) +
|
|
BITS_PER_INT;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int bit_get_first(bitset_t bs)
|
|
{
|
|
return bit_get_next(bs, -1);
|
|
}
|