Fixed the interface to match,
[yaz-moved-to-github.git] / test / nfatest1.c
index 2b730eb..7ae8b29 100644 (file)
@@ -1,7 +1,7 @@
 /*  Copyright (C) 2006, Index Data ApS
  *  See the file LICENSE for details.
  *
- *  $Id: nfatest1.c,v 1.3 2006-05-04 18:59:13 adam Exp $
+ *  $Id: nfatest1.c,v 1.4 2006-05-05 09:14:42 heikki Exp $
  *
  */
 
@@ -20,18 +20,26 @@ char *printfunc(void *result) {
     return buf;
 }
 
+char *printfunc2(void *result) {
+    static char buf[200];
+    sprintf(buf,"(%p)",  result);
+    return buf;
+}
+
 void test_match(yaz_nfa *n, 
-        yaz_nfa_char *buf, int buflen, 
+        yaz_nfa_char *buf, size_t buflen, 
         int expcode, char *expstr) {
     yaz_nfa_char *c = buf;
     yaz_nfa_char *cp1, *cp2;
     void *resptr = 0;
     int i, bi;
-    i = yaz_nfa_match(n,&c, buflen,&resptr);
+    size_t buflen2 = buflen;
+    i = yaz_nfa_match(n,&c, &buflen2,&resptr);
 #if VERBOSE    
     printf("\n'%s' returned %d. Moved c by %d, and resulted in '%s'\n",
             expstr, i, (c-buf),(char*)resptr);
 #endif
+    YAZ_CHECK_EQ(buflen-buflen2, c-buf);
     YAZ_CHECK_EQ(i, expcode);
     if (i!=1)
         YAZ_CHECK_EQ(strcmp(expstr,(char*)resptr), 0);
@@ -66,6 +74,7 @@ void construction_test() {
     yaz_nfa_char tst5[]={'y', 'k', 'l', 'k', 'k', 'l', 'k', 'd', 0};
     yaz_nfa_char tst6[]={'x', 'z', 'k', 'a', 'b', 0};
     void *p;
+    size_t sz;
 
     YAZ_CHECK(n);
 
@@ -167,23 +176,131 @@ void construction_test() {
     test_match(n, tst5, 9, YAZ_NFA_SUCCESS, "y k+ d");
 
     cp = tst6;
-    i = yaz_nfa_match(n,&cp, 8,&p);
+    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);
 #if VERBOSE    
-    printf("backref from %p to %p is %d long\n",
-            cp1, cp2, cp2-cp1 );
+    printf("backref from %p to %p is %d long. sz is now %d\n",
+            cp1,cp2, cp2-cp1,sz );
 #endif
 
     yaz_nfa_destroy(n);
 }
 
+void converter_test() {
+    yaz_nfa* n= yaz_nfa_init();
+    yaz_nfa_converter *c1,*c2;
+    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 -> m-n sequence */
+    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);
+
+#if VERBOSE    
+    yaz_nfa_dump(0,n, printfunc2);
+#endif
+
+    cp=seq2;
+    sz=18;
+    i=yaz_nfa_match(n,&cp,&sz,&vp);
+    c2=vp;
+    YAZ_CHECK_EQ(i,YAZ_NFA_SUCCESS); 
+    i=yaz_nfa_get_backref(n, 2, &cp1, &cp2 );
+    YAZ_CHECK_EQ(i,0);
+    YAZ_CHECK_EQ((int)c1,(int)c2);
+    for(i=0;i<1024;i++)
+        outbuf[i]=10000+i;
+    outp=outbuf;
+    sz=11;
+    i=yaz_nfa_run_converters(n, c2, &outp, &sz);
+    YAZ_CHECK_EQ(i,0); 
+    YAZ_CHECK_EQ(outbuf[0],'k');
+    YAZ_CHECK_EQ(outbuf[1],'m');
+    YAZ_CHECK_EQ(outbuf[2],'n');
+    YAZ_CHECK_EQ(outbuf[3],'m');
+    YAZ_CHECK_EQ(outbuf[4],'x');
+    YAZ_CHECK_EQ(outbuf[5],10000+5);
+    YAZ_CHECK_EQ(sz,11-5);
+
+    yaz_nfa_destroy(n);
+}
+
+
 int main(int argc, char **argv)
 {
     YAZ_CHECK_INIT(argc, argv);
     nmem_init ();
-    construction_test();
+    construction_test(); 
+    converter_test();
     nmem_exit ();
     YAZ_CHECK_TERM;
 }