1 /* Copyright (C) 2006, Index Data ApS
2 * See the file LICENSE for details.
4 * $Id: nfatest1.c,v 1.5 2006-05-05 14:02:27 heikki Exp $
17 char *printfunc(void *result) {
19 sprintf(buf, "\"%s\"", (char*) result);
23 char *printfunc2(void *result) {
25 sprintf(buf,"(%p)", result);
29 void test_match(yaz_nfa *n,
30 yaz_nfa_char *buf, size_t buflen,
31 int expcode, char *expstr) {
32 yaz_nfa_char *c = buf;
33 yaz_nfa_char *cp1, *cp2;
36 size_t buflen2 = buflen;
37 i = yaz_nfa_match(n,&c, &buflen2,&resptr);
39 printf("\n'%s' returned %d. Moved c by %d, and resulted in '%s'\n",
40 expstr, i, (c-buf),(char*)resptr);
42 YAZ_CHECK_EQ(buflen-buflen2, c-buf);
43 YAZ_CHECK_EQ(i, expcode);
45 YAZ_CHECK_EQ(strcmp(expstr,(char*)resptr), 0);
49 bi = yaz_nfa_get_backref(n, i,&cp1,&cp2);
50 if (bi==0 && ( cp1 || cp2 ) ) {
52 printf(" got backref %d of %d chars (%p to %p): '",
53 i, cp2-cp1+1, cp1, cp2);
63 void construction_test() {
64 yaz_nfa* n= yaz_nfa_init();
65 yaz_nfa_char *cp, *cp1, *cp2;
66 yaz_nfa_state *s, *s0, *s1, *s2, *s3, *s4, *s5;
68 yaz_nfa_char seq1[]={'p', 'r', 'e', 'f', 'i', 'x', 0};
69 yaz_nfa_char seq2[]={'p', 'r', 'e', 'l', 'i', 'm', 0};
70 yaz_nfa_char tst1[]={'c', 0};
71 yaz_nfa_char tst2[]={'c', 'k', 0};
72 yaz_nfa_char tst3[]={'c', 'x', 0};
73 yaz_nfa_char tst4[]={'z', 'k', 0};
74 yaz_nfa_char tst5[]={'y', 'k', 'l', 'k', 'k', 'l', 'k', 'd', 0};
75 yaz_nfa_char tst6[]={'x', 'z', 'k', 'a', 'b', 0};
81 s = yaz_nfa_get_first(n);
84 s0 = yaz_nfa_add_state(n);
86 s = yaz_nfa_get_first(n);
88 s = yaz_nfa_get_next(n, s);
91 s1 = yaz_nfa_add_state(n);
92 i = yaz_nfa_set_result(n, s1, "first");
95 i = yaz_nfa_set_result(n, s1, "DUPLICATE");
98 p = yaz_nfa_get_result(n, s1);
100 YAZ_CHECK( strcmp((char*)p, "first")==0 );
102 i = yaz_nfa_set_result(n, s1, 0);
104 p = yaz_nfa_get_result(n, s1);
106 i = yaz_nfa_set_result(n, s1, "first");
109 s2 = yaz_nfa_add_state(n);
110 s3 = yaz_nfa_add_state(n);
111 yaz_nfa_set_result(n, s3, "a-k, x-z");
113 s = yaz_nfa_get_first(n);
115 s = yaz_nfa_get_next(n, s);
119 yaz_nfa_add_transition(n, s0, s1, 'a', 'k');
120 yaz_nfa_add_transition(n, s1, s1, 'k', 'k');
121 yaz_nfa_add_transition(n, s0, s2, 'p', 'p');
122 yaz_nfa_add_transition(n, s1, s3, 'x', 'z');
124 s = yaz_nfa_add_range(n, 0, 'k', 's' );
125 yaz_nfa_set_result(n, s, "K-S");
127 s4 = yaz_nfa_add_range(n, s2, 'l', 'r' );
128 s5 = yaz_nfa_add_range(n, s2, 'l', 'r' );
130 s = yaz_nfa_add_range(n, 0, 'c', 'c' );
132 s = yaz_nfa_add_range(n, 0, 'z', 'z' );
133 yaz_nfa_add_empty_transition(n, s, s);
134 yaz_nfa_set_result(n, s, "loop");
136 s = yaz_nfa_add_range(n, 0, 'y', 'y' );
137 yaz_nfa_set_backref_point(n, s, 1, 1);
138 s1 = yaz_nfa_add_state(n);
139 yaz_nfa_add_empty_transition(n, s, s1);
141 yaz_nfa_add_transition(n, s, s, 'k', 'l');
142 s = yaz_nfa_add_range(n, s, 'd', 'd' );
143 yaz_nfa_set_result(n, s, "y k+ d");
144 yaz_nfa_set_backref_point(n, s, 1, 0);
146 s = yaz_nfa_add_sequence(n, 0, seq1 );
147 yaz_nfa_set_result(n, s, "PREFIX");
148 s = yaz_nfa_add_sequence(n, 0, seq2 );
149 yaz_nfa_set_result(n, s, "PRELIM");
151 s = yaz_nfa_add_range(n, 0, 'x', 'x' );
152 yaz_nfa_set_backref_point(n, s, 2, 1);
153 s1 = yaz_nfa_add_sequence(n, s, tst4);
154 yaz_nfa_set_backref_point(n, s1, 2, 0);
155 yaz_nfa_set_result(n, s1, "xzk");
157 /* check return codes before doing any matches */
158 i = yaz_nfa_get_backref(n, 0, &cp1, &cp2 );
160 i = yaz_nfa_get_backref(n, 3, &cp1, &cp2 );
162 i = yaz_nfa_get_backref(n, 1, &cp1, &cp2 );
167 yaz_nfa_dump(0, n, printfunc);
170 test_match(n, seq2, 3, YAZ_NFA_OVERRUN, "K-S");
171 test_match(n, seq2, 6, YAZ_NFA_SUCCESS, "PRELIM");
172 test_match(n, tst1, 3, YAZ_NFA_SUCCESS, "first");
173 test_match(n, tst2, 3, YAZ_NFA_SUCCESS, "first");
174 test_match(n, tst3, 3, YAZ_NFA_SUCCESS, "a-k, x-z");
175 test_match(n, tst4, 9, YAZ_NFA_LOOP, "loop");
176 test_match(n, tst5, 9, YAZ_NFA_SUCCESS, "y k+ d");
178 cp = tst6; /* xzkab */
180 i = yaz_nfa_match(n, &cp, &sz, &p);
181 YAZ_CHECK_EQ(i, YAZ_NFA_SUCCESS);
182 i = yaz_nfa_get_backref(n, 2, &cp1, &cp2 );
184 YAZ_CHECK_EQ(cp2-cp1+1,2);
185 YAZ_CHECK_EQ(*cp1, 'z' );
186 YAZ_CHECK_EQ(*cp2, 'k' );
188 printf("backref from %p '%c' to %p '%c' is %d long. sz is now %d\n",
189 cp1, *cp1, cp2, *cp2, cp2-cp1+1, sz );
195 void converter_test() {
196 yaz_nfa* n= yaz_nfa_init();
197 yaz_nfa_converter *c1, *c2, *c3;
198 yaz_nfa_char str1[]={'a','b','c'};
199 yaz_nfa_char seq1[]={'A','B','C',0};
200 yaz_nfa_char seq2[]={'k','m','n','m','x','P','Q','X',0};
201 yaz_nfa_char outbuf[1024];
202 yaz_nfa_char *outp, *cp, *cp1, *cp2;
203 yaz_nfa_state *s, *s2;
208 c1=yaz_nfa_create_string_converter(n,str1,3);
214 i=yaz_nfa_run_converters(n, c1, &outp, &sz);
215 YAZ_CHECK_EQ(i,2); /* overrun */
216 YAZ_CHECK_EQ(outbuf[0],'a');
217 YAZ_CHECK_EQ(outbuf[1],10000+1);
223 i=yaz_nfa_run_converters(n, c1, &outp, &sz);
225 YAZ_CHECK_EQ(outbuf[0],'a');
226 YAZ_CHECK_EQ(outbuf[1],'b');
227 YAZ_CHECK_EQ(outbuf[2],'c');
228 YAZ_CHECK_EQ(outbuf[3],10000+3);
231 c2=yaz_nfa_create_string_converter(n,str1,2);
232 yaz_nfa_append_converter(n,c1,c2);
238 i=yaz_nfa_run_converters(n, c1, &outp, &sz);
240 YAZ_CHECK_EQ(outbuf[0],'a');
241 YAZ_CHECK_EQ(outbuf[1],'b');
242 YAZ_CHECK_EQ(outbuf[2],'c');
243 YAZ_CHECK_EQ(outbuf[3],'a');
244 YAZ_CHECK_EQ(outbuf[4],'b');
245 YAZ_CHECK_EQ(outbuf[5],10000+5);
249 (void) yaz_nfa_add_state(n);/* start state */
250 s=yaz_nfa_add_state(n);
251 yaz_nfa_add_empty_transition(n,0,s);
252 yaz_nfa_set_backref_point(n,s,1,1);
253 s=yaz_nfa_add_sequence(n, s, seq1 );
254 yaz_nfa_set_result(n,s,c1);
255 yaz_nfa_set_backref_point(n,s,1,0);
257 /* ([k-o][m-n]*)x -> \1 */
258 s=yaz_nfa_add_state(n);
259 yaz_nfa_add_empty_transition(n,0,s);
260 yaz_nfa_set_backref_point(n,s,2,1);
261 s2=yaz_nfa_add_state(n);
262 yaz_nfa_add_transition(n,s,s2,'k','o');
263 yaz_nfa_add_transition(n,s2,s2,'m','n');
264 s=yaz_nfa_add_state(n);
265 yaz_nfa_add_transition(n,s2,s,'x','x');
266 yaz_nfa_set_backref_point(n,s,2,0);
268 c1=yaz_nfa_create_backref_converter(n,2);
269 yaz_nfa_set_result(n,s,c1);
272 yaz_nfa_dump(0,n, printfunc2);
277 i=yaz_nfa_match(n,&cp,&sz,&vp);
279 YAZ_CHECK_EQ(i,YAZ_NFA_SUCCESS);
280 i=yaz_nfa_get_backref(n, 2, &cp1, &cp2 );
282 printf("backref from %p '%c' to %p '%c' is %d long. sz is now %d\n",
283 cp1, *cp1, cp2, *cp2, cp2-cp1+1, sz );
286 YAZ_CHECK_EQ((int)c1,(int)c2); /* got our pointer back from nfa */
291 i=yaz_nfa_run_converters(n, c2, &outp, &sz);
293 YAZ_CHECK_EQ(outbuf[0],'k');
294 YAZ_CHECK_EQ(outbuf[1],'m');
295 YAZ_CHECK_EQ(outbuf[2],'n');
296 YAZ_CHECK_EQ(outbuf[3],'m');
297 YAZ_CHECK_EQ(outbuf[4],'x');
298 YAZ_CHECK_EQ(outbuf[5],10000+5);
299 YAZ_CHECK_EQ(sz,11-5);
301 c3=yaz_nfa_create_range_converter(n,2, 'a', 'A' );
306 i=yaz_nfa_run_converters(n, c3, &outp, &sz);
308 YAZ_CHECK_EQ(outbuf[0],'K');
309 YAZ_CHECK_EQ(outbuf[1],'M');
310 YAZ_CHECK_EQ(outbuf[2],'N');
311 YAZ_CHECK_EQ(outbuf[3],'M');
312 YAZ_CHECK_EQ(outbuf[4],'X');
313 YAZ_CHECK_EQ(outbuf[5],10000+5);
314 YAZ_CHECK_EQ(sz,11-5);
320 int main(int argc, char **argv)
322 YAZ_CHECK_INIT(argc, argv);
334 * indent-tabs-mode: nil
336 * vim: shiftwidth=4 tabstop=8 expandtab