1 /* Copyright (C) 2006, Index Data ApS
2 * See the file LICENSE for details.
4 * $Id: nfatest1.c,v 1.3 2006-05-04 18:59:13 adam Exp $
17 char *printfunc(void *result) {
19 sprintf(buf, "\"%s\"", (char*) result);
23 void test_match(yaz_nfa *n,
24 yaz_nfa_char *buf, int buflen,
25 int expcode, char *expstr) {
26 yaz_nfa_char *c = buf;
27 yaz_nfa_char *cp1, *cp2;
30 i = yaz_nfa_match(n,&c, buflen,&resptr);
32 printf("\n'%s' returned %d. Moved c by %d, and resulted in '%s'\n",
33 expstr, i, (c-buf),(char*)resptr);
35 YAZ_CHECK_EQ(i, expcode);
37 YAZ_CHECK_EQ(strcmp(expstr,(char*)resptr), 0);
41 bi = yaz_nfa_get_backref(n, i,&cp1,&cp2);
42 if (bi==0 && ( cp1 || cp2 ) ) {
44 printf(" got backref %d of %d chars (%p to %p): '",
45 i, cp2-cp1+1, cp1, cp2);
55 void construction_test() {
56 yaz_nfa* n= yaz_nfa_init();
57 yaz_nfa_char *cp, *cp1, *cp2;
58 yaz_nfa_state *s, *s0, *s1, *s2, *s3, *s4, *s5;
60 yaz_nfa_char seq1[]={'p', 'r', 'e', 'f', 'i', 'x', 0};
61 yaz_nfa_char seq2[]={'p', 'r', 'e', 'l', 'i', 'm', 0};
62 yaz_nfa_char tst1[]={'c', 0};
63 yaz_nfa_char tst2[]={'c', 'k', 0};
64 yaz_nfa_char tst3[]={'c', 'x', 0};
65 yaz_nfa_char tst4[]={'z', 'k', 0};
66 yaz_nfa_char tst5[]={'y', 'k', 'l', 'k', 'k', 'l', 'k', 'd', 0};
67 yaz_nfa_char tst6[]={'x', 'z', 'k', 'a', 'b', 0};
72 s = yaz_nfa_get_first(n);
75 s0 = yaz_nfa_add_state(n);
77 s = yaz_nfa_get_first(n);
79 s = yaz_nfa_get_next(n, s);
82 s1 = yaz_nfa_add_state(n);
83 i = yaz_nfa_set_result(n, s1, "first");
86 i = yaz_nfa_set_result(n, s1, "DUPLICATE");
89 p = yaz_nfa_get_result(n, s1);
91 YAZ_CHECK( strcmp((char*)p, "first")==0 );
93 i = yaz_nfa_set_result(n, s1, 0);
95 p = yaz_nfa_get_result(n, s1);
97 i = yaz_nfa_set_result(n, s1, "first");
100 s2 = yaz_nfa_add_state(n);
101 s3 = yaz_nfa_add_state(n);
102 yaz_nfa_set_result(n, s3, "a-k, x-z");
104 s = yaz_nfa_get_first(n);
106 s = yaz_nfa_get_next(n, s);
110 yaz_nfa_add_transition(n, s0, s1, 'a', 'k');
111 yaz_nfa_add_transition(n, s1, s1, 'k', 'k');
112 yaz_nfa_add_transition(n, s0, s2, 'p', 'p');
113 yaz_nfa_add_transition(n, s1, s3, 'x', 'z');
115 s = yaz_nfa_add_range(n, 0, 'k', 's' );
116 yaz_nfa_set_result(n, s, "K-S");
118 s4 = yaz_nfa_add_range(n, s2, 'l', 'r' );
119 s5 = yaz_nfa_add_range(n, s2, 'l', 'r' );
121 s = yaz_nfa_add_range(n, 0, 'c', 'c' );
123 s = yaz_nfa_add_range(n, 0, 'z', 'z' );
124 yaz_nfa_add_empty_transition(n, s, s);
125 yaz_nfa_set_result(n, s, "loop");
127 s = yaz_nfa_add_range(n, 0, 'y', 'y' );
128 yaz_nfa_set_backref_point(n, s, 1, 1);
129 s1 = yaz_nfa_add_state(n);
130 yaz_nfa_add_empty_transition(n, s, s1);
132 yaz_nfa_add_transition(n, s, s, 'k', 'l');
133 s = yaz_nfa_add_range(n, s, 'd', 'd' );
134 yaz_nfa_set_result(n, s, "y k+ d");
135 yaz_nfa_set_backref_point(n, s, 1, 0);
137 s = yaz_nfa_add_sequence(n, 0, seq1 );
138 yaz_nfa_set_result(n, s, "PREFIX");
139 s = yaz_nfa_add_sequence(n, 0, seq2 );
140 yaz_nfa_set_result(n, s, "PRELIM");
142 s = yaz_nfa_add_range(n, 0, 'x', 'x' );
143 yaz_nfa_set_backref_point(n, s, 2, 1);
144 s1 = yaz_nfa_add_sequence(n, s, tst4);
145 yaz_nfa_set_backref_point(n, s1, 2, 0);
146 yaz_nfa_set_result(n, s1, "xzk");
148 /* check return codes before doing any matches */
149 i = yaz_nfa_get_backref(n, 0, &cp1, &cp2 );
151 i = yaz_nfa_get_backref(n, 3, &cp1, &cp2 );
153 i = yaz_nfa_get_backref(n, 1, &cp1, &cp2 );
158 yaz_nfa_dump(0, n, printfunc);
161 test_match(n, seq2, 3, YAZ_NFA_OVERRUN, "K-S");
162 test_match(n, seq2, 6, YAZ_NFA_SUCCESS, "PRELIM");
163 test_match(n, tst1, 3, YAZ_NFA_SUCCESS, "first");
164 test_match(n, tst2, 3, YAZ_NFA_SUCCESS, "first");
165 test_match(n, tst3, 3, YAZ_NFA_SUCCESS, "a-k, x-z");
166 test_match(n, tst4, 9, YAZ_NFA_LOOP, "loop");
167 test_match(n, tst5, 9, YAZ_NFA_SUCCESS, "y k+ d");
170 i = yaz_nfa_match(n,&cp, 8,&p);
171 YAZ_CHECK_EQ(i, YAZ_NFA_SUCCESS);
172 i = yaz_nfa_get_backref(n, 2, &cp1, &cp2 );
175 printf("backref from %p to %p is %d long\n",
182 int main(int argc, char **argv)
184 YAZ_CHECK_INIT(argc, argv);
195 * indent-tabs-mode: nil
197 * vim: shiftwidth=4 tabstop=8 expandtab