2b730eb98127fabe5d659dbfaa2922be15a37d67
[yaz-moved-to-github.git] / test / nfatest1.c
1 /*  Copyright (C) 2006, Index Data ApS
2  *  See the file LICENSE for details.
3  *
4  *  $Id: nfatest1.c,v 1.3 2006-05-04 18:59:13 adam Exp $
5  *
6  */
7
8
9 #include <stdio.h>
10 #include <string.h>
11 #include <yaz/nfa.h>
12 #include <yaz/nmem.h>
13 #include <yaz/test.h>
14
15 #define VERBOSE 1
16
17 char *printfunc(void *result) {
18     static char buf[200];
19     sprintf(buf, "\"%s\"", (char*) result);
20     return buf;
21 }
22
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;
28     void *resptr = 0;
29     int i, bi;
30     i = yaz_nfa_match(n,&c, buflen,&resptr);
31 #if VERBOSE    
32     printf("\n'%s' returned %d. Moved c by %d, and resulted in '%s'\n",
33             expstr, i, (c-buf),(char*)resptr);
34 #endif
35     YAZ_CHECK_EQ(i, expcode);
36     if (i!=1)
37         YAZ_CHECK_EQ(strcmp(expstr,(char*)resptr), 0);
38     i = 0;
39     bi = 0;
40     while(bi!=2){
41         bi = yaz_nfa_get_backref(n, i,&cp1,&cp2);
42         if (bi==0 && ( cp1 || cp2 ) ) {
43 #if VERBOSE    
44             printf("  got backref %d of %d chars (%p to %p): '",
45                     i, cp2-cp1+1, cp1, cp2);
46             while (cp2-cp1 >= 0 )
47                 printf("%c", *cp1++);
48             printf("'\n");
49 #endif
50         }
51         i++;
52     }
53 }
54
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;
59     int i;
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};
68     void *p;
69
70     YAZ_CHECK(n);
71
72     s = yaz_nfa_get_first(n);
73     YAZ_CHECK(!s);
74
75     s0 = yaz_nfa_add_state(n);
76
77     s = yaz_nfa_get_first(n);
78     YAZ_CHECK(s);
79     s = yaz_nfa_get_next(n, s);
80     YAZ_CHECK(!s);
81
82     s1 = yaz_nfa_add_state(n);
83     i = yaz_nfa_set_result(n, s1, "first");
84     YAZ_CHECK_EQ(i, 0);
85
86     i = yaz_nfa_set_result(n, s1, "DUPLICATE");
87     YAZ_CHECK_EQ(i, 1);
88
89     p = yaz_nfa_get_result(n, s1);
90     YAZ_CHECK(p);
91     YAZ_CHECK( strcmp((char*)p, "first")==0 );
92
93     i = yaz_nfa_set_result(n, s1, 0);
94     YAZ_CHECK_EQ(i, 0);
95     p = yaz_nfa_get_result(n, s1);
96     YAZ_CHECK(!p);
97     i = yaz_nfa_set_result(n, s1, "first");
98     YAZ_CHECK_EQ(i, 0);
99     
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");
103
104     s = yaz_nfa_get_first(n);
105     YAZ_CHECK(s);
106     s = yaz_nfa_get_next(n, s);
107     YAZ_CHECK(s);
108
109     
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');
114
115     s = yaz_nfa_add_range(n, 0, 'k', 's' );
116     yaz_nfa_set_result(n, s, "K-S");
117
118     s4 = yaz_nfa_add_range(n, s2, 'l', 'r' );
119     s5 = yaz_nfa_add_range(n, s2, 'l', 'r' );
120     YAZ_CHECK((s4==s5));
121     s = yaz_nfa_add_range(n, 0, 'c', 'c' );
122
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");
126
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);
131     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);
136
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");
141
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");
147
148     /* check return codes before doing any matches */
149     i = yaz_nfa_get_backref(n, 0, &cp1, &cp2 );
150     YAZ_CHECK_EQ(i, 1);
151     i = yaz_nfa_get_backref(n, 3, &cp1, &cp2 );
152     YAZ_CHECK_EQ(i, 2);
153     i = yaz_nfa_get_backref(n, 1, &cp1, &cp2 );
154     YAZ_CHECK_EQ(i, 1);
155
156     
157 #if VERBOSE    
158     yaz_nfa_dump(0, n, printfunc);
159 #endif
160
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");
168
169     cp = tst6;
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 );
173     YAZ_CHECK_EQ(i, 0);
174 #if VERBOSE    
175     printf("backref from %p to %p is %d long\n",
176             cp1, cp2, cp2-cp1 );
177 #endif
178
179     yaz_nfa_destroy(n);
180 }
181
182 int main(int argc, char **argv)
183 {
184     YAZ_CHECK_INIT(argc, argv);
185     nmem_init ();
186     construction_test();
187     nmem_exit ();
188     YAZ_CHECK_TERM;
189 }
190
191
192 /* 
193  * Local variables:
194  * c-basic-offset: 4
195  * indent-tabs-mode: nil
196  * End:
197  * vim: shiftwidth=4 tabstop=8 expandtab
198  */