X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=test%2Fnfatest1.c;h=c37fc4f12360d959ee0aa924e9664ca39c76d2eb;hp=efafb8d68e69e63d6840320f4f98001a7b206a17;hb=b77f4b5c2b191b83cf3f213faa8b6b263e36fea4;hpb=e26f2eaefc5fae6784beb45a1435a4fbfa25f25c diff --git a/test/nfatest1.c b/test/nfatest1.c index efafb8d..c37fc4f 100644 --- a/test/nfatest1.c +++ b/test/nfatest1.c @@ -1,7 +1,7 @@ /* Copyright (C) 2006, Index Data ApS * See the file LICENSE for details. * - * $Id: nfatest1.c,v 1.1 2006-05-03 09:04:33 heikki Exp $ + * $Id: nfatest1.c,v 1.2 2006-05-03 13:47:35 heikki Exp $ * */ @@ -24,28 +24,47 @@ void test_match(yaz_nfa *n, yaz_nfa_char *buf, int buflen, int expcode, char *expstr) { yaz_nfa_char *c=buf; + yaz_nfa_char *cp1,*cp2; void *resptr=0; - int i; + int i,bi; i=yaz_nfa_match(n,&c,buflen,&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(i,expcode); - YAZ_CHECK_EQ(strcmp(expstr,(char*)resptr),0); + if (i!=1) + YAZ_CHECK_EQ(strcmp(expstr,(char*)resptr),0); + i=0; + bi=0; + while(bi!=2){ + bi=yaz_nfa_get_backref(n,i,&cp1,&cp2); + if (bi==0 && ( cp1 || cp2 ) ) { +#if VERBOSE + printf(" got backref %d of %d chars (%p to %p): '", + i, cp2-cp1+1, cp1, cp2); + while (cp2-cp1 >= 0 ) + printf("%c", *cp1++); + printf("'\n"); +#endif + } + i++; + } } void construction_test() { yaz_nfa* n= yaz_nfa_init(); + yaz_nfa_char *cp, *cp1, *cp2; yaz_nfa_state *s,*s0,*s1,*s2,*s3,*s4,*s5; int i; yaz_nfa_char seq1[]={'p','r','e','f','i','x',0}; yaz_nfa_char seq2[]={'p','r','e','l','i','m',0}; - yaz_nfa_char tst1[]={'c','0'}; - yaz_nfa_char tst2[]={'c','k','0'}; - yaz_nfa_char tst3[]={'c','x','0'}; - yaz_nfa_char tst4[]={'z','k','0'}; - yaz_nfa_char tst5[]={'y','k','k','k','k','k','k','y','0'}; + yaz_nfa_char tst1[]={'c',0}; + yaz_nfa_char tst2[]={'c','k',0}; + yaz_nfa_char tst3[]={'c','x',0}; + yaz_nfa_char tst4[]={'z','k',0}; + 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; YAZ_CHECK(n); @@ -106,20 +125,35 @@ void construction_test() { 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_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); + 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 @@ -130,7 +164,17 @@ void construction_test() { 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+ y"); + test_match(n,tst5,9,YAZ_NFA_SUCCESS,"y k+ d"); + + cp=tst6; + i=yaz_nfa_match(n,&cp,8,&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 ); +#endif yaz_nfa_destroy(n); }