コード例 #1
0
ファイル: sre_regex_compiler.c プロジェクト: seckcoder/sregex
static sre_int_t
sre_regex_compiler_add_char_class(sre_pool_t *pool, sre_instruction_t *pc,
                                  sre_regex_range_t *range)
{
    sre_char             *p;
    sre_uint_t            i, n;
    sre_regex_range_t    *r;

    n = 0;
    for (r = range; r; r = r->next) {
        n++;
    }

    p = sre_pnalloc(pool,
                    sizeof(sre_vm_ranges_t) + n * sizeof(sre_vm_range_t));
    if (p == NULL) {
        return SRE_ERROR;
    }

    pc->v.ranges = (sre_vm_ranges_t *) p;

    p += sizeof(sre_vm_ranges_t);
    pc->v.ranges->head = (sre_vm_range_t *) p;

    pc->v.ranges->count = n;

    for (i = 0, r = range; r; i++, r = r->next) {
        pc->v.ranges->head[i].from = r->from;
        pc->v.ranges->head[i].to = r->to;
    }

    return SRE_OK;
}
コード例 #2
0
sre_vm_thompson_thread_list_t *
sre_vm_thompson_create_thread_list(sre_pool_t *pool, sre_uint_t size)
{
    sre_vm_thompson_thread_list_t       *l;

    l = sre_pnalloc(pool, sizeof(sre_vm_thompson_thread_list_t)
                    + (size - 1) * sizeof(sre_vm_thompson_thread_t));
    if (l == NULL) {
        return NULL;
    }

    l->count = 0;

    return l;
}
コード例 #3
0
ファイル: sre_vm_thompson.c プロジェクト: eagles125/sregex
static sre_vm_thompson_thread_list_t *
sre_vm_thompson_thread_list_create(sre_pool_t *pool, int size)
{
    u_char                              *p;
    sre_vm_thompson_thread_list_t       *l;

    p = sre_pnalloc(pool, sizeof(sre_vm_thompson_thread_list_t)
                    + size * sizeof(sre_vm_thompson_thread_t));
    if (p == NULL) {
        return NULL;
    }

    l = (sre_vm_thompson_thread_list_t *) p;

    p += sizeof(sre_vm_thompson_thread_list_t);
    l->threads = (sre_vm_thompson_thread_t *) p;

    l->count = 0;

    return l;
}
コード例 #4
0
ファイル: sre_capture.c プロジェクト: SheldonPatnett/sregex
SRE_NOAPI sre_capture_t *
sre_capture_create(sre_pool_t *pool, size_t ovecsize, unsigned clear,
    sre_capture_t **freecap)
{
    sre_char            *p;
    sre_capture_t       *cap;

    if (*freecap) {
        dd("reusing cap %p", *freecap);
        cap = *freecap;
        *freecap = cap->next;
        cap->next = NULL;
        cap->ref = 1;

    } else {
        p = sre_pnalloc(pool, sizeof(sre_capture_t) + ovecsize);
        if (p == NULL) {
            return NULL;
        }

        cap = (sre_capture_t *) p;

        cap->ovecsize = ovecsize;
        cap->ref = 1;
        cap->next = NULL;
        cap->regex_id = 0;

        p += sizeof(sre_capture_t);
        cap->vector = (sre_int_t *) p;
    }

    if (clear) {
        (void) memset(cap->vector, -1, ovecsize);
    }

    return cap;
}
コード例 #5
0
ファイル: sre_regex_compiler.c プロジェクト: seckcoder/sregex
sre_program_t *
sre_regex_compile(sre_pool_t *pool, sre_regex_t *re)
{
    sre_uint_t           i, n, multi_ncaps_size;
    sre_char            *p;
    sre_program_t       *prog;
    sre_instruction_t   *pc;

    n = sre_program_len(re);

    multi_ncaps_size = (re->nregexes - 1) * sizeof(sre_uint_t);

    p = sre_pnalloc(pool,
                    sizeof(sre_program_t) + multi_ncaps_size
                    + n * sizeof(sre_instruction_t));

    if (p == NULL) {
        return NULL;
    }

    prog = (sre_program_t *) p;

    prog->nregexes = re->nregexes;

    memcpy(prog->multi_ncaps, re->data.multi_ncaps,
           re->nregexes * sizeof(sre_uint_t));

    prog->start = (sre_instruction_t *) (p + sizeof(sre_program_t)
                                         + multi_ncaps_size);

    sre_memzero(prog->start, n * sizeof(sre_instruction_t));

    pc = sre_regex_emit_bytecode(pool, prog->start, re);
    if (pc == NULL) {
        return NULL;
    }

    if (pc - prog->start != n) {
        dd("buffer error: %d != %d", (int) (pc - prog->start), (int) n);
        return NULL;
    }

    prog->len = pc - prog->start;
    prog->tag = 0;
    prog->lookahead_asserts = 0;
    prog->dup_threads = 0;
    prog->uniq_threads = 0;
    prog->nullable = 0;
    prog->leading_bytes = NULL;
    prog->leading_byte = -1;

    prog->ovecsize = 0;
    for (i = 0; i < prog->nregexes; i++) {
        prog->ovecsize += prog->multi_ncaps[i] + 1;
    }
    prog->ovecsize *= 2 * sizeof(sre_uint_t);

    if (sre_program_get_leading_bytes(pool, prog, &prog->leading_bytes)
            == SRE_ERROR)
    {
        return NULL;
    }

    if (prog->leading_bytes && prog->leading_bytes->next == NULL) {
        pc = prog->leading_bytes->data;
        if (pc->opcode == SRE_OPCODE_CHAR) {
            prog->leading_byte = pc->v.ch;
        }
    }

    dd("nullable: %u", prog->nullable);

#if (DDEBUG)
    {
        sre_chain_t         *cl;

        for (cl = prog->leading_bytes; cl; cl = cl->next) {
            pc = cl->data;
            fprintf(stderr, "[");
            sre_dump_instruction(stderr, pc, prog->start);
            fprintf(stderr, "]");
        }
        if (prog->leading_bytes) {
            fprintf(stderr, "\n");
        }
    }
#endif

    return prog;
}