X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Fkmp-test.c;h=e245fcff0de8e8f9a184cee6aef7e5242955c5e9;hb=80d455e017b8c4fc1f553e8ea8f13b182447644c;hp=63a5974efa65f9119f75ee962eaf67131dbc36e8;hpb=c035448d309f41c90cabe27cc6f28f758e7e024d;p=libucw.git diff --git a/lib/kmp-test.c b/lib/kmp-test.c index 63a5974e..e245fcff 100644 --- a/lib/kmp-test.c +++ b/lib/kmp-test.c @@ -16,23 +16,19 @@ /* TEST1 - multiple searches */ -#define KMP_PREFIX(x) GLUE_(kmp1,x) +#define KMP_PREFIX(x) kmp1_##x #define KMP_WANT_CLEANUP #include "lib/kmp.h" -#define KMPS_PREFIX(x) GLUE_(kmp1s1,x) -#define KMPS_KMP_PREFIX(x) GLUE_(kmp1,x) +#define KMPS_PREFIX(x) kmp1s1_##x +#define KMPS_KMP_PREFIX(x) kmp1_##x #define KMPS_WANT_BEST -#define KMPS_T uns -#define KMPS_EXIT(kmp,src,s) do{ return s.best->len; }while(0) +#define KMPS_EXIT(kmp,src,s) TRACE("Best match has %d characters", s->best->len) #include "lib/kmp-search.h" -#define KMPS_PREFIX(x) GLUE_(kmp1s2,x) -#define KMPS_KMP_PREFIX(x) GLUE_(kmp1,x) -#define KMPS_EXTRA_VAR uns -#define KMPS_INIT(kmp,src,s) do{ s.v = 0; }while(0) -#define KMPS_T uns -#define KMPS_FOUND(kmp,src,s) do{ s.v++; }while(0) -#define KMPS_EXIT(kmp,src,s) do{ return s.v; }while(0) -#define KMPS_WANT_BEST +#define KMPS_PREFIX(x) kmp1s2_##x +#define KMPS_KMP_PREFIX(x) kmp1_##x +#define KMPS_VARS uns count; +#define KMPS_INIT(kmp,src,s) s->u.count = 0 +#define KMPS_FOUND(kmp,src,s) s->u.count++ #include "lib/kmp-search.h" static void @@ -45,35 +41,34 @@ test1(void) kmp1_add(&kmp, "hoj"); kmp1_add(&kmp, "aho"); kmp1_build(&kmp); - UNUSED uns best = kmp1s1_search(&kmp, "asjlahslhalahosjkjhojsas"); - TRACE("Best match has %d characters", best); - ASSERT(best == 3); - UNUSED uns count = kmp1s2_search(&kmp, "asjlahslhalahojsjkjhojsas"); - ASSERT(count == 4); + struct kmp1s1_search s1; + kmp1s1_search(&kmp, &s1, "asjlahslhalahosjkjhojsas"); + ASSERT(s1.best->len == 3); + struct kmp1s2_search s2; + kmp1s2_search(&kmp, &s2, "asjlahslhalahojsjkjhojsas"); + ASSERT(s2.u.count == 4); kmp1_cleanup(&kmp); } /* TEST2 - various tracing */ -#define KMP_PREFIX(x) GLUE_(kmp2,x) +#define KMP_PREFIX(x) kmp2_##x #define KMP_USE_UTF8 #define KMP_TOLOWER #define KMP_ONLYALPHA #define KMP_STATE_VARS byte *str; uns id; #define KMP_ADD_EXTRA_ARGS uns id -#define KMP_ADD_EXTRA_VAR byte * -#define KMP_ADD_INIT(kmp,src,v) do{ v = src; }while(0) -#define KMP_ADD_NEW(kmp,src,v,s) do{ TRACE("Inserting string %s with id %d", v, id); \ - s->u.str = v; s->u.id = id; }while(0) -#define KMP_ADD_DUP(kmp,src,v,s) do{ TRACE("String %s already inserted", v); }while(0) +#define KMP_VARS byte *start; +#define KMP_ADD_INIT(kmp,src) kmp->u.start = src +#define KMP_ADD_NEW(kmp,src,s) do{ TRACE("Inserting string %s with id %d", kmp->u.start, id); \ + s->u.str = kmp->u.start; s->u.id = id; }while(0) +#define KMP_ADD_DUP(kmp,src,s) TRACE("String %s already inserted", kmp->u.start) #define KMP_WANT_CLEANUP #define KMP_WANT_SEARCH #define KMPS_ADD_CONTROLS #define KMPS_MERGE_CONTROLS -#define KMPS_WANT_BEST -#define KMPS_FOUND(kmp,src,s) do{ TRACE("String %s with id %d found", s.out->u.str, s.out->u.id); }while(0) -#define KMPS_STEP(kmp,src,s) do{ TRACE("Got to state %p after reading %d", s.s, s.c); }while(0) -#define KMPS_EXIT(kmp,src,s) do{ if (s.best->len) TRACE("Best match is %s", s.best->u.str); } while(0) +#define KMPS_FOUND(kmp,src,s) TRACE("String %s with id %d found", s->out->u.str, s->out->u.id) +#define KMPS_STEP(kmp,src,s) TRACE("Got to state %p after reading %d", s->s, s->c) #include "lib/kmp.h" static void @@ -90,23 +85,23 @@ test2(void) kmp2_add(&kmp, "aba", 5); kmp2_add(&kmp, "pěl", 5); kmp2_build(&kmp); - kmp2_search(&kmp, "Šíleně žluťoučký kůň úpěl ďábelské ódy labababaks sdahojdhsaladsjhla"); + kmp2_run(&kmp, "Šíleně žluťoučký kůň úpěl ďábelské ódy labababaks sdahojdhsaladsjhla"); kmp2_cleanup(&kmp); } /* TEST3 - random tests */ -#define KMP_PREFIX(x) GLUE_(kmp3,x) +#define KMP_PREFIX(x) kmp3_##x #define KMP_STATE_VARS uns index; #define KMP_ADD_EXTRA_ARGS uns index -#define KMP_ADD_EXTRA_VAR byte * -#define KMP_ADD_INIT(kmp,src,v) do{ v = src; }while(0) -#define KMP_ADD_NEW(kmp,src,v,s) do{ s->u.index = index; }while(0) -#define KMP_ADD_DUP(kmp,src,v,s) do{ *v = 0; }while(0) +#define KMP_VARS byte *start; +#define KMP_ADD_INIT(kmp,src) kmp->u.start = src +#define KMP_ADD_NEW(kmp,src,s) s->u.index = index +#define KMP_ADD_DUP(kmp,src,s) *(kmp->u.start) = 0 #define KMP_WANT_CLEANUP #define KMP_WANT_SEARCH -#define KMPS_EXTRA_ARGS uns *cnt, uns *sum -#define KMPS_FOUND(kmp,src,s) do{ ASSERT(cnt[s.out->u.index]); cnt[s.out->u.index]--; sum[0]--; }while(0) +#define KMPS_VARS uns sum, *cnt; +#define KMPS_FOUND(kmp,src,s) do{ ASSERT(s->u.cnt[s->out->u.index]); s->u.cnt[s->out->u.index]--; s->u.sum--; }while(0) #include "lib/kmp.h" static void @@ -138,17 +133,20 @@ test3(void) for (uns j = 0; j < m; j++) b[j] = 'a' + random_max(4); b[m] = 0; - uns cnt[n], sum = 0; + uns cnt[n]; + struct kmp3_search search; + search.u.sum = 0; + search.u.cnt = cnt; for (uns j = 0; j < n; j++) { cnt[j] = 0; if (*s[j]) for (uns k = 0; k < m; k++) if (!strncmp(b + k, s[j], strlen(s[j]))) - cnt[j]++, sum++; + cnt[j]++, search.u.sum++; } - kmp3_search(&kmp, b, cnt, &sum); - ASSERT(sum == 0); + kmp3_search(&kmp, &search, b); + ASSERT(search.u.sum == 0); } kmp3_cleanup(&kmp); } @@ -172,7 +170,7 @@ kmp4_hash(struct kmp4_struct *kmp UNUSED, struct kmp4_state *s, byte *c) return (c ? (*c << 16) : 0) + (uns)(addr_int_t)s; } -#define KMP_PREFIX(x) GLUE_(kmp4,x) +#define KMP_PREFIX(x) kmp4_##x #define KMP_CHAR byte * #define KMP_CONTROL_CHAR NULL #define KMP_GET_CHAR(kmp,src,c) ({ c = src++; !!*c; }) @@ -180,7 +178,7 @@ kmp4_hash(struct kmp4_struct *kmp UNUSED, struct kmp4_state *s, byte *c) #define KMP_GIVE_EQ #define KMP_WANT_CLEANUP #define KMP_WANT_SEARCH -#define KMPS_FOUND(kmp,src,s) do{ TRACE("found"); }while(0) +#define KMPS_FOUND(kmp,src,s) TRACE("found") #define KMPS_ADD_CONTROLS #define KMPS_MERGE_CONTROLS #include "lib/kmp.h" @@ -193,7 +191,7 @@ test4(void) kmp4_init(&kmp); kmp4_add(&kmp, "ahoj"); kmp4_build(&kmp); - kmp4_search(&kmp, "djdhaskjdahoahaahojojshdaksjahdahojskj"); + kmp4_run(&kmp, "djdhaskjdahoahaahojojshdaksjahdahojskj"); kmp4_cleanup(&kmp); }