+ if (yaz_test_get_verbosity()>3)
+ printf("backref from %p '%c' to %p '%c' is %d long. sz is now %d\n",
+ cp1, *cp1, cp2, *cp2, cp2-cp1+1, sz );
+ YAZ_CHECK_EQ(i,0);
+ YAZ_CHECK_EQ((int)c1,(int)c2); /* got our pointer back from nfa */
+ 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);
+
+ c3=yaz_nfa_create_range_converter(n,2, 'a', 'A' );
+ for(i=0;i<1024;i++)
+ outbuf[i]=10000+i;
+ outp=outbuf;
+ sz=11;
+ i=yaz_nfa_run_converters(n, c3, &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);
+}
+
+yaz_nfa_char *makebuff(NMEM nmem, char *in) {
+ yaz_nfa_char *buff = nmem_malloc(nmem, strlen(in)*sizeof(yaz_nfa_char));
+ yaz_nfa_char *op=buff;
+ while ( (*op++ = *in++) )
+ ;
+ return buff;
+}
+
+void dumpbuff(char *msg, yaz_nfa_char *start, yaz_nfa_char *end) {
+ if (yaz_test_get_verbosity()>3) {
+ printf("%s\"",msg);
+ while (start!=end)
+ printf("%c",*start++);
+ printf("\"\n");
+ }
+}
+
+void chkbuff( yaz_nfa_char *start, yaz_nfa_char *end, char *exp) {
+ char *orig_exp=exp;
+ while (start!=end)
+ if ( *start++ != *exp++ ) {
+ if (yaz_test_get_verbosity()>3) {
+ start--;
+ exp--;
+ printf ("chkbuff: unexpected conversion '%c' != '%c' \n"
+ "\"%s\"\n", *start, *exp, orig_exp );
+ }
+ YAZ_CHECK(!"conversion differs! ");
+ return;
+ }
+
+}
+
+void high_level_test() {
+ NMEM nmem=nmem_create();
+ yaz_nfa_char from1[] = {'f','o','o','b','a','r'};
+ yaz_nfa_char to1[] = {'f','u','b','a','r'};
+ yaz_nfa_char tospace[] = {' '};
+ yaz_nfa_char todot[] = {'.'};
+ char *fromtext =
+ "It was a Dark and Rainy Night, when alpha and beta "
+ "fixme - FIND better names ?? !! ## - "
+ "went out to fix the foobar "
+ "that was all foo.";
+ char *expected =
+ "IT WAS A DARK AND RAINY NIGHT. WHEN ALPHA AND b "
+ "to-be-fixed-later . FIND BETTER NAMES .. .. .. . "
+ "WENT OUT TO (fix) THE fubar "
+ "THAT WAS ALL FOO.";
+ yaz_nfa_char *from3 = makebuff(nmem,fromtext);
+ yaz_nfa_char *to3 = nmem_malloc(nmem, 1024*sizeof(yaz_nfa_char));
+ yaz_nfa_char *fromp=from3;
+ yaz_nfa_char *top=to3;
+ size_t insize=strlen(fromtext);
+ size_t outsize=1024;
+ size_t prev_insize=0;
+
+ yaz_nfa *n = yaz_nfa_init();
+ int i;
+ i = yaz_nfa_add_string_rule(n, from1, 6, to1, 5);
+ YAZ_CHECK_EQ(i,0);
+ i = yaz_nfa_add_string_rule(n, from1, 6, to1, 5);
+ YAZ_CHECK_EQ(i,YAZ_NFA_ALREADY);
+ i = yaz_nfa_add_ascii_string_rule(n,"beta","b");
+ YAZ_CHECK_EQ(i,0);
+ i = yaz_nfa_add_ascii_string_rule(n,"fixme","to-be-fixed-later");
+ YAZ_CHECK_EQ(i,0);
+ i = yaz_nfa_add_ascii_string_rule(n,"fix","(fix)");
+ YAZ_CHECK_EQ(i,0);
+ i = yaz_nfa_add_char_range_rule(n, 'a','z','A');
+ YAZ_CHECK_EQ(i,0);
+ i = yaz_nfa_add_char_string_rule(n, 0,' ', tospace,1);
+ YAZ_CHECK_EQ(i,0);
+ i = yaz_nfa_add_char_string_rule(n, '!','/', todot,1);