X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=test%2Fnfatest1.c;h=7ae8b2921947cfa72307b167cee2b81d8eafc9a4;hp=2b730eb98127fabe5d659dbfaa2922be15a37d67;hb=440f23de23b0c2bce38451617cd69eb106b5c2df;hpb=76b209145568a179bb21a8d43db003ffe605b6d5 diff --git a/test/nfatest1.c b/test/nfatest1.c index 2b730eb..7ae8b29 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.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; }