- s=yaz_nfa_add_range(n, 0, 'c','c' );
-
- s=yaz_nfa_add_range(n, 0, 'z','z' );
- yaz_nfa_add_empty_transition(n,s,s);
- yaz_nfa_set_result(n,s,"loop");
-
- s=yaz_nfa_add_range(n, 0, 'y','y' );
- s1=yaz_nfa_add_state(n);
- yaz_nfa_set_backref(n,s1,1,1);
- yaz_nfa_add_empty_transition(n,s,s1);
- s=s1;
- yaz_nfa_add_transition(n,s,s,'k','k');
- s=yaz_nfa_add_range(n, s, 'y','y' );
- yaz_nfa_set_result(n,s,"y k+ y");
- yaz_nfa_set_backref(n,s,1,0);
-
- s=yaz_nfa_add_sequence(n, 0, seq1 );
- yaz_nfa_set_result(n,s,"PREFIX");
- s=yaz_nfa_add_sequence(n, 0, seq2 );
- yaz_nfa_set_result(n,s,"PRELIM");
+ s = yaz_nfa_add_range(n, 0, 'c', 'c' );
+
+ s = yaz_nfa_add_range(n, 0, 'z', 'z' );
+ yaz_nfa_add_empty_transition(n, s, s);
+ yaz_nfa_set_result(n, s, "loop");
+
+ s = yaz_nfa_add_range(n, 0, 'y', 'y' );
+ yaz_nfa_set_backref_point(n, s, 1, 1);
+ s1 = yaz_nfa_add_state(n);
+ yaz_nfa_add_empty_transition(n, s, s1);
+ s = s1;
+ yaz_nfa_add_transition(n, s, s, 'k', 'l');
+ s = yaz_nfa_add_range(n, s, 'd', 'd' );
+ yaz_nfa_set_result(n, s, "y k+ d");
+ yaz_nfa_set_backref_point(n, s, 1, 0);
+
+ s = yaz_nfa_add_sequence(n, 0, seq1 );
+ yaz_nfa_set_result(n, s, "PREFIX");
+ s = yaz_nfa_add_sequence(n, 0, seq2 );
+ yaz_nfa_set_result(n, s, "PRELIM");
+
+ s = yaz_nfa_add_range(n, 0, 'x', 'x' );
+ yaz_nfa_set_backref_point(n, s, 2, 1);
+ s1 = yaz_nfa_add_sequence(n, s, tst4);
+ yaz_nfa_set_backref_point(n, s1, 2, 0);
+ yaz_nfa_set_result(n, s1, "xzk");
+
+ /* check return codes before doing any matches */
+ i = yaz_nfa_get_backref(n, 0, &cp1, &cp2 );
+ YAZ_CHECK_EQ(i, 1);
+ i = yaz_nfa_get_backref(n, 3, &cp1, &cp2 );
+ YAZ_CHECK_EQ(i, 2);
+ i = yaz_nfa_get_backref(n, 1, &cp1, &cp2 );
+ YAZ_CHECK_EQ(i, 1);
+
+
+#if VERBOSE
+ yaz_nfa_dump(0, n, printfunc);
+#endif
+
+ test_match(n, seq2, 3, YAZ_NFA_OVERRUN, "K-S");
+ test_match(n, seq2, 6, YAZ_NFA_SUCCESS, "PRELIM");
+ test_match(n, tst1, 3, YAZ_NFA_SUCCESS, "first");
+ test_match(n, tst2, 3, YAZ_NFA_SUCCESS, "first");
+ test_match(n, tst3, 3, YAZ_NFA_SUCCESS, "a-k, x-z");
+ test_match(n, tst4, 9, YAZ_NFA_LOOP, "loop");
+ test_match(n, tst5, 9, YAZ_NFA_SUCCESS, "y k+ d");
+
+ cp = tst6; /* xzkab */
+ sz = 8;
+ i = yaz_nfa_match(n, &cp, &sz, &p);
+ YAZ_CHECK_EQ(i, YAZ_NFA_SUCCESS);
+ i = yaz_nfa_get_backref(n, 2, &cp1, &cp2 );
+ YAZ_CHECK_EQ(i, 0);
+ YAZ_CHECK_EQ(cp2-cp1+1,2);
+ YAZ_CHECK_EQ(*cp1, 'z' );
+ YAZ_CHECK_EQ(*cp2, 'k' );
+#if VERBOSE
+ printf("backref from %p '%c' to %p '%c' is %d long. sz is now %d\n",
+ cp1, *cp1, cp2, *cp2, cp2-cp1+1, sz );
+#endif
+
+ yaz_nfa_destroy(n);
+}
+
+void converter_test() {
+ yaz_nfa* n= yaz_nfa_init();
+ yaz_nfa_converter *c1, *c2, *c3;
+ yaz_nfa_char str1[]={'a','b','c'};
+ yaz_nfa_char seq1[]={'A','B','C',0};
+ yaz_nfa_char seq2[]={'k','m','n','m','x','P','Q','X',0};
+ yaz_nfa_char outbuf[1024];
+ yaz_nfa_char *outp, *cp, *cp1, *cp2;
+ yaz_nfa_state *s, *s2;
+ void *vp;
+ int i;
+ size_t sz;
+
+ c1=yaz_nfa_create_string_converter(n,str1,3);
+
+ for(i=0;i<1024;i++)
+ outbuf[i]=10000+i;
+ outp=outbuf;
+ sz=1;
+ i=yaz_nfa_run_converters(n, c1, &outp, &sz);
+ YAZ_CHECK_EQ(i,2); /* overrun */
+ YAZ_CHECK_EQ(outbuf[0],'a');
+ YAZ_CHECK_EQ(outbuf[1],10000+1);
+
+ for(i=0;i<1024;i++)
+ outbuf[i]=10000+i;
+ outp=outbuf;
+ sz=3;
+ i=yaz_nfa_run_converters(n, c1, &outp, &sz);
+ YAZ_CHECK_EQ(i,0);
+ YAZ_CHECK_EQ(outbuf[0],'a');
+ YAZ_CHECK_EQ(outbuf[1],'b');
+ YAZ_CHECK_EQ(outbuf[2],'c');
+ YAZ_CHECK_EQ(outbuf[3],10000+3);
+ YAZ_CHECK_EQ(sz,0);
+
+ c2=yaz_nfa_create_string_converter(n,str1,2);
+ yaz_nfa_append_converter(n,c1,c2);
+
+ for(i=0;i<1024;i++)
+ outbuf[i]=10000+i;
+ outp=outbuf;
+ sz=10;
+ i=yaz_nfa_run_converters(n, c1, &outp, &sz);
+ YAZ_CHECK_EQ(i,0);
+ YAZ_CHECK_EQ(outbuf[0],'a');
+ YAZ_CHECK_EQ(outbuf[1],'b');
+ YAZ_CHECK_EQ(outbuf[2],'c');
+ YAZ_CHECK_EQ(outbuf[3],'a');
+ YAZ_CHECK_EQ(outbuf[4],'b');
+ YAZ_CHECK_EQ(outbuf[5],10000+5);
+ YAZ_CHECK_EQ(sz,5);
+
+ /* ABC -> abcab */
+ (void) yaz_nfa_add_state(n);/* start state */
+ s=yaz_nfa_add_state(n);
+ yaz_nfa_add_empty_transition(n,0,s);
+ yaz_nfa_set_backref_point(n,s,1,1);
+ s=yaz_nfa_add_sequence(n, s, seq1 );
+ yaz_nfa_set_result(n,s,c1);
+ yaz_nfa_set_backref_point(n,s,1,0);
+
+ /* ([k-o][m-n]*)x -> \1 */
+ s=yaz_nfa_add_state(n);
+ yaz_nfa_add_empty_transition(n,0,s);
+ yaz_nfa_set_backref_point(n,s,2,1);
+ s2=yaz_nfa_add_state(n);
+ yaz_nfa_add_transition(n,s,s2,'k','o');
+ yaz_nfa_add_transition(n,s2,s2,'m','n');
+ s=yaz_nfa_add_state(n);
+ yaz_nfa_add_transition(n,s2,s,'x','x');
+ yaz_nfa_set_backref_point(n,s,2,0);
+
+ c1=yaz_nfa_create_backref_converter(n,2);
+ yaz_nfa_set_result(n,s,c1);