File: search.c

package info (click to toggle)
tweak 3.02-6
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 516 kB
  • sloc: ansic: 5,852; makefile: 245; perl: 12; sh: 1
file content (56 lines) | stat: -rw-r--r-- 969 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "tweak.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static DFA build_dfa (char *pattern, int len)
{
    int i, j, k, b;
    char *tmp = malloc(len);
    DFA dfa = malloc(len * sizeof(*dfa));

    if (!dfa)
	return NULL;
    if (!tmp)
	return NULL;

    memcpy (tmp, pattern, len);

    for (i=len; i-- ;) {
	j = i+1;
	for (b=0; b<256; b++) {
	    dfa[i][b] = 0;
	    if (memchr(pattern, b, len)) {
		tmp[j-1] = b;
		for (k=1; k<=j; k++)
		    if (!memcmp(tmp+j-k, pattern, k))
			dfa[i][b] = k;
	    }
	}
    }

    return dfa;
}

Search *build_search(char *pattern, int len)
{
    Search *ret = malloc(sizeof(Search));
    char *revpat = malloc(len);
    int i;

    ret->len = len;
    ret->forward = build_dfa(pattern, len);
    for (i = 0; i < len; i++)
	revpat[i] = pattern[len-1-i];
    ret->reverse = build_dfa(revpat, len);

    return ret;
}

void free_search(Search *s)
{
    free(s->forward);
    free(s->reverse);
    free(s);
}